当我尝试从我的网络摄像头捕获图像时,它采用全黑图像

时间:2012-09-25 12:06:06

标签: java

我已下载了java project,其中与我的网络摄像头进行了互动。我正在尝试添加通过网络摄像头拍照的功能,或者只是捕获当前图像并将其保存在我的C:目录中

我创建了一个名为Capture(startC)的按钮并执行了一个ActionListener

的ActionListener

startC.addActionListener(new ActionListener()
        {           
            @Override
            public void actionPerformed(ActionEvent e)
            {               
                  // Grab a frame                 
                 FrameGrabbingControl fgc = new FrameGrabbingControl() {

                        @Override
                        public Component getControlComponent() {
                            // TODO Auto-generated method stub
                            return null;
                        }                       

                        @Override
                        public Buffer grabFrame() {
                            // return null;
                            return new Buffer();
                        }
                    };  
                  player.getControl("javax.media.control.FrameGrabbingControl");    
                  buf = fgc.grabFrame();                  

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

                  // show the image 
                  //imgpanel.setImage(img);       

                  // save image 
                  try {
                    saveJPG(img,"c:\\test.jpg");                    
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }   
            }
        });

UPDATED ActionListener

startC.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Vector devices = CaptureDeviceManager.getDeviceList(null);
                CaptureDeviceInfo cdi = null;
                for (Iterator i = devices.iterator(); i.hasNext();) {
                    cdi = (CaptureDeviceInfo) i.next();
                    /*
                     * Get the first Video For Windows (VFW) capture device. Use
                     * the JMF registry tool in the bin directory of the JMF
                     * distribution to detect available capture devices on your
                     * computer.
                     */
                    if (cdi.getName().startsWith("vfw:"))
                        break;
                }

                try {
                    player = Manager.createRealizedPlayer(cdi.getLocator());
                    player.start();
                } catch (NoPlayerException e2) {
                    e2.printStackTrace();
                } catch (CannotRealizeException e3) {
                    e3.printStackTrace();
                } catch (IOException e4) {
                    e4.printStackTrace();
                }

                // start the Timer with 3s intervals
                new Timer(3000, this).start();

                // Grab a frame from the capture device
                FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
                buf = fgc.grabFrame();
                BufferToImage btoi = new BufferToImage((VideoFormat) buf
                        .getFormat());
                img = btoi.createImage(buf);
});

SaveJPG方法

      public static void saveJPG(Image img, String s) throws IOException    
      {       
        BufferedImage bi = new BufferedImage(640, 480, BufferedImage.TYPE_INT_RGB);
        File outputfile = new File("C:\\saved.jpg");
        ImageIO.write(bi, "png", outputfile);
}

问题在于,当我点击“捕获”时,只是将屏幕全部保存为黑色,这不是网络摄像头所关注的内容。

有人可以帮忙吗?

@UPDATE

第520行= buf = fgc.grabFrame();

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
    at com.colorfulwolf.webcamapplet.WebcamApplet$6.actionPerformed(WebcamApplet.java:520)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

2 个答案:

答案 0 :(得分:0)

已经有一段时间但是请尝试:

public static void saveJPG(Image img, String s) throws IOException { 
    File outputfile = new File("C:\\saved.jpg"); 
    ImageIO.write(img, "jpg", outputfile); 
}

答案 1 :(得分:0)

搜索并使用Google搜索,我找到了解决问题的方法。

<强>解

startC.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                OpenCVWebCam webCam = (OpenCVWebCam) cam;
                try {
                    webCam.start();
                } catch (Exception e3) {                    
                    e3.printStackTrace();
                }

                OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
                try {
                    grabber.start();
                } catch (Exception e3) {            
                    e3.printStackTrace();
                }

                try {
                    IplImage frame = grabber.grab();
                    BufferedImage out = frame.getBufferedImage();   
                    File outputfile = new File("c:\\saved.png");
                    ImageIO.write(out, "png", outputfile);
                } catch (Exception e2) {                    
                    e2.printStackTrace();
                }
}
});

已达到目标,图像已保存。之后,保存在我的服务器中的图像会在我的控制台选项卡中显示一条消息。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x776a224d, pid=5864, tid=5576
#
# JRE version: 7.0_05-b05
# Java VM: Java HotSpot(TM) Client VM (23.1-b03 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [ntdll.dll+0x3224d]  EtwEventEnabled+0x1ca
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\lucas\workspace\WebcamApplet\bin\hs_err_pid5864.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#