OpenCV减慢了WebCam捕获速度

时间:2013-06-10 15:10:03

标签: c++ opencv webcam video-capture raspberry-pi

我在Windows机器和RaspberryPi(ARM,Debian Wheezy)的C ++应用程序中使用OpenCV从Webcam捕获帧。问题是CPU使用率。我只需要每隔2秒处理一次帧 - 所以没有实时的实时视图。但是如何实现呢?你会建议哪一个?

  1. 抓住每一帧,但只处理一些:这有点帮助。我获得了最新的帧,但此选项对CPU使用率(低于25%)
  2. 没有显着影响
  3. 抓取/处理每一帧但是睡眠:对CPU使用率有很好的影响,但我得到的帧很旧(5-10秒)
  4. 在每个周期中创建/销毁VideoCapture:在一些周期后,应用程序崩溃 - 即使正确清理了VideoCapture。
  5. 还有其他想法吗?
  6. 提前致谢

    #include <opencv2/opencv.hpp>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    #include <vector>
    #include <unistd.h>
    #include <stdio.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        cv::VideoCapture cap(0); //0=default, -1=any camera, 1..99=your camera
    
        if(!cap.isOpened()) 
        {
            cout << "No camera detected" << endl;
            return 0;
        }
    
        // set resolution & frame rate (FPS)
        cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
        cap.set(CV_CAP_PROP_FRAME_HEIGHT,240);
        cap.set(CV_CAP_PROP_FPS, 5);
    
        int i = 0;
        cv::Mat frame;
    
        for(;;)
        {
            if (!cap.grab())
                continue;
    
            // Version 1: dismiss frames
            i++;
            if (i % 50 != 0)
                continue;
    
            if( !cap.retrieve(frame) || frame.empty() )
                continue;
    
            // ToDo: manipulate your frame (image processing)
    
            if(cv::waitKey(255) ==27) 
                break;  // stop on ESC key
    
            // Version 2: sleep
            //sleep(1);
        }
    
        return 0;
    }
    

1 个答案:

答案 0 :(得分:4)

  
      
  1. 在每个周期中创建/销毁VideoCapture:尚未测试
  2.   

在Windows上可能有点麻烦(也可能在其他操作系统上) - 创建VideoCapture后抓取的第一帧通常是黑色或灰色。第二帧应该没问题:)

其他想法:
- 修改后的想法nr 2 - 睡眠后抢2帧。第一帧可能是旧的,但第二帧应该是新的。它没有经过测试,一般我不确定,但很容易检查它 - 最终在睡眠之后你可以在循环中抓住帧(没有睡眠),等到你抓住同一帧两次(但特别是在RasberryPi上可能很难实现)。