tdrcxt 2018-08-28 08:04 采纳率: 40%
浏览 2459
已结题

opencv怎么判断摄像头被其他进程占用

这边遇到单目usb摄像头在被其他进程占用的条件下,用另外的进程仍可以open和read(mat)成功。
怎么判断该摄镜头已经被占用了,不能再被open

  • 写回答

2条回答 默认 最新

  • 无明之徒 2018-08-28 09:33
    关注

    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怎么试都不行。所以希望大家在开发的时候注意到这一点。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)