C++ Opencv cpp使用多线程处理同一视频的不同部分
如何在5个不同的线程中仅使用一个视频捕获?同时处理它们 我现在做的是在5个线程中使用5个视频捕获。然而,处理时间比在一个线程中线性执行视频要长。我想在2分钟内处理10分钟的视频(将10分钟的视频分成5个线程) 有没有更好的建议C++ Opencv cpp使用多线程处理同一视频的不同部分,c++,opencv,C++,Opencv,如何在5个不同的线程中仅使用一个视频捕获?同时处理它们 我现在做的是在5个线程中使用5个视频捕获。然而,处理时间比在一个线程中线性执行视频要长。我想在2分钟内处理10分钟的视频(将10分钟的视频分成5个线程) 有没有更好的建议 更新: 我通过为数组分配巨大的内存空间并将矩阵临时存储在该数组中来实现。它非常消耗内存,最后我将视频帧存储在jpg文件中,并在需要时调用它。后者是一种更有效的方法。您可以通过相同的视频捕获对象抓取帧,但可以在多个线程中处理帧。下面是一个非常简单的例子 #include
更新:
我通过为数组分配巨大的内存空间并将矩阵临时存储在该数组中来实现。它非常消耗内存,最后我将视频帧存储在jpg文件中,并在需要时调用它。后者是一种更有效的方法。您可以通过相同的
视频捕获
对象抓取帧,但可以在多个线程中处理帧。下面是一个非常简单的例子
#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;
}
#包括
#包括
#包括
#包括
空洞模糊(cv::材质和图像){
cv::高斯模糊(图像,图像,cv::大小(7,7),-1);
}
int main(int argc,char*argv[]){
cv::视频捕获cap(“video.mp4”);
如果(!cap.isOpened())
{
如果我有2小时的视频(超过200k帧),这是可行的?在该代码中,总线程数与总帧数成比例right@VivianYeoh您可以启动任意数量的线程。但是请记住,您的处理器可以处理有限数量的线程。您仍然认为这不是真正有效的。但是谢谢您告诉我