adaboost算法实现

xpzaxauekz 2017-11-30 04:15:37
我用的opencv库haarcascade_frontalface_alt.xml,把数据提取出来放入x[i][6]={0 or 1,x,y,w,h,weight},0代表2矩形特征,1代表三矩形特征。用的缩放图片的方法,窗口20*20.检测人脸图片时时钟检测不到,请问我的代码哪有问题?谢谢大神们帮我看看。while(k<4630)
{

int base_w = -1, base_h = -1;
int new_base_w = 0, new_base_h = 0;
int kx, ky;
int flagx = 0, flagy = 0;
int x0 = 0, yy0 = 0;
int nr;


if(x[k][0]==0 )
{

nr=2;
for(int i=0;i<nr;i++){
base_w = (int)CV_IMIN( (unsigned)base_w, (unsigned)(x[k+i][3]-1) );
base_w = (int)CV_IMIN( (unsigned)base_w, (unsigned)(x[k+i][1] - x[k][1]-1) );
base_h = (int)CV_IMIN( (unsigned)base_h, (unsigned)(x[k+i][4]-1) );
base_h = (int)CV_IMIN( (unsigned)base_h, (unsigned)(x[k+i][2] -x[k][2]-1) );
}
base_w =base_w+ 1;
base_h =base_h+ 1;
kx = x[k][3] / base_w;
ky = x[k][4] / base_h;
if( kx <= 0 )
{
flagx = 1;
new_base_w = Round( (double)x[k][3] * ss ) / kx;
x0 = Round((double)x[k][1] * ss );
}
if( ky <= 0 )
{
flagy = 1;
new_base_h = Round((double) x[k][4] * ss ) / ky;
yy0 = Round((double)x[k][2] * ss );
}


if( flagx )
{
a[0] = x0;
a[2] =x[k][3] * new_base_w / base_w;
b[0]=(x[k+1][1]-x[k][1])* new_base_w / base_w + x0;
b[2]=x[k+1][3] * new_base_w / base_w;
}
else
{
a[0] = Round( (double)x[k][1] * ss );
a[2] = Round((double) x[k][3] * ss );
b[0] = Round( (double)x[k+1][1] * ss );
b[2] = Round( (double)x[k+1][3] * ss );
}
if( flagy )
{
a[1] = yy0;
a[3] = x[k][4] * new_base_h / base_h;
b[1] = (x[k+1][2] - x[k][2]) * new_base_h / base_h + yy0;
b[3] = x[k+1][4] * new_base_h / base_h;
}
else
{
a[1] = Round((double) x[k][2] * ss );
a[3] = Round((double) x[k][4] * ss );
b[1] = Round((double)x[k+1][2] * ss );
b[3] = Round( (double)x[k+1][4] * ss );
}
double weight1=(double)x[k+1][5]/(double)(w*w);
double weight0=(double)(-weight1*b[2]*b[3])/(double)(a[2]*a[3]);
/*
feature1=M[a[0]][a[1]]+M[a[0]+a[2]][a[1]+a[3]]-M[a[0]][a[1]+a[3]]-M[a[0]+a[2]][a[1]];
feature2=M[b[0]][b[1]]+M[b[0]+b[2]][b[1]+b[3]]-M[b[0]][b[1]+b[3]]-M[b[0]+b[2]][b[1]];
*/

feature1=window->getval(a[0],a[1])+window->getval(a[0]+a[2],a[1]+a[3])-window->getval(a[0],a[1]+a[3])-window->getval(a[0]+a[2],a[1]);
feature2=window->getval(b[0],b[1])+window->getval(b[0]+b[2],b[1]+b[3])-window->getval(b[0],b[1]+b[3])-window->getval(b[0]+b[2],b[1]);
double f1=(double)(weight0*feature1);
double f2=(double)(weight1*feature2);
double g=f1+f2;
double dd=(double)(dat*y[j][0]);
value[j]= g> dd ? y[j][2]:y[j][1];
k=k+2;
}
else if(x[k][0]==1)
{
nr=3;
for(int i=0;i<nr;i++){
base_w = (int)CV_IMIN( (unsigned)base_w, (unsigned)(x[k+i][3]-1) );
base_w = (int)CV_IMIN( (unsigned)base_w, (unsigned)(x[k+i][1] - x[k][1]-1) );
base_h = (int)CV_IMIN( (unsigned)base_h, (unsigned)(x[k+i][4]-1) );
base_h = (int)CV_IMIN( (unsigned)base_h, (unsigned)(x[k+i][2] -x[k][2]-1) );
}
base_w = base_w+1;
base_h =base_h+ 1;
kx = x[k][3] / base_w;
ky = x[k][4] / base_h;
if( kx <= 0 )
{
flagx = 1;
new_base_w = Round( (double)x[k][3] * ss ) / kx;
x0 = Round((double)x[k][1] * ss );
}
if( ky <= 0 )
{
flagy = 1;
new_base_h = Round( (double)x[k][4] * ss ) / ky;
yy0 = Round((double)x[k][2] * ss );
}


if( flagx )
{
a[0] = x0;
a[2] =x[k][3] * new_base_w / base_w;
b[0]=(x[k+1][1]-x[k][1])* new_base_w / base_w + x0;
b[2]=x[k+1][3] * new_base_w / base_w;
c[0]=(x[k+2][1]-x[k][1])* new_base_w / base_w + x0;
c[2]=x[k+2][3] * new_base_w / base_w;
}
else
{
a[0] = Round((double) x[k][1] * ss );
a[2] = Round((double) x[k][3] * ss );
b[0] = Round((double) x[k+1][1] * ss );
b[2] = Round( (double)x[k+1][3] * ss );
c[0] = Round( (double)x[k+2][1] * ss );
c[2] = Round( (double)x[k+2][3] * ss );
}
if( flagy )
{
a[1] = yy0;
a[3] = x[k][4] * new_base_h / base_h;
b[1] = (x[k+1][2] - x[k][2]) * new_base_h / base_h + yy0;
b[3] = x[k+1][4] * new_base_h / base_h;
c[1] = (x[k+2][2] - x[k][2]) * new_base_h / base_h + yy0;
c[3] = x[k+2][4] * new_base_h / base_h;
}
else
{
a[1] = Round((double) x[k][2] * ss );
a[3] = Round((double) x[k][4] * ss );
b[1] = Round( (double)x[k+1][2] * ss );
b[3] = Round( (double)x[k+1][4] * ss );
c[1] = Round((double) x[k+2][2] * ss );
c[3] = Round((double) x[k+2][4] * ss );
}

double weight1=(double)x[k+1][5]/(double)(w*w);
double weight2=(double)x[k+2][5]/(double)(w*w);
double weight0=(double)(-(weight1*b[2]*b[3]+weight2*c[2]*c[3]))/(double)(a[2]*a[3]);
/*
feature1=M[a[0]][a[1]]+M[a[0]+a[2]][a[1]+a[3]]-M[a[0]][a[1]+a[3]]-M[a[0]+a[2]][a[1]];
feature2=M[b[0]][b[1]]+M[b[0]+b[2]][b[1]+b[3]]-M[b[0]][b[1]+b[3]]-M[b[0]+b[2]][b[1]];
feature3=M[c[0]][c[1]]+M[c[0]+c[2]][c[1]+c[3]]-M[c[0]][c[1]+c[3]]-M[c[0]+c[2]][c[1]];
*/

feature1=window->getval(a[0],a[1])+window->getval(a[0]+a[2],a[1]+a[3])-window->getval(a[0],a[1]+a[3])-window->getval(a[0]+a[2],a[1]);
feature2=window->getval(b[0],b[1])+window->getval(b[0]+b[2],b[1]+b[3])-window->getval(b[0],b[1]+b[3])-window->getval(b[0]+b[2],b[1]);
feature3=window->getval(c[0],c[1])+window->getval(c[0]+c[2],c[1]+c[3])-window->getval(c[0],c[1]+c[3])-window->getval(c[0]+c[2],c[1]);

value[j]=((double)(weight0*feature1)+(double)(weight1*feature2)+(double)(weight2*feature3)) > (double)(dat*y[j][0]) ? y[j][2]:y[j][1];
k=k+3;
}
...全文
174 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,246

社区成员

发帖
与我相关
我的任务
社区描述
OpenCV相关技术交流专区
计算机视觉人工智能opencv 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • OpenCV
  • 幻灰龙
  • OpenCV中国团队
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

OpenCV中国团队官方博客:https://blog.csdn.net/opencvchina

试试用AI创作助手写篇文章吧