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

时间:2018-06-26 10:05:25

标签: c++ opencv

如何在5个不同线程中仅使用一个视频捕获?并同时处理它们?

我现在正在做的是在5个线程中使用5个视频捕获。但是,处理时间比在一个线程中线性执行视频要长。我想在2分钟内处理10分钟的视频(将10分钟的视频分成5个线程)。

有更好的建议吗?


更新:

我通过为数组分配巨大的内存空间并将矩阵临时存储在该数组中来实现。这非常消耗内存,最后我将视频帧存储在jpg文件中,并在需要时调用它。后者是一种更有效的方法。

1 个答案:

答案 0 :(得分:1)

您可以通过相同的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;
}