2

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)
Lucas_Santos
  • 4,638
  • 17
  • 71
  • 118
  • [SSCE](http://sscce.org) – keyser Sep 25 '12 at 12:08
  • @Keyser, My question is clear. – Lucas_Santos Sep 25 '12 at 12:14
  • Yes, but that's not what the link is about. – keyser Sep 25 '12 at 12:16
  • `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); }` -> you are not using img at all ... so you are saving a new **blank** instance of BufferedImage – Fildor Sep 25 '12 at 12:16
  • @Fildor this is my `saveJPG` method. How would be my `saveJPG` method ? – Lucas_Santos Sep 25 '12 at 12:18
  • Fildor's saveJPG implementation is correct; yours is not. However, that's only a small issue; you don't appear to be capturing the image correctly. `player.getControl("javax.media.control.FrameGrabbingControl");` What is the purpose of this? I would assume it returns a `FrameGrabbingControl`, and if so, I would assume that it is the FrameGrabbingControl that `fgc` should be, for use with image capturing. – FThompson Sep 25 '12 at 12:55
  • @Vulcan I saw this method to capture image from webcam, googling about it. – Lucas_Santos Sep 25 '12 at 13:09
  • I don't believe you've copied it exactly, because earlier you had your FrameGrabbingControl implementation returning null for a buffer, and now it returns a new Buffer instead. I think this is where the issue lies; the buffer doesn't have a valid configuration because it's not the one issued from the player. – FThompson Sep 25 '12 at 13:12
  • @Vulcan, Just to answer your question `What is the purpose of this?`, I saw in http://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desktop/media/jmf/2.1.1/apidocs/javax/media/control/FrameGrabbingControl.html that the line `player.getControl("javax.media.control.FrameGrabbingControl")`, will get the FrameGrabbingControl, that according to the API, is the interface to grab a still video frame from the video stream. This control can be exported by a Renderer or a Player via the getControl method. – Lucas_Santos Sep 25 '12 at 13:15
  • @Vulcan If I create an instance of `FrameGrabbingControl`, will appears a override anottation in `grabFrame` method, that actually returns null, but I change to return a new Buffer() – Lucas_Santos Sep 25 '12 at 13:18
  • I agree that that is the purpose of it, but I don't believe you are using it correctly, because you don't use the control returned by `player.getControl("javax.media.control.FrameGrabbingControl")`. Trying setting `fgc = // ^...`. – FThompson Sep 25 '12 at 13:19
  • @Vulcan I tryied put this `FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl"); buf = fgc.grabFrame();` but I got error of `NullPointerException` in the `buf = fgc.grabFrame();` – Lucas_Santos Sep 25 '12 at 13:37
  • Something very similar to this http://www.cin.ufpe.br/~bemaf/arquivos/prp/Capturing.txt – Lucas_Santos Sep 25 '12 at 13:39
  • I found a good sample here http://stackoverflow.com/questions/1078689/how-to-take-single-snapshots-from-a-webcam – Lucas_Santos Sep 25 '12 at 13:54
  • Seems like your `player` is returning `null` when you attempt to get a control from it. Try out that other sample. – FThompson Sep 25 '12 at 14:29
  • @Vulcan For me doesn't matter the way that I'll get this image, I saw something using JMF, Myron, JavaCV. For me, can be anyone. – Lucas_Santos Sep 25 '12 at 14:44
  • Debugging my application, I discover something strange. In this two lines `player = Manager.createRealizedPlayer(cdi.getLocator());` and `player.start();` The `cdi.getLocator()` get `javasound://44100`. Why JavaSound? – Lucas_Santos Sep 25 '12 at 15:18
  • I updated my question with my `ActionListener` – Lucas_Santos Sep 25 '12 at 15:23

2 Answers2

0

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); 
}
Fildor
  • 14,510
  • 4
  • 35
  • 67
0

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.
#
Lucas_Santos
  • 4,638
  • 17
  • 71
  • 118