Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenCV和Java的MatchTemplate示例中出现空指针异常_Java_Opencv_Nullpointerexception_Template Matching - Fatal编程技术网

使用OpenCV和Java的MatchTemplate示例中出现空指针异常

使用OpenCV和Java的MatchTemplate示例中出现空指针异常,java,opencv,nullpointerexception,template-matching,Java,Opencv,Nullpointerexception,Template Matching,这个问题从头到尾继续。我可以从下载com.larmor.opencv.MatchTemplate库(以防将来有人需要该链接) 现在来谈谈我的问题 当我运行代码时,我得到空指针异常。 附加错误消息以供参考。 此外,这是完全相同的项目下载,所以我没有提到的问题的代码 有人能帮我解决这些错误吗 编辑 我已经提供了上面代码的链接。所以我没有把整个代码粘贴到这里。 不管怎样,代码如下: package templatematching; import java.awt.BorderLayout; i

这个问题从头到尾继续。我可以从下载com.larmor.opencv.MatchTemplate库(以防将来有人需要该链接)

现在来谈谈我的问题

当我运行代码时,我得到空指针异常。 附加错误消息以供参考。 此外,这是完全相同的项目下载,所以我没有提到的问题的代码

有人能帮我解决这些错误吗

编辑

我已经提供了上面代码的链接。所以我没有把整个代码粘贴到这里。 不管怎样,代码如下:

package templatematching;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

import javax.media.Buffer;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.JButton;
import javax.swing.JComponent;

import com.larmor.opencv.MatchTemplate;

/**
 * This example match WebCam Area.
 * <br>
 * The class uses <a href="http://java.sun.com/products/java-media/jmf/" target="_blank">Java Media Framework API (JMF)</a>, 
 * and <a href="http://java.sun.com/javase/6/docs/technotes/guides/imageio/index.html" target="_blank">JAI-Java Image I/O Technology</a>
 * and <a href="http://java.sun.com/products/java-media/jmf/">Java Media Framework API (JMF)</a>
 * (for dowload: <a href="https://jai.dev.java.net/" target="_blank">https://jai.dev.java.net/</a>,
 * <a href="https://jai-imageio.dev.java.net/" target="_blank">https://jai-imageio.dev.java.net/</a> and
 * <a href="http://java.sun.com/products/java-media/jmf/2.1.1/download.html" target="_blank">http://java.sun.com/products/java-media/jmf/2.1.1/download.html</a>).<br>
 * <br>
 * 
 * 1) press button "select area" for stop image
 * 2) using mouse select area to matching (red rectangle)
 * 3) press button "start matching" for play webcam and starting matching (green rectangle)
 *    
 * @author      Pier Paolo Ciarravano Larmor  
 * License:     GNU General Public License   
 * @version     Vers. 0.5 beta (April.2008) 
 */
public class TestMatchWebCamArea extends Panel implements ActionListener,
        MouseListener, MouseMotionListener {

    static Player player = null;
    CaptureDeviceInfo di = null;
    MediaLocator ml = null;
    JButton matchCam = null;
    JButton selectArea = null;
    Component sourceComp = null;
    DoubleBufferPanel dbPanel = null;
    int areaX = 0;
    int areaY = 0;
    int areaWidth = 0;
    int areaHeight = 0;
    int stateButton;
    BufferedImage buffImgTemplate = null;

    public TestMatchWebCamArea() {

        stateButton = 0;

        setLayout(new BorderLayout());
        // setSize(320,240);

        selectArea = new JButton("Select Area");
        selectArea.addActionListener(this);

        matchCam = new JButton("Start Matching");
        matchCam.addActionListener(this);
        matchCam.setEnabled(false);

        // String str1 = "vfw:Logitech USB Video Camera:0";
        String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
        di = CaptureDeviceManager.getDevice(str2);
        ml = di.getLocator();

        try {
            Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, Boolean.TRUE);
            player = Manager.createRealizedPlayer(ml);
            player.start();

            if ((sourceComp = player.getVisualComponent()) != null) {
                sourceComp.addMouseMotionListener(this);
                sourceComp.addMouseListener(this);
                // sourceComp.setBounds (0, 0,
                // sourceComp.getPreferredSize().width,
                // sourceComp.getPreferredSize().height);

                dbPanel = new DoubleBufferPanel();
                dbPanel.setLayout(new BorderLayout());
                dbPanel.add(sourceComp);
                // dbPanel.setBackground(Color.BLUE);
                // dbPanel.setBounds (0, 0, sourceComp.getPreferredSize().width,
                // sourceComp.getPreferredSize().height);

                add(dbPanel, BorderLayout.CENTER);
            }
            add(selectArea, BorderLayout.NORTH);
            add(matchCam, BorderLayout.SOUTH);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        Frame f = new Frame("Test Match WebCam - By Larmor");
        f.setResizable(false);
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                playerclose();
                System.exit(0);
            }
        });

        TestMatchWebCamArea cf = new TestMatchWebCamArea();
        f.add("Center", cf);
        f.pack();
        // f.setSize(new Dimension(320,240));
        f.setVisible(true);

    }

    public static void playerclose() {
        player.close();
        player.deallocate();
    }

    public BufferedImage getPlayerImage() {
        // Grab a frame
        FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = fgc.grabFrame();

        // Convert it to an image
        BufferToImage btoi = new BufferToImage((VideoFormat) buf.getFormat());
        Image img = btoi.createImage(buf);

        // Convert to BufferedImage
        BufferedImage bi = new BufferedImage(sourceComp.getPreferredSize().width, sourceComp.getPreferredSize().height, BufferedImage.TYPE_BYTE_GRAY);
        Graphics2D g = bi.createGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();

        return bi;
    }

    public void actionPerformed(ActionEvent e) {
        JComponent c = (JComponent) e.getSource();

        if (c == selectArea) {
            stateButton = 1;
            player.stop();
            selectArea.setEnabled(false);

        } else if (c == matchCam) {

            // Validate Area
            if ((areaX >= 0) 
                    && (areaY > 0) 
                    && (areaWidth > 0)
                    && (areaHeight > 0)) {
                buffImgTemplate = getPlayerImage().getSubimage(areaX, areaY, areaWidth, areaHeight);
                MatchTemplate.displayBufferedImage(buffImgTemplate, "template");

                stateButton = 2;
                player.start();
                matchCam.setEnabled(false);
                selectArea.setEnabled(true);
            }
        }
    }

    // @Override
    public void mouseClicked(MouseEvent arg0) {
    }

    // @Override
    public void mouseEntered(MouseEvent arg0) {
    }

    // @Override
    public void mouseExited(MouseEvent arg0) {
    }

    // @Override
    public void mouseMoved(MouseEvent arg0) {
    }

    // @Override
    public void mousePressed(MouseEvent arg0) {
        arg0.consume();
        if (stateButton == 1) {
            areaX = arg0.getX();
            areaY = arg0.getY();
            dbPanel.repaint();
        }
    }

    // @Override
    public void mouseReleased(MouseEvent arg0) {
        arg0.consume();
        if (stateButton == 1) {
            areaWidth = arg0.getX() - areaX;
            areaHeight = arg0.getY() - areaY;
            dbPanel.repaint();
            matchCam.setEnabled(true);
        }
    }

    // @Override
    public void mouseDragged(MouseEvent arg0) {
        arg0.consume();
        if (stateButton == 1) {
            areaWidth = arg0.getX() - areaX;
            areaHeight = arg0.getY() - areaY;
            dbPanel.repaint();
        }
    }

    class DoubleBufferPanel extends Panel {
        Image offscreen;

        /**
         * null out the offscreen buffer as part of invalidation
         */
        public void invalidate() {
            super.invalidate();
            offscreen = null;
        }

        /**
         * override update to *not* erase the background before painting
         */
        public void update(Graphics g) {
            paint(g);
        }

        /**
         * paint children into an offscreen buffer, then blast entire image at once.
         */
        public void paint(Graphics g) {

            if (offscreen == null) {
                offscreen = createImage(getSize().width, getSize().height);
            }

            Graphics og = offscreen.getGraphics();
            og.setClip(0, 0, getSize().width, getSize().height);
            super.paint(og);

            if (stateButton == 1) {
                Graphics2D g2 = (Graphics2D) og;
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2.setPaint(Color.red);
                Rectangle2D e = new Rectangle2D.Float(areaX, areaY, areaWidth, areaHeight);
                g2.draw(e);
            } else if (stateButton == 2) {
                // match template
                BufferedImage buffImgSource = getPlayerImage();
                long startTime = System.currentTimeMillis();
                MatchTemplate matchObj = new MatchTemplate(buffImgSource, buffImgTemplate);
                Point matchPoint = matchObj.matchTemplateBestPoint(MatchTemplate.CV_TM_CCOEFF_NORMED);
                long totalTime = System.currentTimeMillis() - startTime;
                System.out.println("totalTime for matching:" + totalTime);

                Graphics2D g2 = (Graphics2D) og;
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2.setPaint(Color.green);
                Rectangle2D e = new Rectangle2D.Float(matchPoint.x, matchPoint.y, areaWidth, areaHeight);
                g2.draw(e);
            }

            g.drawImage(offscreen, 0, 0, null);
            og.dispose();
        }
    }

}
包模板匹配;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Frame;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.Panel;
导入java.awt.Point;
导入java.awt.RenderingHints;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseMotionListener;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入java.awt.geom.Rectangle2D;
导入java.awt.image.buffereImage;
导入javax.media.Buffer;
导入javax.media.CaptureDeviceInfo;
导入javax.media.CaptureDeviceManager;
导入javax.media.Manager;
导入javax.media.MediaLocator;
导入javax.media.Player;
导入javax.media.control.FrameGrabbingControl;
导入javax.media.format.VideoFormat;
导入javax.media.util.BufferToImage;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入com.larmor.opencv.MatchTemplate;
/**
*此示例匹配网络摄像头区域。
*
*该类使用, *及 *及 *(对于固定荷载:, *及 *)。
*
* *1)按下停止图像的“选择区域”按钮 *2)使用鼠标选择区域进行匹配(红色矩形) *3)按“开始匹配”按钮播放网络摄像头并开始匹配(绿色矩形) * *@作者Pier Paolo Ciarravano Larmor *许可证:GNU通用公共许可证 *@version-Vers。0.5测试版(2008年4月) */ 公共类TestMatchWebCamera扩展面板实现ActionListener, MouseListener,MouseMotionListener{ 静态播放器=空; CaptureDeviceInfo di=null; MediaLocator ml=null; JButton matchCam=null; JButton selectArea=null; 组件sourceComp=null; DoubleBufferPanel dbPanel=null; int areaX=0; int areaY=0; int areaWidth=0; 内部区域高度=0; int状态按钮; BuffereImage buffImgTemplate=null; 公共TestMatchWebCamera(){ stateButton=0; setLayout(新的BorderLayout()); //设置大小(320240); selectArea=新的JButton(“选择区域”); 选择Area.addActionListener(此); matchCam=新的JButton(“开始匹配”); matchCam.addActionListener(此); matchCam.setEnabled(false); //String str1=“vfw:Logitech USB摄像机:0”; String str2=“vfw:Microsoft WDM图像捕获(Win32):0”; di=CaptureDeviceManager.getDevice(str2); ml=di.getLocator(); 试一试{ setHint(Manager.u渲染器,Boolean.TRUE); player=Manager.createRealizedPlayer(ml); player.start(); if((sourceComp=player.getVisualComponent())!=null){ sourceComp.addMouseMotionListener(此); sourceComp.addMouseListener(本); //sourceComp.setBounds(0,0, //sourceComp.getPreferredSize()宽度, //sourceComp.getPreferredSize().height); dbPanel=新的DoubleBufferPanel(); setLayout(新的BorderLayout()); dbPanel.add(sourceComp); //dbPanel.setBackground(颜色:蓝色); //dbPanel.setBounds(0,0,sourceComp.getPreferredSize().width, //sourceComp.getPreferredSize().height); 添加(dbPanel,BorderLayout.CENTER); } 添加(选择Area,BorderLayout.NORTH); 添加(matchCam,BorderLayout.SOUTH); }捕获(例外e){ e、 printStackTrace(); } } 公共静态void main(字符串[]args){ 帧f=新帧(“测试匹配网络摄像头-由Larmor制作”); f、 可设置大小(假); f、 addWindowListener(新的WindowAdapter(){ 公共无效窗口关闭(WindowEvent e){ playerclose(); 系统出口(0); } }); TestMatchWebCamera cf=新的TestMatchWebCamera(); f、 添加(“中心”,cf); f、 包装(); //f.设置尺寸(新尺寸(320240)); f、 setVisible(真); } 公共静态void playerclose(){ player.close(); player.deallocate(); } 公共缓冲区映像getPlayerImage(){ //抓住一个框架 FrameGrabbingControl fgc=(FrameGrabbingControl)player.getControl(“javax.media.control.FrameGrabbingControl”); Buffer buf=fgc.grabFrame(); //将其转换为图像 BufferToImage btoi=新的BufferToImage((VideoFormat)buf.getFormat()); Image img=btoi.createImage(buf); //转换为BuffereImage BuffereImage bi=新的BuffereImage(sourceComp.getPreferredSize().width,sourceComp.getPreferredSize().height,BuffereImage.TYPE_BYTE_GRAY); Graphics2D g=bi.createGraphics(); g、 drawImage(img,0,0,null); g、 处置(); 返回bi; } 已执行的公共无效操作(操作事件e){ JComponent c=(JComponent)e.getSource(); if(c==selectArea){ stateButton=1; player.stop(); 选择Area.setEnabled(false); }else if(c==matchCam){ //验证区域 如果((区域X>=0
String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
di = CaptureDeviceManager.getDevice(str2);
ml = di.getLocator(); //NullPointerException