简体   繁体   中英

When I try to capture a image from my webcam, its take a all black image

I've downloaded a java project in which interacts with my webcam. I'm trying to add the functionality to take pictures through the webcam, or just capture the current image and save it in my C: directory

I created a button called Capture (startC) and did an 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 method

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

The problem is that when I click Capture, is simply saving a screen all black, and that's not what the webcam is focusing.

Can someone help?

@UPDATE

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

It has been a while but try:

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

Searching and googling it, I found a solution to my problem.

SOLUTION

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

The goal has been reached, and the image was saved. After that, with the image saved in my server, occurs a message in my Console tab.

#
# 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.
#

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM