摄像头"/>
java链接网络摄像头
我已经用Java编写了代码来访问网络摄像头并保存图像...
我收到以下异常:
线程"主"中的异常java.lang.NullPointerException
在SwingCapture。(SwingCapture.java:40)
在SwingCapture.main(SwingCapture.java:66)
如何删除此例外。
这是代码:
import javax.swing.*;
导入javax.swing.event。
导入java.io .;
导入javax.media。
导入javax.media.format。
导入javax.media.util .;
导入javax.media.control .;
导入javax.media.protocol。
导入java.util .;
导入java.awt .;
导入java.awt.image。
导入java.awt.event。
导入com.sun.image.codec.jpeg .;
公共类SwingCapture扩展Panel实现ActionListener
{
public static Player player = null;
公共CaptureDeviceInfo di = null;
public MediaLocator ml = null;
公共JButton捕获= null;
公共缓冲区buf = null;
公开图片img = null;
public VideoFormat vf = null;
public BufferToImage btoi = null;
public ImagePanel imgpanel = null;
公共SwingCapture()
{
setLayout(new BorderLayout());
setSize(320,550);
imgpanel = new ImagePanel();
capture = new JButton("Capture");
capture.addActionListener(this);
String str1 ="vfw:iNTEX IT-308 WC:0";
String str2 ="vfw:Microsoft WDM Image Capture (Win32):0";
di = CaptureDeviceManager.getDevice(str2);
ml = di.getLocator();
try
{
player = Manager.createRealizedPlayer(ml);
player.start();
Component comp;
if ((comp = player.getVisualComponent()) != null)
{
add(comp,BorderLayout.NORTH);
}
add(capture,BorderLayout.CENTER);
add(imgpanel,BorderLayout.SOUTH);
}
catch (Exception e)
{
e.printStackTrace();
}
}
公共静态void main(String [] args)
{
框架f =新框架(" SwingCapture");
SwingCapture cf =新的SwingCapture();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
playerclose();
System.exit(0);}});
f.add("Center",cf);
f.pack();
f.setSize(new Dimension(320,550));
f.setVisible(true);
}
公共静态void playerclose()
{
player.close();
player.deallocate();
}
公共无效actionPerformed(ActionEvent e)
{
JComponent c =(JComponent)e.getSource();
if (c == capture)
{
// Grab a frame
FrameGrabbingControl fgc = (FrameGrabbingControl)
player.getControl("javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame();
// Convert it to an image
btoi = new BufferToImage((VideoFormat)buf.getFormat());
img = btoi.createImage(buf);
// show the image
imgpanel.setImage(img);
// save image
saveJPG(img,"\test.jpg");
}
}
ImagePanel类扩展Panel
{
public Image myimg = null;
public ImagePanel()
{
setLayout(null);
setSize(320,240);
}
public void setImage(Image img)
{
this.myimg = img;
repaint();
}
public void paint(Graphics g)
{
if (myimg != null)
{
g.drawImage(myimg, 0, 0, this);
}
}
}
公共静态无效saveJPG(Image img,String s)
{
BufferedImage bi =新的BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bi.createGraphics();
g2.drawImage(img,null,null);
FileOutputStream out = null;
try
{
out = new FileOutputStream(s);
}
catch (java.io.FileNotFoundException io)
{
System.out.println("File Not Found");
}
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(0.5f,false);
encoder.setJPEGEncodeParam(param);
try
{
encoder.encode(bi);
out.close();
}
catch (java.io.IOException io)
{
System.out.println("IOException");
}
}
}
因此,这就是ml = di.getLocator();行,其后是di = CaptureDeviceManager.getDevice(str2);。 我猜CaptureDeviceManager.getDevice返回了null,可能是由于其API文档中列出的原因。
字符串str2 =" vfw:Microsoft WDM图像捕获(Win32):0"; 这是用于MS Windows的操作系统,我正在使用Ubuntu Linux。.我认为必须在Linux中替换此行。
我有ENTER Web Camera Model No:E-1.3MPIR,CaptureDeviceManager.getDevice()的参数应该是什么
如果大多数情况下使用内置网络摄像头,它将显示错误。 您可以尝试使用外部网络摄像头。
您的代码有些混乱,但是您是否确定要指定Frame具有borderlayout设置? 我已经经历过很多次了。 尝试明确声明this.Layout = new BorderLayout();。 如果问题仍然存在,请告诉我,请尝试提供帮助。
实际上,CaptureDeviceManager.getDevice返回null,这就是发生此异常的原因。 我不明白为什么会给这个例外。 我正在Linux平台上的Eclipse中执行此程序。 你能帮我吗?
更多推荐
java链接网络摄像头
发布评论