才学疏浅,只言片语,只求志同道的朋友一起交流研究。
并行化不算是算法的改进,只是追求运行的实时性。
简要列举一个例子:
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做多线程设定,主要还是放在模块化的数据处理并行化上。
TLD跟踪算法优化(一)并行化,布布扣,bubuko.com
原文地址:http://blog.csdn.net/sunboyiris/article/details/34441213