9

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

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

提前致谢

#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;
}
4

1 回答 1

5
  1. 在每个循环中创建/销毁 VideoCapture:尚未测试

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

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

于 2013-06-10T23:32:15.293 回答