aihot  2017-05-02 16:16:53  OpenCV |   查看评论   
  
  •   //src和dst当然分别是输入图像和输出图像。Ksize为高斯滤波器模板大小,sigmaX和sigmaY分别为高斯滤  
  •   //波在横向和竖向的滤波系数。borderType为边缘扩展点插值类型。  
  •   //用9*9高斯核模糊输入帧,存入img  去噪??  
  •   GaussianBlur(frame, img, Size(9,9), 1.5);  
  •     
  •   //在img图像中截取bbhull信息(bbhull是包含了位置和大小的矩形框)的图像赋给warped  
  •   //例如需要提取图像A的某个ROI(感兴趣区域,由矩形框)的话,用Mat类的B=img(ROI)即可提取  
  •   warped = img(bbhull);  
  •   RNG& rng = theRNG();  //生成一个随机数  
  •   Point2f pt(bbhull.x + (bbhull.width-1)*0.5f, bbhull.y+(bbhull.height-1)*0.5f);  //取矩形框中心的坐标  int i(2)  
  •     
  •   //nstructs树木(由一个特征组构建,每组特征代表图像块的不同视图表示)的个数  
  •   //fern[nstructs] nstructs棵树的森林的数组??  
  •   vector<int> fern(classifier.getNumStructs());  
  •   pX.clear();  
  •   Mat patch;  
  •   
  •   //pX为处理后的RectBox最大边界处理后的像素信息,pEx最近邻的RectBox的Pattern,bbP0为最近邻的RectBox。  
  •   if (pX.capacity() < num_warps * good_boxes.size())  
  •     pX.reserve(num_warps * good_boxes.size());  //pX正样本个数为 仿射变换个数 * good_box的个数,故需分配至少这么大的空间  
  •   int idx;  
  •   for (int i=0; i< num_warps; i++){  
  •      if (i>0)  
  •      //PatchGenerator类用来对图像区域进行仿射变换,先RNG一个随机因子,再调用()运算符产生一个变换后的正样本。  
  •        generator(frame, pt, warped, bbhull.size(), rng);  
  •        for (int b=0; b < good_boxes.size(); b++){  
  •          idx = good_boxes[b];  //good_boxes容器保存的是 grid 的索引  
  •          patch = img(grid[idx]);  //把img的 grid[idx] 区域(也就是bounding box重叠度高的)这一块图像片提取出来  
  •          //getFeatures函数得到输入的patch的用于树的节点,也就是特征组的特征fern(13位的二进制代码)  
  •          classifier.getFeatures(patch, grid[idx].sidx, fern);  //grid[idx].sidx 对应的尺度索引  
  •          pX.push_back(make_pair(fern, 1));   //positive ferns <features, labels=1>  正样本  
  •      }  
  •   }  
  •   printf("Positive examples generated: ferns:%d NN:1\n",(int)pX.size());  
  • }  
  •   
  • //先对最接近box的RectBox区域得到其patch ,然后将像素信息转换为Pattern,  
  • //具体的说就是归一化RectBox对应的patch的size(放缩至patch_size = 15*15),将2维的矩阵变成一维的向量信息,  
  • //然后将向量信息均值设为0,调整为zero mean and unit variance(ZMUV)  
  • //Output: resized Zero-Mean patch  
  • void TLD::getPattern(const Mat& img, Mat& pattern, Scalar& mean, Scalar& stdev){  
  •   //将img放缩至patch_size = 15*15,存到pattern中  
  •   resize(img, pattern, Size(patch_size, patch_size));  
  •     
  •   //计算pattern这个矩阵的均值和标准差  
  •   // 计算矩阵元素的平均值和标准偏差。
  •   meanStdDev(pattern, mean, stdev);  
  •   pattern.convertTo(pattern, CV_32F);  
  •     
  •   //opencv中Mat的运算符有重载, Mat可以 + Mat; + Scalar; + int / float / double 都可以  
  •   //将矩阵所有元素减去其均值,也就是把patch的均值设为零  
  •   pattern = pattern - mean.val[0];  
  • }  
  •   
  • /* Inputs:
  •  * - Image
  •  * - bad_boxes (Boxes far from the bounding box)
  •  * - variance (pEx variance)
  •  * Outputs
  •  * - Negative fern features (nX)
  •  * - Negative NN examples (nEx)
  •  */  
  • void TLD::generateNegativeData(const Mat& frame){  
  •   //由于之前重叠度小于0.2的,都归入 bad_boxes了,所以数量挺多,下面的函数用于打乱顺序,也就是为了  
  •   //后面随机选择bad_boxes  
  •   random_shuffle(bad_boxes.begin(), bad_boxes.end());//Random shuffle bad_boxes indexes  
  •   int idx;  
  •   // 获得蕨花特征的方差大(使用整体图像计算)
  •   int a=0;  
  •   //int num = std::min((int)bad_boxes.size(),(int)bad_patches*100); // 限制bad_boxes的大小尝试
  •   printf("negative data generation started.\n");  
  •   vector<int> fern(classifier.getNumStructs());  
  •   nX.reserve(bad_boxes.size());  
  •   Mat patch;  
  •   for (int j=0;j<bad_boxes.size();j++){  //把方差较大的bad_boxes加入负样本  
  •       idx = bad_boxes[j];  
  •           if (getVar(grid[idx],iisum,iisqsum)<var*0.5f)  
  •             continue;  
  •       patch =  frame(grid[idx]);  
  •       classifier.getFeatures(patch, grid[idx].sidx, fern);  
  •       nX.push_back(make_pair(fern, 0)); //得到负样本  
  •       a++;  
  •   }  
  •   printf("Negative examples generated: ferns: %d ", a);  
  •     
  •   //random_shuffle(bad_boxes.begin(),bad_boxes.begin()+bad_patches);//Randomly selects 'bad_patches' and get the patterns for NN;  
  •   Scalar dum1, dum2;  
  •   //bad_patches = (int)file["num_patches"]; 在参数文件中 num_patches = 100  
  •   nEx=vector<Mat>(bad_patches);  
  •   for (int i=0;i<bad_patches;i++){  
  •       idx=bad_boxes[i];  
  •       patch = frame(grid[idx]);  
  •       //具体的说就是归一化RectBox对应的patch的size(放缩至patch_size = 15*15)  
  •       //由于负样本不需要均值和方差,所以就定义dum,将其舍弃  
  •       getPattern(patch,nEx[i],dum1,dum2);  
  •   }  
  •   printf("NN: %d\n",(int)nEx.size());  
  • }  
  •   
  • //该函数通过积分图像计算输入的box的方差  
  • double TLD::getVar(const BoundingBox& box, const Mat& sum, const Mat& sqsum){  
  •   double brs = sum.at<int>(box.y+box.height, box.x+box.width);  
  •   double bls = sum.at<int>(box.y+box.height, box.x);  
  •   double trs = sum.at<int>(box.y,box.x + box.width);  
  •   double tls = sum.at<int>(box.y,box.x);  
  •   double brsq = sqsum.at<double>(box.y+box.height,box.x+box.width);  
  •   double blsq = sqsum.at<double>(box.y+box.height,box.x);  
  •   double trsq = sqsum.at<
  •  

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

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