zoukankan      html  css  js  c++  java
  • 使用openCV打开USB摄像头(UVC 小米micro接口)

    之前在AndroidStudio上就用了别人用写的库成功地打开了USB摄像头。

    于是我之后又在PC上尝试了一下,首先去淘宝买了个MICRO母转USB公的转接口,然后在Qt上配置了一下OPENCV后开始尝试。

    然后就坑到了,遂写此文。

    本人使用了2种openCV提供的方法:

        VideoCapture capture;
        capture.open(3);           //open the default camera -1才是默认摄像机,3是我的USBCaemra的
        if (capture.isOpened())
        {
    
            qDebug()<<"camera open!!!";
        }
        Mat edges;
        namedWindow("edges",1);
        for(;;)
        {
            Mat frame; //定义一个Mat变量,用于存储每一帧的图像
            capture>>frame; //读取当前帧
            if (!frame.empty()) //判断当前帧是否捕捉成功 **这步很重要
            {
                imshow("edges", frame); //若当前帧捕捉成功,显示
            }
            else
            {
                qDebug()<<"can not ";
            }
            waitKey(30); //延时30毫秒
    
        }
      IplImage* pFrame = NULL;
               //声明IplImage指针
    
               CvCapture* pCapture = cvCreateCameraCapture(-1);
               //获取摄像头
               //-1为默认摄像头,其他则需要填写地址;
               //函数cvCreateCameraCapture给从摄像头的视频流分配和初始化CvCapture结构。
               //目前在Windows下可使用两种接口:Video for Windows(VFW)
               //和Matrox Imaging Library(MIL);
               //Linux下也有两种接口:V4L和FireWire(IEEE1394)。
               //释放这个结构,使用函数cvReleaseCapture。
               //返回值为一个
               // CvCapture
    
    
               cvNamedWindow("video", 1);
               //创建窗口
    
    
               while(1)//显示视屏
               {
                   pFrame=cvQueryFrame( pCapture );
                   // 函数cvQueryFrame从摄像头或者文件中抓取一帧,
                   //然后解压并返回这一帧。
                   //这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。
                   //返回的图像不可以被用户释放或者修改。抓取后,capture被指向下一帧,
                   //可用cvSetCaptureProperty调整capture到合适的帧。
    
                   if(!pFrame)break;
                   //如果PFrame为空,则跳出循环;
    
                   cvShowImage("video",pFrame);
                   //当前帧显示后
    
                   char c=cvWaitKey(33);
                   //我等待33ms
    
                   if(c==27)break;
                   //如果用户触发了按键,将按键的ASCII值给C
                   //如果C为ESC(ASCII 为27)循环退出
               }
               cvReleaseCapture(&pCapture);
               //释放Capture;
    
               cvDestroyWindow("video");
               //销毁窗口

    以上两种方法在填入-1时,都会弹出选择摄像机的界面,而且都可以成功打开笔记本电脑上自带的摄像头。

    但是本人手头上USBCamera却不行。之后发现只有使用VideoCapture方法,填入指定id才能成功过打开摄像头。 CvCapture怎么试都不行。所以希望大家在开发的时候注意到这一点。

  • 相关阅读:
    二叉树还原【前序+中序】【后续+中序】
    字符串中字符的个数和字符序列
    URL中“#” “?” &“”号的作用
    【java】String类和StringBuffer类常用操作
    Java基本开发环境搭建
    LeetCode:Pow(x, n)
    使用DX绘制3D物体时新手常犯错误,看不见物体时可以一一排查
    zlib代码生成
    zlib用法说明
    进程间通信的WM_COPYDATA的使用
  • 原文地址:https://www.cnblogs.com/blueroses/p/7930120.html
Copyright © 2011-2022 走看看