захватить изображение с веб-камеры - PullRequest
0 голосов
/ 05 декабря 2009

Я использую jmf для захвата изображения с веб-камеры. Я подключил веб-камеру, и она работает нормально. Я использую следующий код для захвата изображения с веб-камеры: -

    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGEncodeParam;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.Vector;
    import javax.media.Buffer;
    import javax.media.CannotRealizeException;
    import javax.media.CaptureDeviceInfo;
    import javax.media.CaptureDeviceManager;
    import javax.media.Manager;
    import javax.media.NoPlayerException;
    import javax.media.Player;
    import javax.media.control.FrameGrabbingControl;
    import javax.media.format.VideoFormat;
    import javax.media.util.BufferToImage;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;

public class FrameGrab extends JPanel implements ActionListener {
    private Player player = null;

    private BufferedImage buffImg = null;

    private Timer timer;

    private FrameGrabbingControl frameGrabber;

    public FrameGrab() {
        // Create capture device
        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;
        }
        // start the Timer with 3s intervals
        new Timer(2000, this).start();
        try {
            player = Manager.createRealizedPlayer(cdi.getLocator());
            player.start();
        } catch (NoPlayerException e) {
            e.printStackTrace();
        } catch (CannotRealizeException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // Grab a frame from the capture device
        frameGrabber = (FrameGrabbingControl) player
                .getControl("javax.media.control.FrameGrabbingControl");
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (buffImg != null) {
            g.drawImage(buffImg, 0, 0, this);
        }
    }

        private void writeImagetoFile(BufferedImage img,String aFileName,int width,int height,double quality)
        {
            try{
            FileOutputStream fos = new FileOutputStream(aFileName);
            JPEGImageEncoder encoder2 =JPEGCodec.createJPEGEncoder(fos);
            JPEGEncodeParam param2 = encoder2.getDefaultJPEGEncodeParam(img);
            param2.setQuality((float) quality, true);
            encoder2.encode(img,param2);
            fos.close();
            }catch(Exception ex){}
        }
    private void grab() {
            Buffer buf=null;

            try{
                Thread.sleep(2000);
        buf = frameGrabber.grabFrame();
            }catch(Exception ex){ex.printStackTrace();}
        // Convert frame to an buffered image so it can be processed and saved
        Image img = (new BufferToImage((VideoFormat) buf.getFormat())
                .createImage(buf));
        buffImg = new BufferedImage(img.getWidth(this), img.getHeight(this),
                BufferedImage.TYPE_INT_RGB);
                writeImagetoFile(buffImg,"c:/image.jpg",100,100,100);
        Graphics2D g = buffImg.createGraphics();
        g.drawImage(img, null, null);
        g.setColor(Color.darkGray);
        g.setFont(new Font("Tahoma", Font.PLAIN, 12)
                .deriveFont(AffineTransform.getRotateInstance(1.57)));
        g.drawString((new Date()).toString(), 5, 5);
    }

    public static void createAndShowGui() {
        JFrame frame = new JFrame("Frame Grabber");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new FrameGrab());
        frame.setSize(328, 270);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }

    /*
     * (non-Javadoc)
     *
     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
     */
    public void actionPerformed(ActionEvent e) {
        grab();
        repaint();
    }
}

Запустив эту программу, я получаю следующее исключение:

java.lang.NullPointerException
        at writepdffile.FrameGrab.grab(FrameGrab.java:99)
        at writepdffile.FrameGrab.actionPerformed(FrameGrab.java:137)
        at javax.swing.Timer.fireActionPerformed(Timer.java:271)
        at javax.swing.Timer$DoPostEvent.run(Timer.java:201)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at writepdffile.FrameGrab.grab(FrameGrab.java:102)
        at writepdffile.FrameGrab.actionPerformed(FrameGrab.java:137)
        at javax.swing.Timer.fireActionPerformed(Timer.java:271)
        at javax.swing.Timer$DoPostEvent.run(Timer.java:201)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Я не понимаю, почему он генерирует такое исключение ... Пожалуйста, помогите мне, я новичок в jfm.

Заранее спасибо

1 Ответ

1 голос
/ 08 марта 2012

хорошо, если вы столкнулись с проблемой NullPointerException, это происходит, когда вы не настроили через реестр jmf. Когда вы устанавливаете jmf для Windows, появляется jmf-приложение, связанное с реестром. Вы должны открыть это, выбрать настройки и выбрать устройства захвата. Если ваше устройство запускается с vfw (видео для Windows), например vfw:Microsoft Image Capture(win 32):0, то передайте его, это последний шаг.

Я думаю, что вы уже установили classpath в папку lib jmf, содержащую jmf.jar и другие файлы jar. Тогда вы можете нормально запустить программу jmf. Дайте мне знать, если у вас возникнут проблемы

...