讯为iTOP4412开发板ARM-linux 使用OPENCV调用USB摄像头

讯为iTOP4412开发板ARM-linux 使用OPENCV调用USB摄像头

首先要在内核里面确定有添加USB摄像头的驱动,这个在讯为官方文档里面有所以就不展开讲了。
主要问题是如何让opencv能够调用摄像头。
首先将摄像头插入4412开发板里面的HOST接口,如果有多个USB设备,可以使用USB分线器。
注意:我使用OTG口连接USB设备都无法识别(ARM版的Ubuntu)。
注意:热插拔有时候会不灵,所以需要重启一下开发板。

  1. 使用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几)。

  2. 用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之类的)后回车就可以看到是否为想要使用的摄像头。

  3. 在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; // 从摄像头中获取新的一帧

猜你喜欢

转载自blog.csdn.net/chenhuan20123/article/details/79154485