zoukankan      html  css  js  c++  java
  • 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
      /*
    	原理非常easy:从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做多线程设定,主要还是放在模块化的数据处理并行化上。


  • 相关阅读:
    leetcode-23-DynamicProgramming-1
    perl-basic-数组操作
    R-data.table
    perl-basic-分支&循环
    neo4j3.0多数库切换
    Neo4j下载与使用
    python中导入模块的注意点
    python 一个.py文件如何调用另一个.py文件中的类和函数
    理解Python中的类对象、实例对象、属性、方法
    flowable+tomcat部署flowable项目,在线画流程图
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4388219.html
Copyright © 2011-2022 走看看