gpt4 book ai didi

c++ - OpenCV 减慢网络摄像头捕获

转载 作者:可可西里 更新时间:2023-11-01 17:56:58 27 4
gpt4 key购买 nike

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

  1. 抓取每一帧,但只处理一些:这有点帮助。我获得了最新的帧,但此选项对 CPU 使用率没有显着影响(低于 25%)
  2. 抓取/处理每一帧但 sleep :对 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;
}

最佳答案

  1. Create/Destroy VideoCapture in each cycle: not yet tested

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

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

关于c++ - OpenCV 减慢网络摄像头捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17027085/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com