讯为iTOP4412开发板ARM-linux 使用OPENCV调用USB摄像头
首先要在内核里面确定有添加USB摄像头的驱动,这个在讯为官方文档里面有所以就不展开讲了。
主要问题是如何让opencv能够调用摄像头。
首先将摄像头插入4412开发板里面的HOST接口,如果有多个USB设备,可以使用USB分线器。
注意:我使用OTG口连接USB设备都无法识别(ARM版的Ubuntu)。
注意:热插拔有时候会不灵,所以需要重启一下开发板。
使用
dmesg
命令来识别出USB设备名:dmesg | grep video
root@iTOP4412-ubuntu-desktop:/home/linaro/Desktop# dmesg | grep video [ 3.941830] Linux video capture interface: v2.00 [ 5.180789] s5p-mixer s5p-mixer: registered layer mxr0_video0 as /dev/video20 [ 5.187891] fb5: registered frame buffer emulation for /dev/video20 [ 5.194121] s5p-mixer s5p-mixer: registered layer mxr0_graph0 as /dev/video16 [ 5.201257] fb6: registered frame buffer emulation for /dev/video16 [ 5.207492] s5p-mixer s5p-mixer: registered layer mxr0_graph1 as /dev/video17 [ 5.214622] fb7: registered frame buffer emulation for /dev/video17 [ 5.252875] s5p-jpeg s5p-jpeg: JPEG driver is registered to /dev/video12 [ 5.259465] s5p-jpeg s5p-jpeg: JPEG driver is registered to /dev/video11 [ 5.304124] usbcore: registered new interface driver uvcvideo [ 8.467898] uvcvideo 1-3.3.4:1.0: usb_probe_interface [ 8.467992] uvcvideo 1-3.3.4:1.0: usb_probe_interface - got id [ 8.468185] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (1908:2310)
在终端使用
dmesg | grep video
命令,可以看到4412能够成功识别出UVC摄像头,但是这个时候我们还不能看出摄像头被放在哪个位置(即/dev/video几)。用opencv的一个程序来手动判断摄像头在哪个位置
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <stdio.h> using namespace cv; int main() { int camera; scanf("%d",&camera); printf("opening camera:%d\n",camera); VideoCapture cap(camera); printf("success open camera:%d\n",camera); if(!cap.isOpened()) { printf("Do not open!\n"); return -1; } Mat frame; Mat edges; bool stop = false; while(!stop) { cap>>frame; cvtColor(frame, edges, CV_BGR2GRAY); GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); Canny(edges, edges, 0, 30, 3); imshow("当前视频",edges); if(waitKey(30) >=0) stop = true; } return 0; }
编译程序(交叉编译opencv可以看我另一篇文章):
gcc shexiantou.cpp -o shexiantou -lpthread -lrt `pkg-config --libs --cflags opencv`
调整使用权限:chmod 777 sheixantou
在4412里面的Ubuntu里的终端里面运行(记得先运行cd命令到程序目录):./shexiantou
运行后会要求输入video的数字,输入想要测试的数字(即/dev/video0之类的)后回车就可以看到是否为想要使用的摄像头。在OPENCV里面调用摄像头
在上面的程序可以看到,opencv可以调用特定的摄像头,但是需要特定的语句即
VideoCapture cap(camera);//camera是一个int型变量,也可以直接用数字
。
注意:cvCaptureFromCAM(0)
是无法调用特定的摄像头的,只有默认0和外置-1两种选择。
从原本的CvCapture* pCapture = cvCaptureFromCAM(0);
代码转变为VideoCapture
之后,一些语句也需要进行相应的变化,不然编译会报错。
例如原先的Mat frame; // 输入视频帧序列 IplImage* temp= cvQueryFrame( pCapture ); frame = cvarrToMat(temp) ;// 从摄像头中获取新的一帧
要变为
Mat frame; // 输入视频帧序列 cap >> frame; // 从摄像头中获取新的一帧