学习模块也分为如下四部分:
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);