本文转自http://blog.csdn.net/muzi198783/article/details/7392255
首先是run_TLD 在其次就是tldExample 最后到了初始化函数tldInit
第一个比较关键的函数 bb_scan
将图像网格化,将图片首先 SCALE = 1.2.^[-10:10];(21 个规格),在每个规格上打网格
这个函数有一个比较重要的方法
ntuples(就是重复) 因为网格上的点很多点有相同的X,或者Y 具体方法大家在matlab中调用一句ntuples([1 2],[1 2,3])看看答案就知道什么意思了。
这个函数返回一个6*n的矩阵,这个矩阵每个列代表一个窗口。
1,代表窗口左上点X
2,代表窗口左上点y
3,代表窗口右下点X
4,代表窗口右下点Y
5,这种规格的编号
6,相同X的窗口数目
产生特征点函数tldGenerateFeatures
就是产生一系列的随机数 大概是(4*特征个数)*树的个数
初始化轨迹
记录连续的图片
训练探测器
规格化和目标的相似度bb_overlap
将每个规格化窗口和目标窗口做运算得到相似度
公式:相交的面积/总面积(不相交则返回0.0)
注意矩阵运算返回一个向量,大小就是规格化的数目length(grid)
取出图片的函数,当参数为4个时会进行变换img_patch
tldGeneratePositiveData产生正样本数据
主要利用的是相似度来判定正负样本既bb_overlap>阈值,则认为正样本,反之亦然。
这里主要就是有个编码问题
随机取出点比较大小进行编码
for (int i=0; i<nFEAT; i++) {
index<<=1;
int fp0 = img[off[0]+bbox[0]];
int fp1 = img[off[1]+bbox[0]];
if (fp0>fp1) { index |= 1;}
off += 2;
}
(fern.cpp的measure_tree_offset)
这个函数返回一个pX代表编码后的矩阵,pEx代表最靠近目标窗口的规格化窗口(这个窗口进行了处理可以用于后面的训练),
最靠近目标窗口的规格化窗口
类似的负样本情况。
fern(2,......)
开始训练随机树
if (Y[I] == 1) {
if (measure_forest(x) <= thrP)//防止某个特征占的比重太大
update(x,1,1);
} else {
if (measure_forest(x) >= thrN)
update(x,0,1);
void update(double *x, int C, int N) {
for (int i = 0; i < nTREES; i++) {
int idx = (int) x[i];
(C==1) ? nP[i][idx] += N : nN[i][idx] += N;
if (nP[i][idx]==0) {
WEIGHT[i][idx] = 0;
} else {
WEIGHT[i][idx] = ((double) (nP[i][idx])) / (nP[i][idx] + nN[i][idx]);//正样本增加相应位置的权重,集后面的置信度
}
}
}
训练样本产生一个正确的特征集
tldTrainNN(pEx,nEx,tld)
tld.pex = [tld.pex(:,1:isin(2)) x(:,i) tld.pex(:,isin(2)+1:end)]; % 这个代码就是通过随机树种产生比较高的规格化窗口在这些窗口放到正特征集里面
以后就可以拿这个和目标最比较来判断目标窗口的位置