aihot  2017-05-02 16:16:53  OpenCV |   查看评论   
  
  •   //相当于对RectBox进行筛选。并通过BBhull函数得到这些RectBox的最大边界。  
  •   getOverlappingBoxes(box, num_closest_init);  
  •   printf("Found %d good boxes, %d bad boxes\n",(int)good_boxes.size(),(int)bad_boxes.size());  
  •   printf("Best Box: %d %d %d %d\n",best_box.x, best_box.y, best_box.width, best_box.height);  
  •   printf("Bounding box hull: %d %d %d %d\n", bbhull.x, bbhull.y, bbhull.width, bbhull.height);  
  •     
  •   // 正确 Bounding Box  
  •   lastbox=best_box;  
  •   lastconf=1;  
  •   lastvalid=true;  
  •   //Print  
  •   fprintf(bb_file,"%d,%d,%d,%d,%f\n",lastbox.x,lastbox.y,lastbox.br().x,lastbox.br().y,lastconf);  
  •     
  •   //Prepare Classifier 准备分类器  
  •   //scales容器里是所有扫描窗口的尺度,由buildGrid()函数初始化  
  •   classifier.prepare(scales);  
  •     
  •   /// 生成数据
  •   // 生成正数据
  •   generatePositiveData(frame1, num_warps_init);  
  •     
  •   // 设置方差阈值
  •   Scalar stdev, mean;  
  •   //统计best_box的均值和标准差  
  •   ////例如需要提取图像A的某个ROI(感兴趣区域,由矩形框)的话,用Mat类的B=img(ROI)即可提取  
  •   //frame1(best_box)就表示在frame1中提取best_box区域(目标区域)的图像片  
  •   meanStdDev(frame1(best_box), mean, stdev);  
  •     
  •   //利用积分图像去计算每个待检测窗口的方差  
  •   //cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL );  
  •   //计算积分图像,输入图像,sum积分图像, W+1×H+1,sqsum对象素值平方的积分图像,tilted_sum旋转45度的积分图像  
  •   //利用积分图像,可以计算在某象素的上-右方的或者旋转的矩形区域中进行求和、求均值以及标准方差的计算,  
  •   //并且保证运算的复杂度为O(1)。    
  •   integral(frame1, iisum, iisqsum);  
  •   //级联分类器模块一:方差检测模块,利用积分图计算每个待检测窗口的方差,方差大于var阈值(目标patch方差的50%)的,  
  •   //则认为其含有前景目标方差;var 为标准差的平方  
  •   var = pow(stdev.val[0],2) * 0.5; //getVar(best_box,iisum,iisqsum);  
  •   cout << "variance: " << var << endl;  
  •     
  •   // 检查差异
  •   //getVar函数通过积分图像计算输入的best_box的方差  
  •   double vr =  getVar(best_box, iisum, iisqsum)*0.5;  
  •   cout << "check variance: " << vr << endl;  
  •     
  •   // 生成负数据
  •   generateNegativeData(frame1);  
  •     
  •   // 将负蕨分解成训练和测试集(已经洗牌)
  •   // 将负样本放进 训练和测试集  
  •   int half = (int)nX.size()*0.5f;  
  •   // vector::assign函数将区间[start, end)中的值赋值给当前的vector.  
  •   // 将一半的负样本集 作为 测试集  
  •   nXT.assign(nX.begin()+half, nX.end());  //nXT; //negative data to Test  
  •   // 然后将剩下的一半作为训练集  
  •   nX.resize(half);  
  •     
  •   /// 将负NN分解为训练和测试集
  •   half = (int)nEx.size()*0.5f;  
  •   nExT.assign(nEx.begin()+half,nEx.end());  
  •   nEx.resize(half);  
  •     
  •   // 合并负数据与正数据并洗牌
  •   //将负样本和正样本合并,然后打乱  
  •   vector<pair<vector<int>,int> > ferns_data(nX.size()+pX.size());  
  •   vector<int> idx = index_shuffle(0, ferns_data.size());  
  •   int a=0;  
  •   for (int i=0;i<pX.size();i++){  
  •       ferns_data[idx[a]] = pX[i];  
  •       a++;  
  •   }  
  •   for (int i=0;i<nX.size();i++){  
  •       ferns_data[idx[a]] = nX[i];  
  •       a++;  
  •   }  
  •     
  •   // 数据已经被洗牌,只是把它放在同一个向量中
  •   vector<cv::Mat> nn_data(nEx.size()+1);  
  •   nn_data[0] = pEx;  
  •   for (int i=0;i<nEx.size();i++){  
  •       nn_data[i+1]= nEx[i];  
  •   }  
  •     
  •   ///Training    
  •   //训练 集合分类器(森林) 和 最近邻分类器   
  •   classifier.trainF(ferns_data, 2); //bootstrap = 2  
  •   classifier.trainNN(nn_data);  
  •     
  •   ///Threshold Evaluation on testing sets  
  •   //用样本在上面得到的 集合分类器(森林) 和 最近邻分类器 中分类,评价得到最好的阈值  
  •   classifier.evaluateTh(nXT, nExT);  
  • }  
  •   
  • /* Generate Positive data
  •  * Inputs:
  •  * - good_boxes (bbP)
  •  * - best_box (bbP0)
  •  * - frame (im0)
  •  * Outputs:
  •  * - Positive fern features (pX)
  •  * - Positive NN examples (pEx)
  •  */  
  • void TLD::generatePositiveData(const Mat& frame, int num_warps){  
  •     /*
  •     CvScalar定义可存放1—4个数值的数值,常用来存储像素,其结构体如下:
  •     typedef struct CvScalar
  •     {
  •         double val[4];
  •     }CvScalar;
  •     如果使用的图像是1通道的,则s.val[0]中存储数据
  •     如果使用的图像是3通道的,则s.val[0],s.val[1],s.val[2]中存储数据
  •     */  
  •   Scalar mean;   //均值  
  •   Scalar stdev;   //标准差  
  •     
  •   //此函数将frame图像best_box区域的图像片归一化为均值为0的15*15大小的patch,存在pEx正样本中  
  •   getPattern(frame(best_box), pEx, mean, stdev);  
  •     
  •   // 在扭曲的补丁上获取Fern功能
  •   Mat img;  
  •   Mat warped;  
  •   //void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0,   
  •   //                                    int borderType=BORDER_DEFAULT ) ;  
  •   //功能:对输入的图像src进行高斯滤波后用dst输出。
  •  

    除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自TLD(Tracking-Learning-Detection)学习与源码理解之(六)下

    留言与评论(共有 0 条评论)
       
    验证码:
    [lianlun]1[/lianlun]