OpenCV减慢了摄像头的捕捉速度
OpenCV slowing down WebCam capture
我在我的Windows机器以及RaspberryPi (ARM, Debian Wheezy)上的c++应用程序中使用OpenCV从网络摄像头捕获帧。问题是CPU使用率。我只需要每2秒处理一次帧,所以没有实时的实时视图。但如何实现这一点呢?你推荐哪一种?
- 抓取每一帧,但只处理一些:这有点帮助。我得到最新的帧,但这个选项对CPU使用率没有显著影响(小于25%)
- 抓取/处理每帧,但睡眠:对CPU使用率有很好的影响,但我得到的帧是旧的(5-10秒)
- 在每个周期中创建/销毁videoccapture:在一些周期后应用程序崩溃-即使videoccapture被正确清理。
- 还有其他想法吗?
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;
}
- 在每个周期中创建/销毁视频捕获:尚未测试
这可能在Windows上有点麻烦(可能在其他操作系统上也是如此)-创建videoccapture后捕获的第一帧通常是黑色或灰色的。第二帧应该没问题:)
其他想法:
-修改后的想法2 -睡眠后抓取2帧。第一帧可能是旧的,但第二帧应该是新的。它没有经过测试,一般我也不确定,但很容易检查。
-最终在睡眠后,你可能会在while循环中抓取帧(没有睡眠),直到你抓取同一帧两次(但这可能很难实现,特别是在RasberryPi上)。
相关文章:
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 使用源读取器从网络摄像头源获取 H264 样本
- 如何提高文件的读取速度?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 从 OpenCV 3 切换到 OpenCV 4 会导致网络摄像头以最大 5 fps 的速度录制,而不是通常的 30 f
- OpenCV中的网络摄像头图像处理C++速度很慢
- 流网络摄像头的速度慢,无法"detectMultiScale"
- OpenCV减慢了摄像头的捕捉速度