无法从相机读取数据,这是JavaCV 1.1中可能存在的错误

时间:2016-05-02 11:44:36

标签: java opencv javacv

我试图学习如何使用javacv通过电脑摄像头捕捉视频。我有这个webcamtest文件

import java.awt.*;

import java.awt.event.*;

import java.awt.image.*;

import javax.swing.*;

import org.bytedeco.javacv.*;

import org.bytedeco.javacv.Frame;

import static org.bytedeco.javacpp.opencv_core.*;

import static org.bytedeco.javacpp.opencv_imgproc.*;


public class WebcamTest extends JFrame{

    protected double scale = 1.0;   
    protected boolean mirror = true;                
    protected int width, height;                
    protected BufferedImage image;                  
    private Grabby grabby;                          
    private JComponent canvas;                      
    private FrameGrabber grabber;           

    public WebcamTest() {
        super("Webcam");

        // Create our graphics-handling component.
        canvas = new JComponent() {
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(image, 0, 0, null);
            }
        };

        // Set up webcam
        grabber = new OpenCVFrameGrabber(0); 
        // Repeated attempts following discussion on javacv forum, fall 2013 (might be fixed internally in future versions)
        final int MAX_ATTEMPTS = 3;
        int attempt = 0;
        System.out.print("Initializing camera");
        while (attempt < MAX_ATTEMPTS) {
            System.out.print('.');
            attempt++;
            try {
                grabber.start();
                break;
            } 
            catch (Exception e) { e.printStackTrace(); }
        }
        if (attempt == MAX_ATTEMPTS) {
            System.err.println("Failed after "+attempt+" attempts");
            return;
        }
        System.out.println("done");

        // Get size and figure out scaling
        width = grabber.getImageWidth();
        height = grabber.getImageHeight();
        System.out.println("Native camera size "+width+"*"+height);
        if (scale != 1) {
            width = (int)(width*scale);
            height = (int)(height*scale);
            System.out.println("Scaled to "+width+"*"+height);
        }

        // Set the size as determined by the grabber.
        setSize(width, height);     

        // Boilerplate to finish initializing the GUI.
        canvas.setPreferredSize(new Dimension(getWidth(), getHeight()));
        getContentPane().add(canvas);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);

        // Spawn a separate thread to handle grabbing.
        grabby = new Grabby();
        grabby.execute();
    }

    /**
     * Handles grabbing an image from the webcam (following JavaCV examples)
     * storing it in image, and telling the canvas to repaint itself.
     */
    private class Grabby extends SwingWorker<Void, Void> {
        protected Void doInBackground() throws Exception {
            OpenCVFrameConverter.ToIplImage grabberConverter = new OpenCVFrameConverter.ToIplImage();
            Java2DFrameConverter paintConverter = new Java2DFrameConverter();
            while (!isCancelled()) {
                IplImage grabbed = null;
                while (grabbed == null) {
                    try {
                        grabbed = grabberConverter.convert(grabber.grab());
                    }   
                    catch (Exception e) {
                        System.err.println("failed grab");
                        Thread.sleep(100); // wait a bit
                    }
                }
                if (mirror) {
                    cvFlip(grabbed, grabbed, 1);
                }
                if (scale != 1) {
                    IplImage resized = IplImage.create(width, height, grabbed.depth(), grabbed.nChannels());
                    cvResize(grabbed, resized);
                    grabbed = resized;
                }
                Frame frame = grabberConverter.convert(grabbed);
                image = paintConverter.getBufferedImage(frame);
                canvas.repaint();
                Thread.sleep(1000); // slow it down
            }
            // All done; clean up
            grabber.stop();
            grabber.release();
            grabber = null;
            return null;
        }
    }

    /**
     * Main method for the webcam test application
     * 
     * @param args  ignored
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new WebcamTest();
            }
        });
    }
}

我已经配置了我的路径: Windows system path environment

我有我的netbeans环境,我导入了必要的依赖项 netbeans environment

我的opencv / build / java / x64 / bin opencv bin

我的系统规格: Windows 7终极64位 英特尔酷睿i7-620m 2.66ghz处理器速度 4GB内存

我正在使用Opencv 2.4.9和JavaCV 1.1

运行时我得到了这个输出 blank screen

可能出现什么问题?我做得不对劲?或者它是JavaCV 1.1中可能存在的错误?

0 个答案:

没有答案