aihot  2017-05-12 14:50:14  OpenCV |   查看评论   

然后我们发现这个函数指针没有直接的显性的实现。那么问题出在哪里呢?
它是通过宏实现的:
程序中定义了一个这样的宏:
#define ICV_DEF_FIND_STUMP_THRESHOLD_SQ( suffix, type )
ICV_DEF_FIND_STUMP_THRESHOLD( sq_##suffix, type,
/* calculate error (sum of squares) */
/* err = sum( w * (y - left(rigt)Val)^2 ) */
curlerror = wyyl + curleft * curleft * wl - 2.0F * curleft * wyl;
currerror = (*sumwyy) - wyyl + curright * curright * wr - 2.0F * curright * wyr;
)

和一个这样的宏:
#define ICV_DEF_FIND_STUMP_THRESHOLD( suffix, type, error )
CV_BOOST_IMPL int icvFindStumpThreshold_##suffix(…..)
{
……..
}

这两个宏中,后者是函数的主体部分,而函数的定义通过前者完成。即:
ICV_DEF_FIND_STUMP_THRESHOLD_ENTROPY( 16s, short ),这样的形式完成。这相当于给前者的宏传递了两个参数,前者的宏将第一个参数转换成sq_16s后和第二个参数一起传到后者的宏。(##是把前后两个string连接到一起,string是可变的两,在这里suffix就放入了16s和sq_结合成了sq_16s)
后者的宏接收到参数以后就进行了函数的定义:
CV_BOOST_IMPL int icvFindStumpThreshold_sq_16s

这样icvFindStumpThreshold_sq_16s就被定义了。这样做的好处是,12个非常相似的函数可以通过两个宏和12个宏的调用来实现,而不需要直接定义12个函数。

3.训练结果中数据的含义:
- <feature>
- <rects>
<_>6 4 12 9 -1.</_>
//矩阵。前四个数值是矩阵四个点的位置,最后一个数值是矩阵像素和的权值
<_>6 7 12 3 3.</_>
//矩阵。前四个数值是矩阵四个点的位置,最后一个是像素和的权值,这样两个矩阵就形成了一个Haar特征
</rects>
<tilted>0</tilted> //是否是倾斜的Haar特征
</feature>
<threshold>-0.0315119996666908</threshold> //阈值
<left_val>2.0875380039215088</left_val> //小于阈值时取左值
<right_val>-2.2172100543975830</right_val> //大于阈值时取右值

4. 训练过程中使用的算法
这里主要讲弱分类器算法

• 矩形特征值:Value[i][j], 1≤i≤n代表所有的Haar特征,1≤j≤m代表所有的样本
• FAULT = (curlerror + currerror)表示当前分类器的错误率的最小值,初始设置:curlerror currerror= 1000000000000000000000000000000000000000000000000(反正给个暴力大的数值就对了)

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自adaboost算法

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