OpenCV多线程与TBB用于视频处理

时间:2014-07-24 14:31:07

标签: c++ multithreading opencv mutex

我目前正在尝试加速运行SURF算法的应用程序以检测视频上的对象。

我想做的是使用线程(可能是boost线程)来加速进程并有两个线程:

  • 拍摄图像并对其进行处理的算法以及当算法在先前拍摄的帧上终止时,取当前帧并再次运行
  • 另一个专注于从相机中调整图像并显示它。

如果你想在这里使用伪代码,那么我现在在主函数中有:

Mat imageReference, imageFromVideo;
imageReference = imread(argv[1], CV_LOAD_IMAGE_COLOR);

VideoCapture camVid(0);


namedWindow("Display video");
namedWindow("Display ref");
imshow("Display ref", imageReference);

// Surf algo on reference image
FastHessian fh(&image);
Surf surf(fh.GetIntegralImg(), fh.GetIptVect());
surf.descriptors(false);




while (true) {

    camVid >> imageFromVideo;

    // Surf on frame from video
    FastHessian fh2(&imageFromVideo); 
    Surf surf2(fh2.GetIntegralImg(), fh2.GetIptVect());
    surf2.descriptors(false);

    // Compare the two interest points from images
    vector<pair<InterestPoint, InterestPoint> > matches;
    matchIpoints(surf.getInterestPoints(), surf2.getInterestPoints(), matches);

    drawIPoints(&imageFromVideo, matches);

    int c = cvWaitKey(1);
    if ((char) c == 27) break;
    imshow("Display video", imageFromVideo);
    imshow("Display ref", imageRef);

}

我不知道如何从多线程开始,因为我以前从未这样做过。我应该使用Mutex还是使用Semaphore?是否有简单的代码可以在几行中完成?

谢谢!

2 个答案:

答案 0 :(得分:0)

你可以使用C ++ 11并使用<thread>。互斥是一个有两个可能值的信号量。互斥通常就足够了。

我尝试过相反的方式(工作者线程从相机拍摄图像,主要执行所有计算)并且遇到很多问题 - 您可以查看headermain class code。但祝你好运。

答案 1 :(得分:0)

我不确定这是否会提高程序的速度。 OpenCV应该在对象检测中使用线程(至少在使用级联分类器的对象检测中,而不仅仅是关于SURF)。如果您尝试在2个不同的线程上划分CPU /核心电源,则可能会阻止OpenCV对象检测功能使用2个或更多核心。一般来说,很难说哪个选项会更快。首先,我将检查OpenCV是否使用多个线程 - 为此,只需运行一些复杂的对象检测(使用来自相机或大图像或视频的帧)并检查(即在任务管理器中)您的应用是否正在使用超过1个线程。如果没有 - 用TBB重新安装OpenCV,在mac上只使用brew install opencv --with-tbb,对于windows有一条说明,在linux上它应该类似于mac解决方案。