OpenCV多线程与TBB视频处理



我目前正在尝试加速和应用程序,运行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);
}

我真的不知道如何开始与多线程,因为我从来没有做过。我应该用互斥锁还是用信号量?是否有简单的代码在几行内完成此操作?

谢谢!

您可以在c++ 11中使用<thread>。互斥锁是一种有两个可能值的信号量。互斥锁通常就足够了。

我试着用另一种方式来做(工作线程从相机中获取图像,主线程做所有的计算),并且有很多问题-你可以看看头和主类代码。祝你好运。

我不确定这是否会提高您的程序的速度。OpenCV应该在对象检测中使用线程(至少在使用级联分类器的对象检测中,而不是使用SURF)。如果你试图将你的cpu/内核功率分配到2个不同的线程上,你可能会阻止OpenCV对象检测功能使用2个或更多的内核。一般来说,很难说哪种选择更快。首先,我会检查OpenCV是否使用多个线程——要做到这一点,只需运行一些复杂的对象检测(使用来自相机或大图像或视频的帧)并检查(即在任务管理器中)你的应用程序是否使用超过一个线程。如果没有-重新安装OpenCV与TBB,在mac上只使用brew install opencv --with-tbb,对于windows有一个指令覆盖,在linux上应该类似于mac的解决方案。

最新更新