OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 3173|回复: 3

adaboost嵌入式实现问题

[复制链接]
发表于 2017-11-30 15:57:26 | 显示全部楼层 |阅读模式
我用的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;
        }

回复

使用道具 举报

发表于 2017-12-1 10:24:40 | 显示全部楼层
我们在dsp 下也是采用adaboost + haar 运行,采用的是滑动检测框,没有用缩放图像,程序是可以运行的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-1 18:18:03 | 显示全部楼层
zdyy 发表于 2017-12-1 10:24
我们在dsp 下也是采用adaboost + haar 运行,采用的是滑动检测框,没有用缩放图像,程序是可以运行的 ...

我的这个也能运行,但是检测不出来,不知道算法哪里有问题。你的程序能给我发一份吗?谢谢。lssf1776@163.com
回复 支持 反对

使用道具 举报

发表于 2017-12-1 19:47:42 | 显示全部楼层
lss1776 发表于 2017-12-1 18:18
我的这个也能运行,但是检测不出来,不知道算法哪里有问题。你的程序能给我发一份吗?谢谢。 ...

抱歉,我的代码不能分享给你,你好好检查下,应该能确认问题在哪块
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-27 04:50 , Processed in 0.011824 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表