OpenCV减慢了摄像头的捕捉速度

OpenCV slowing down WebCam capture

本文关键字:速度 摄像头 OpenCV      更新时间:2023-10-16

我在我的Windows机器以及RaspberryPi (ARM, Debian Wheezy)上的c++应用程序中使用OpenCV从网络摄像头捕获帧。问题是CPU使用率。我只需要每2秒处理一次帧,所以没有实时的实时视图。但如何实现这一点呢?你推荐哪一种?

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

Thanks in advance

#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. 在每个周期中创建/销毁视频捕获:尚未测试

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

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