Opencv cpp 使用多线程处理同一视频的不同部分
Opencv cpp process different part of same video with multithread
如何在 5 个不同的线程中只使用一个视频捕获? 并同时处理它们?
我现在正在做的是在 5 个线程中使用 5 个视频捕获。但是,处理时间比在一个线程中线性执行视频要长。我想在 10 分钟内处理 2 分钟的视频(将 10 分钟的视频分成 5 个线程(。
还有更好的建议吗?
更新:
我通过将巨大的内存空间分配给数组并在该数组中临时存储矩阵来做到这一点。它非常消耗内存,最后我将视频帧存储在jpg文件中,并在需要时调用它。后者是一种更有效的方法。
您可以按同一VideoCapture
对象抓取帧,但在多个线程中处理帧。下面是一个非常简单的例子。
#include <iostream>
#include <thread>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
void blur(cv::Mat &image) {
cv::GaussianBlur(image, image, cv::Size(7,7), -1);
}
int main(int argc, char *argv[]) {
cv::VideoCapture cap("video.mp4");
if(!cap.isOpened())
{
std::cout<<"VideoCapture did not open"<<std::endl;
return -1;
}
cv::Mat frames[2];
std::thread tds[2];
while(true) {
if(!cap.read(frames[0]) || !cap.read(frames[1]))
{
std::cout<<"Frames empty"<<std::endl;
break;
}
tds[0] = std::thread(&blur, std::ref(frames[0]));
tds[1] = std::thread(&blur, std::ref(frames[1]));
tds[0].join();
tds[1].join();
cv::imshow("Frame", frames[0]);
if ((cv::waitKey(30) & 0XFF) == 'q')
break;
}
cap.release();
cv::destroyAllWindows();
return 0;
}
相关文章:
- 在C++中,我如何接受不同于同一行的用户输入
- 如何在c++中录制具有精确帧时间戳的视频
- 如何创建从同一类继承的不同对象的向量
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 如何将部分流作为参数传递
- C++如何将同一类的实例作为属性
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何使用OpenCV-C++编写*.mp4视频?
- 开放 CV 中的动态内存分配,用于视频处理
- 在TFHE(完全快速同态加密)上执行除法
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- OpenCV QT,显示视频的帧(不使用while循环)
- 如何使用运算符在同一行中多次调用函数
- 如何使用connect将qml按钮与同一类的cpp函数连接起来
- FFmpeg——使用硬件加速进行视频解码
- 在 openCV 中手动停止视频
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- C++交换来自同一类成员的参数值,处理多个类