一、问题
使用下列方法调用OpenCV编程调用树莓派摄像头时总是失败,提示调用Grabber的start()时失败。
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacv.*; public class Main {
public static void main(String[] args) throws InterruptedException, FrameGrabber.Exception {
FrameGrabber grabber = new FFmpegFrameGrabber("/dev/video0");
//OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.setImageWidth(640);
grabber.setImageHeight(480);
grabber.start(); //开始获取摄像头数据
OpenCVFrameConverter.ToMat convertToMat = new OpenCVFrameConverter.ToMat();
while (true) {
Frame frame = grabber.grab();
opencv_core.Mat mat = convertToMat.convert(frame);
if (mat.empty()) {
System.out.println("mat is empty.");
break;
} else {
System.out.println("Heith:" + frame.imageHeight + " x Width:" + frame.imageWidth);
Thread.sleep(30);
}
}
grabber.stop();
grabber.close();
grabber.release();
}
}
二、原因
原因在于OpenCV在调用Linux中的摄像头时,没找到/dev/video0这个设备,因此需要添加一个简单的配置来搞定。
三、解决方案
找到下列文件:/etc/modules-load.d/modules.conf
vim /etc/modules-load.d/modules.conf
在末尾添加一行记录:
bcm2835-v4l2
如图:
重启设备!!