使用opencv打开双目usb摄像头
公司新采用一款usb双目摄像头,公用一根usb线,据说也更便宜一点。但是经过初步测试,发现公司的程序无法打开摄像头。
于是就想着测试一下怎么回事儿。
首先,linux主机Ubuntu18.04下,使用cheese软件打开,发现无法通过xmanager打开,应该是远程软件的问题,于是接通显示器,键盘,再次运行cheese,发现一开始黑屏,但是未提示没有发现摄像头,这就说明,系统检测到了摄像头,但是由于某些原因,无法显示图像,找到了cheese菜单,发现,确实检测到了两个摄像头,另外的设置选项仅有分辨率,于是更改分辨率,发现分辨率大于800*600时,可以显示彩色图像,当分辨率大于1200*某个值时,可以显示红外图像。
这最起码说明了一点,摄像头没问题,只是打开的姿势不对。
在安卓中,使用测试apk发现,可以正常同时打开两个摄像头。
那么,linux下的原因就需要去找一下了。
编译安装opencv4.0.1,写出测试程序:
需要注意的是,当插入usb摄像头时,会在/dev/目录下生成4个设备,但是只有第一个设备文件是可以打卡的,分别是video0和video2。
暂时不明白这个是为什么,不过如果想只产生一个设备文件的话,可以参考之前的修改,重新编译。
demo写好了,那么就需要编译,毫无疑问,肯定要链接opencv的,但是发现那么多的so库文件,手动是不现实的,于是搜索发现可以使用pkg工具,添加编译选项
gcc Test.cpp -o Test `pkg-config --cflags --libs opencv4`
这样,就可以编译通过了,打开摄像头也没有问题,推测公司的代码问题可能出现在opencv版本老旧或者本身就没有调试通过。
前者的可能性较大。
下面尝试在公司的3399开发板上编译opencv并进行上述操作。
发现本地编译会因为flash不够而失败,所以想着交叉编译或者在制作文件系统的时候使用模拟器直接编译后,打包进系统。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char **argv)
{
Mat frame0, segm0;
Mat frame1, segm1;
VideoCapture cap0;
VideoCapture cap1;
if (argc>1)
{
cap0.open(argv[1]);
}
else
{
cap0.open(2);
cap1.open(0);
}
if(!cap0.isOpened() || !cap1.isOpened())
{
std::cerr<<"Can not read video. Try moving video file to sample directory."<<std::endl;
return -1;
}
namedWindow("FG Segmentation", WINDOW_NORMAL);
namedWindow("BG Segmentation", WINDOW_NORMAL);
cap0>>frame0;
cap1>>frame1;
waitKey(30);
for(;;)
{
cap0>>frame0;
cap1>>frame1;
if (frame0.empty() || frame1.empty())
{
break;
}
frame0.copyTo(segm0);
frame1.copyTo(segm1);
imshow("FG Segmentation", segm0);
imshow("BG Segmentation", segm1);
waitKey(30);
// if (waitKey(30)>=0)
// break;
}
return 0;
}