aihot  2017-04-28 15:42:15  OpenCV |   查看评论   

    学习模块也分为如下四部分:

6.4.1、检查一致性:

(1)归一化img(bb)对应的patch的size(放缩至patch_size = 15*15),存入pattern:

  getPattern(img(bb), pattern, mean, stdev);

(2)计算输入图像片(跟踪器的目标box)与在线模型之间的相关相似度conf:

  classifier.NNConf(pattern,isin,conf,dummy);

(3)如果相似度太小了或者如果方差太小了或者如果被被识别为负样本,那么就不训练了;

if (conf<0.5)……或if (pow(stdev.val[0], 2)< var)……或if(isin[2]==1)……

6.4.2、生成样本:

先是集合分类器的样本:fern_examples:

(1)先计算所有的扫描窗口与目前的目标box的重叠度:

grid[i].overlap = bbOverlap(lastbox, grid[i]);

(2)再根据传入的lastbox,在整帧图像中的全部窗口中寻找与该lastbox距离最小(即最相似,重叠度最大)的num_closest_update个窗口,然后把这些窗口归入good_boxes容器(只是把网格数组的索引存入)同时,把重叠度小于0.2的,归入 bad_boxes 容器:

  getOverlappingBoxes(lastbox, num_closest_update);

(3)然后用仿射模型产生正样本(类似于第一帧的方法,但只产生10*10=100个):

generatePositiveData(img, num_warps_update); 

(4)加入负样本,相似度大于1??相似度不是出于0和1之间吗?

idx=bad_boxes[i];

if (tmp.conf[idx]>=1) fern_examples.push_back(make_pair(tmp.patt[idx],0));

然后是最近邻分类器的样本:nn_examples:

if (bbOverlap(lastbox,grid[idx]) < bad_overlap)

        nn_examples.push_back(dt.patch[i]);

6.4.3、分类器训练:

classifier.trainF(fern_examples,2);

classifier.trainNN(nn_examples);

6.4.4、把正样本库(在线模型)包含的所有正样本显示在窗口上

classifier.show();

至此,tld.processFrame函数结束。

7、如果跟踪成功,则把相应的点和box画出来:

    if (status){

      drawPoints(frame,pts1);

      drawPoints(frame,pts2,Scalar(0,255,0));  //当前的特征点用蓝色点表示

      drawBox(frame,pbox);

      detections++;

}

8、然后显示窗口和交换图像帧,进入下一帧的处理:

    imshow("TLD", frame);

swap(last_gray, current_gray);

至此,main()函数结束(只分析了框架)。
 

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

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