我试图学习如何使用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();
}
});
}
}
我的opencv / build / java / x64 / bin
我的系统规格: Windows 7终极64位 英特尔酷睿i7-620m 2.66ghz处理器速度 4GB内存
我正在使用Opencv 2.4.9和JavaCV 1.1
可能出现什么问题?我做得不对劲?或者它是JavaCV 1.1中可能存在的错误?