標籤:tld 並行化 opencv
才學疏淺,隻言片語,只求志同道的朋友一起交流研究。
並行化不算是演算法的改進,只是追求啟動並執行即時性。
簡要列舉一個例子:
TLD演算法的C++版本源碼裡:
LKTracker::trackf2f(const Mat& img1, const Mat& img2,vector<Point2f> &points1, vector<cv::Point2f> &points2){
bool LKTracker::trackf2f(const Mat& img1, const Mat& img2,vector<Point2f> &points1, vector<cv::Point2f> &points2){ //TODO!:implement c function cvCalcOpticalFlowPyrLK() or Faster tracking function //Forward-Backward tracking#pragma omp parallel sections //聲明該並列區域分為若干個section,section之間的運行順序為並行的關係 { #pragma omp section //第一個section,由某個線程單獨完成 //前向軌跡跟蹤calcOpticalFlowPyrLK( img1,img2, points1, points2, status,similarity, window_size, level, term_criteria, lambda, 0);#pragma omp section //第二個section,由某個線程單獨完成 //後向軌跡跟蹤calcOpticalFlowPyrLK( img2,img1, points2, pointsFB, FB_status,FB_error, window_size, level, term_criteria, lambda, 0);} //前向軌跡跟蹤 // calcOpticalFlowPyrLK( img1,img2, points1, points2, status,similarity, window_size, level, term_criteria, lambda, 0); //後向軌跡跟蹤 //calcOpticalFlowPyrLK( img2,img1, points2, pointsFB, FB_status,FB_error, window_size, level, term_criteria, lambda, 0); //Compute the real FB-error /*原理很簡單:從t時刻的映像的A點,跟蹤到t+1時刻的映像B點;然後倒回來從t+1時刻的映像的B點往回跟蹤,假如跟蹤到t時刻的映像的C點,這樣就產生了前向和後向兩個軌跡,比較t時刻中A點和C點的距離,如果距離小於某個閾值,那麼就認為前向跟蹤是正確的;這個距離就是FB_error */ //計算前向與後向軌跡的誤差。#pragma omp parallel for for( int i= 0; i<points1.size(); ++i ){ FB_error[i] = norm(pointsFB[i]-points1[i]); //norm求矩陣或向量的//範數,或絕對值 } //Filter out points with FB_error[i] > median(FB_error) && points with sim_error[i] > median(sim_error) normCrossCorrelation(img1,img2,points1,points2); return filterPts(points1,points2);} 修改後代碼運行速度提高了不少。
不過並行化處理,必須考慮到一些問題
1.資料的互斥問題
2.線程的分配問題
3.Release版本應用程式對於for迴圈可以自動最佳化,不用對for做多線程設定,主要還是放在模組化的資料處理並行化上。