Opencv cpp 使用多线程处理同一视频的不同部分

Opencv cpp process different part of same video with multithread

本文关键字:视频 同部 cpp 多线程处理 Opencv      更新时间:2023-10-16

如何在 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;
}