我目前正在尝试加速运行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?是否有简单的代码可以在几行中完成?
谢谢!
答案 0 :(得分:0)
你可以使用C ++ 11并使用<thread>
。互斥是一个有两个可能值的信号量。互斥通常就足够了。
我尝试过相反的方式(工作者线程从相机拍摄图像,主要执行所有计算)并且遇到很多问题 - 您可以查看header和main class code。但祝你好运。
答案 1 :(得分:0)
我不确定这是否会提高程序的速度。 OpenCV应该在对象检测中使用线程(至少在使用级联分类器的对象检测中,而不仅仅是关于SURF)。如果您尝试在2个不同的线程上划分CPU /核心电源,则可能会阻止OpenCV对象检测功能使用2个或更多核心。一般来说,很难说哪个选项会更快。首先,我将检查OpenCV是否使用多个线程 - 为此,只需运行一些复杂的对象检测(使用来自相机或大图像或视频的帧)并检查(即在任务管理器中)您的应用是否正在使用超过1个线程。如果没有 - 用TBB重新安装OpenCV,在mac上只使用brew install opencv --with-tbb
,对于windows有一条说明,在linux上它应该类似于mac解决方案。