2014-07-24 39 views
0

我目前正試圖加快和運行SURF算法檢測視頻對象的應用程序。OpenCV多線程與TBB的視頻處理

我想什麼做的是使用線程(可能提振線程),以加快這一進程,並有兩個線程:

  • 一個是拍攝圖像,並對其進行處理,當算法終止框架上先前拍攝,取當前幀並再次運行
  • 另一個側重於從相機中凝視圖像並顯示它。

如果你想僞代碼這裏就是我的主要功能有現:

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); 

} 

我不知道真正如何開始與多線程,因爲我從來沒有這麼做過。我應該用互斥還是信號來做?是否有簡單的代碼可以在幾行內完成此操作?

謝謝!

回答

0

你可以去C++ 11並使用<thread>。互斥量是一個有兩個可能值的信號量。互斥量通常就足夠了。

我試圖以相反的方式(工作線程從相機拍攝圖像,主要做所有計算)並且遇到很多問題 - 您可以看看headermain class code。但祝你好運。

0

我不確定這是否會提高程序的速度。 OpenCV應該在對象檢測中使用線程(至少在使用級聯分類器進行對象檢測時,不要使用SURF)。如果您嘗試在2個不同線程上劃分CPU /內核電源,可能會阻止OpenCV對象檢測功能使用2個或更多內核。通常很難說哪個選項會更快。首先,我會檢查OpenCV是否使用多個線程 - 要執行此操作,只需運行一些複雜的對象檢測(使用來自相機或大圖像或視頻的幀)並檢查(即在任務管理器中)您的應用程序是否正在使用超過1個線程。如果沒有 - 用TBB重新安裝OpenCV,在Mac上只需使用brew install opencv --with-tbb,對於windows有一條指令說明了這一點,在linux上它應該類似於mac解決方案。