java - 当我尝试从我的网络摄像头捕捉图像时,它拍摄的是全黑图像

标签 java

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

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

Action 监听器

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();
                }   
            }
        });

更新的 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);
});

保存JPG方法

      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);
}

问题是,当我单击“捕捉”时,只是将屏幕保存为全黑,而这不是网络摄像头聚焦的内容。

有人可以帮忙吗?

@更新

第 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)

最佳答案

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

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

关于java - 当我尝试从我的网络摄像头捕捉图像时,它拍摄的是全黑图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12582630/

相关文章:

java - 如何在 Java 中的 ArrayList 末尾追加元素?

netbeans - 如何在 Linaro 13.01 ubuntu tty1 中安装 Oracle JDK 7 和 Netbeans IDE?

java - 如何使用apache-poi 3.9修改pptx文件中表格的单元格值?

java - 带指数的字符串计算

java - JSF2.0(Primefaces)中带有filteroptions方法的SelectOneMenu

java - 为什么 Java 中的记录器很少有 System.out.println 有的 .toString()?

java - Play Framework 调用 Controller 导致打开文件过多错误

java - 将解析哪个 View ,来自 spring 文档的代码

java - 在 Eclipse 中为 Liberty 生成的 .ear.xml 是错误的

java - 递归检查是否可能将数组拆分为满足特定条件的两个数组