4. generatePositiveData(frame1,num_warps_init)
输入:
当前帧图像:frame1
图像块变换次数:num_warps_init
最相似边界框:best_box
相似边界框:good_boxes
输出:
集成分类器正样本集:pX
best_box图像块处理结果:pEx
描述:
getPattern(frame(best_box),pEx,mean,stdev):
frame(best_box)为该帧图像中best_box边界框对应图像块;将该图像块resize
为15*15的大小;计算该图像的均值、方差,分别存放到mean、stdev中;将该
图像块与均值作差的结果存于pEx中。
generator(frame,pt,warped,bbhull.size(),rng):
pt为good_boxes最大边界框(2中有提到)的中心点;该函数对每个good_box对
应图像块仿射变换:±1%范围的偏移,±1%范围的尺度变化,±10%范围的平面
内旋转,并且在每个像素上增加方差为5的高斯噪声(确切的大小是在指定的范
围内随机选择的),共计num_warps_init种。
关于该部分,详情见《关于PatchGenerator类 》
对每一仿射图像块计算特征,并存于pX中。
classifier.getFeatures(patch,grid[idx].sidx,fern):
对尺度grid[idx].sidx下的图像块patch,使用3中定义的位置计算特征,并存于
fern中。
注意:
原C++版本作者此处代码有误。没有用到变换后的图像块。
(也有朋友说没有错,待验证,但修改的一定是正确的)
修改方法一:
将generator(frame,pt,warped,bbhull.size(),rng);
修改成generator(img,pt,img,frame.size(),rng);
修改方法二:
将整个for循环内容修改为:
for (int i=0;i<num_warps;i++)
{
if(i == 0)
{
for (int b = 0; b < good_boxes.size(); b ++)
{
idx=good_boxes[b];
patch = img(grid[idx]);
classifier.getFeatures(patch, grid[idx].sidx, fern);
pX.push_back(make_pair(fern,1));
}
}
else
{
generator(img,pt,warped,bbhull.size(),rng);
for (int b = 0; b < good_boxes.size(); b ++)
{
idx=good_boxes[b];
Rect region(grid[idx].x-bbhull.x, grid[idx].y - bbhull.y, grid[idx].width, grid[idx].height);
patch = warped(region);
classifier.getFeatures(patch, grid[idx].sidx, fern);
pX.push_back(make_pair(fern,1));
}
}
}
5. meanStdDev(frame1(best_box),mean,stdev)
输入:
最相似图像块:frame1(best_box)
输出:
图像块均值:mean
图像块标准差:stdev
描述:
计算best_box边界框对应图像块的均值和标准差,并分别存于mean、stdev中。
6. integral(frame1,iisum,iisqsum)
输入:
整帧图像:frame1
输出:
积分图:iisum
平方积分图:iisqum
描述:
对整帧图像计算积分图、图像平方的积分图
7. generateNegativeData(frame1)
输入:
整帧图像:frame1
模板个数:bad_patches
所有不重叠边界框:bad_boxes
积分图:iisum
平方积分图:iisqum
输出:
负样本特征集:nX
负样本模板集:nEx
描述:
random_shuffle(bad_boxes.begin(),bad_boxes.end()):
随机打乱bad_boxes的顺序。
取所有bad_boxes边界框中,方差值高于best_box图像块阈值一半的图像块,计算
特征并保存到nX中。(why?:因为检测的时候,方差分类器位于集合分类器的前一
级。也就是说,方差低于0.5倍best_box图像块方差的部分都被排除,如果在此处
将其作为负样本是没有意义的,甚至会降低集合分类器的检测效果。)
任取bad_patches个图像块作为负模板。
注意:
原程序版本有错,对方差分类器方差重复取50%。
将if (getVar(grid[idx],iisum,iisqsum)<var*0.5f)
修改成if (getVar(grid[idx],iisum,iisqsum)<var*1.0f)
注:若存在说法看不明白的,请留言询问!