首页 > 代码库 > TLD跟踪算法优化(一)并行化

TLD跟踪算法优化(一)并行化

       

       才学疏浅,只言片语,只求志同道的朋友一起交流研究。

       并行化不算是算法的改进,只是追求运行的实时性。

       简要列举一个例子:

       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做多线程设定,主要还是放在模块化的数据处理并行化上。