我在我的 Windows 机器和 RaspberryPi(ARM、Debian Wheezy)上的 C++ 应用程序中使用 OpenCV 从网络摄像头捕获帧。问题是CPU使用率。我只需要每 2 秒处理一次帧 - 所以没有实时实时视图。但是如何实现呢?你会推荐哪一个?
- 抓取每一帧,但只处理一些:这有点帮助。我获得了最新的帧,但此选项对 CPU 使用率没有显着影响(小于 25%)
- 抓取/处理每一帧但休眠:对 CPU 使用率有很好的影响,但我得到的帧是旧的(5-10 秒)
- 在每个周期中创建/销毁 VideoCapture:经过一些周期后,应用程序崩溃 - 即使 VideoCapture 已正确清理。
- 还有什么想法吗?
提前致谢
#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;
}