使用OpenCV和Java的MatchTemplate示例中出现空指针异常
这个问题从头到尾继续。我可以从下载com.larmor.opencv.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
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