1、#inc l ude “ c v . h“#inc l ude “ hi ghgui. h“#inc l ude #if def _Ei C#def i ne WI N 32#endifs t a t i c C vMe m S t or a ge* s t ora ge = 0;s t a t i c C vHa a r C l a s s i f i e r C a s c a de* c a s c a de = 0;void det e c t _and_dra w ( I plI m a ge* i m a ge ) ;c onst c har * c a s c a de_nam
2、e =“ haa r c a s c a de_f r onta l f a c e _al t . xm l “ ; / /人脸检测分类器i nt m a i n( i nt a r gc, c har * a r gv )C vCa pt ur e * c a pt ure = 0;I plI m a ge *f r a m e , *f r a m e _c opy = 0;i nt optl e n = s t r l e n( “ - - c a s c a de= “ ) ;c onst c har * i nput_nam e ;i f ( a r gc 1 i nput_nam
3、 e = a r gc 2 ? a r gv2 : 0;e l s ec a s c a de_nam e = “ E : 毕业设计智能机器人动态人脸识别系统陈建州程序. xm l “ ; / /分类器路径i nput_nam e = a r gc 1 ? a r gv1 : 0;c a s c a de = ( C vHa a r C l a s s i f i e r C a s c a de*) c vLoad( c a s c a de_nam e , 0, 0, 0 ) ;i f ( ! c a s c a de ) / /如果没有找到分类器,输出以下f pr i nt f ( s
4、t der r , “ E R R O R : C ould not l oa d c l a s s i f i e r c a s c a de n“ ) ;f pr i nt f ( s t der r ,“ U s a ge: f a c e det e c t - - c a s c a de= “ “ f i l e nam e | c a m e r a _index n“ ) ;r e t ur n - 1;s t ora ge = c vCr e a t e Me m S t or a ge( 0) ;c a pt ure = c vCa pt ur e F r om C A
5、 M( ! i nput_nam e ? 0 : i nput_nam e 0 - 0 ) ; / /读取摄像头i f ( ! c a pt ure ) / /如果没有摄像头读取视频文件c a pt ure = c vCa pt ur e F r om AVI ( “检测. a vi“ ) ;c vNa m e dWi ndow( “ r e s ult “ , 1) ; / /创建窗口i f ( c a pt ur e )f or ( ; ; )i f ( ! c vGr a bFr a m e ( c a pt ure ) ) / /从摄像头中抓取帧br e a k;f r a m e =
6、 c vRe t r i e ve F r a m e ( c a pt ure ) ; / /读取上边抓取的帧i f ( ! f r a m e )br e a k;i f ( ! f r a m e _c opy )f r a m e _copy = c vCr e a t e I m a ge( c vSi z e ( f r a m e - w i dt h, f r a m e - hei ght) ,I P L _DE P T H _8U, f r a m e - nChannel s ) ;i f ( f r a m e - or i gi n = = I P L _OR I G
7、 I N _TL )c vCopy(f r a m e , f r a m e _copy, 0 ) ;e l s ec vFl i p( f r a m e , f r a m e _c opy, 0 ) ;det e c t _and_dra w ( f r a m e _copy ) ;i f ( c vWa i t K e y( 10 ) = 0 )br e a k;c vRe l e a s e I m a ge( c vRe l e a s e C a pt ur e ( e l s e / /没检测到视频文件或者摄像头c onst c har * f i l e nam e =
8、( c har *) “检测. j pg“; / /读图片I plI m a ge* i m a ge = c vLoadI m a ge( f i l e nam e , 1 ) ;i f ( i m a ge )det e c t _and_dra w ( i m a ge ) ;c vWa i t K e y( 0) ;c vRe l e a s e I m a ge( e l s eF I L E * f = f open( f i l e nam e , “ r t “ ) ;i f ( f )c har buf 1000+1 ;w hil e ( f get s ( buf, 10
9、00,f ) )i nt l e n = ( i nt ) s t r l e n( buf) ;w hil e ( l e n 0 buf l e n = 0 ;i m a ge = c vLoadI m a ge( buf, 1 ) ;i f ( i m a ge )det e c t _and_dra w ( i m a ge ) ;c vWa i t K e y( 0) ;c vRe l e a s e I m a ge( f c l os e ( f ) ;c vDe s t r oyWi ndow( “ r e s ult “ ) ;r e t ur n 0;void det e
10、c t _and_dra w ( I plI m a ge* i m g )s t a t i c C vSc a l a r c olor s = 0,0, 255 , 0,128,255 , 0,255,255 , 0,255,0 , 255,128,0 , 255,255,0 , 255,0, 0 , 255,0, 255 ;double s c a l e = 1. 3;I plI m a ge* gr a y = c vCr e a t e I m a ge( c vSi z e ( i m g- w i dt h, i m g- hei ght) , 8, 1 ) ;I plI m
11、 a ge* s m a l l _i m g = c vCr e a t e I m a ge( c vSi z e ( c vRound( i m g- w i dt h/ s c a l e ) ,c vRound( i m g- hei ght/ s c a l e ) ) ,8, 1 ) ;i nt i ;c vCvt C olor ( i m g, gr a y , C V _BG R 2GR AY ) ;c vRe s i z e ( gr a y , s m a l l _i m g, C V _I N T E R _LI N E A R ) ;c vEqual i z e H
12、 i s t ( s m a l l _i m g, s m a l l _im g ) ;c vCl e a r Me m S t or a ge( s t ora ge ) ;i f ( c a s c a de )double t = ( double ) c vGe t T i c kCount( ) ;C vSe q* f a c e s = c vHa a r D e t e c t O bje c t s ( s m a l l _i m g, c a s c a de, s t ora ge,1. 1, 2,0/ *CV _HA A R _DO _CA N N Y _ P R
13、U N I N G */ ,c vSi z e ( 30, 30) ) ; / /检测人脸返回矩形人脸t = ( double ) c vGe t T i c kCount( ) - t ;pr i nt f ( “ det e c t i on t i m e = % gm s n“, t / ( ( double ) c vGe t T i c kFr e quenc y( ) *1000.) ) ;f or ( i = 0; i t ot a l : 0) ; i + + ) / /找到矩形中心,把矩形转化为圆形C vRe c t * r = ( C vRe c t *) c vGe t
14、 S e qEl e m ( f a c e s , i ) ;C vPoi nt c e nt e r ;i nt r a dius ;c e nt e r . x = c vRound( r - x + r - w i dt h*0.5)*s c a l e ) ;c e nt e r . y = c vRound( r - y + r - hei ght*0.5) *sc a l e ) ;r a dius = c vRound( r - w i dt h + r - hei ght) *0.25*sc a l e ) ;c vCi r c l e ( i m g, c e nt e r
15、 , r a dius , c olor s i % 8 , 3, 8, 0 ) ;c vShowI m a ge( “ r e s ult “ , i m g ) ;c vRe l e a s e I m a ge( c vRe l e a s e I m a ge( O penCV的人脸检测主要是调用训练好的c a s c a de(H a a r分类器)来进行模式匹配。c vHa a r D e t e c t O bje c t s,先将图像灰度化,根据传入参数判断是否进行c a nny边缘处理(默认不使用),再进行匹配。匹配后收集找出的匹配块,过滤噪声,计算相邻个数如果超过了规定值(
16、传入的m i n_nei ghbors)就当成输出结果,否则删去。匹配循环:将匹配分类器放大s c a l e(传入值)倍,同时原图缩小s c a l e倍,进行匹配,直到匹配分类器的大小大于原图,则返回匹配结果。匹配的时候调用c vRunHa a r C l a s s i f i e r C a s c a d e来进行匹配,将所有结果存入C vSe q* S e q(可动态增长元素序列),将结果传给c vHa a r D e t e c t O bje c t s。c vRunHa a r C l a s s i f i e r C a s c a de函数整体是根据传入的图像和c a
17、s c a de来进行匹配。并且可以根据传入的c a s c a de类型不同(树型、s t um p(不完整的树)或其他的),进行不同的匹配方式。函数c vRunHa a r C l a s s i f i e r C a s c a de用于对单幅图片的检测。在函数调用前首先利用c vSe t I m a ges F orH a a r C l a s s i f i e r C a s c a de设定积分图和合适的比例系数( = 窗口尺寸)。当分析的矩形框全部通过级联分类器每一层的时返回正值(这是一个候选目标),否则返回0或负值。为了了解O penCV人脸检测中寻找匹配图像的详细过程,
18、就把c vHa a r D e t e c t O bje c t s和c vRunHa a r C l a s s i f i e r C a s c a de的源文件详细看了一遍,并打上了注释。方便大家阅读。附c vHa a r D e t e c t O bje c t s代码:C V _I MP L C vSe q*c vHa a r D e t e c t O bje c t s ( c onst C vAr r * _im g,C vHa a r C l a s s i f i e r C a s c a de* c a s c a de,C vMe m S t or a ge*
19、s t ora ge, double s c a l e _f a c t or ,i nt m i n_nei ghbors , i nt f l a gs , C vSi z e m i n_si z e )i nt s pli t _s t a ge = 2;C vMa t s t ub, *im g = ( C vMa t *) _im g;/ / C vMa t多通道矩阵*im g=_i m g指针代换传入图C vMa t *t e m p = 0, *s um = 0, *t i l t e d = 0, *sqs um = 0, *norm _im g = 0, *sum c a
20、 nny = 0,*im g_sm a l l = 0;C vSe q* s e q = 0;C vSe q* s e q2 = 0;/ / C vSe q可动态增长元素序列C vSe q* i dx_se q = 0;C vSe q* r e s ult _s e q = 0;C vMe m S t or a ge* t e m p_st ora ge = 0;C vAvgCom p* c om ps = 0;i nt i ;#if def _OP E N MPC vSe q* s e q_thr e a d C V_MA X _THR E A D S = 0;i nt m a x_thr
21、e a ds = 0;#endifC V _FU N C N A M E ( “ c vHa a r D e t e c t O bje c t s ” ) ;_BE G I N _;double f a c t or ;i nt npas s = 2, c oi;/ / npas s = 2i nt do_ca nny_pruning = f l a gs / / t r ue做c a nny边缘处理i f ( ! C V_I S _HA A R _CL A S S I F I E R ( c a s c a de) )C V _ER R O R ( ! c a s c a de ? C V
22、 _St s N ull P t r : C V _St s Ba dAr g, “ I nval i d c l a s s i f i e rc a s c a de” ) ;i f ( ! s t or a ge )C V _ER R O R ( C V _St s N ull P t r , “ N ull s t ora ge point e r ” ) ;C V _CA L L ( i m g = c vGe t Ma t ( i m g, i f ( c o i )C V _ER R O R ( C V _Ba dCO I ,“C O I i s not s upport e d
23、”) ;/ /一些出错代码i f ( C V _MAT _DE P T H( i m g- t ype) ! = C V _8U)C V _ER R O R ( C V _St s Uns upport e dFor m a t , “ O nly 8- bit i m a ge s a r e s upport e d ” ) ;C V _CA L L ( t e m p = c vCr e a t e Ma t ( i m g- r ows , i m g- c ols , C V _8UC 1 ) ) ;C V _CA L L ( s um = c vCr e a t e Ma t (
24、i m g- r ows + 1, i m g- c ols + 1, C V _32SC 1 ) ) ;C V _CA L L ( s qsum = c vCr e a t e Ma t ( i m g- r ows + 1, i m g- c ols + 1, C V_64FC 1 ) ) ;C V _CA L L ( t e m p_st ora ge = c vCr e a t e C hil dMe m S t or a ge( s t ora ge ) ) ;#if def _OP E N MPm a x_thr e a ds = c vGe t N um T hr e a ds
25、( ) ;f or ( i = 0; i hid_ca s c a de )C V _CA L L ( i c vCr e a t e H i dHa a r C l a s s i f i e r C a s c a de( c a s c a de) ) ;i f ( c a s c a de- hid_ca s c a de- has _t i l t e d_fe a t ur e s )t i l t e d = c vCr e a t e Ma t ( i m g- r ows + 1, i m g- c ols + 1, C V _32SC 1 ) ; / /多通道矩阵图像长宽+
26、 1 4通道s e q = c vCr e a t e S e q( 0, s i z e of ( C vSe q) , s i z e of ( C vRe c t ) , t e m p_st ora ge ) ; / /创建序列s e q矩形s e q2 = c vCr e a t e S e q( 0, s i z e of ( C vSe q) , s i z e of ( C vAvgCom p) , t e m p_st or a ge ) ; / /创建序列s e q2矩形和邻近r e s ult _s e q = c vCr e a t e S e q( 0, s i z
27、e of ( C vSe q) , s i z e of ( C vAvgCom p) , s t or a ge ) ; / /创建序列r e s ult _s e q矩形和邻近i f ( m i n_nei ghbors = = 0 )s e q = r e s ult _s e q;i f ( C V _MAT _CN ( i m g- t ype) 1 )c vCvt C olor ( i m g, t e m p, C V _BG R 2GR AY ) ;/ / i m g转为灰度i m g = t e m p;i f ( f l a gs / / C vSi z e w i n_s
28、i z e 0为分类器的原始大小i nt us e _ipp = c a s c a de- hid_ca s c a de- i pp_st a ges ! = 0 / / I P P相关函数i f ( us e _ipp )C V _CA L L ( norm _im g = c vCr e a t e Ma t ( i m g- r ows , i m g- c ols , C V _32FC 1 ) ) ;/ /图像的矩阵化4通道.C V _CA L L ( i m g_sm a l l = c vCr e a t e Ma t ( i m g- r ows + 1, i m g- c
29、 ols + 1, C V _8UC 1 ) ) ;/ /小图矩阵化单通道长宽+ 1f or ( f a c t or = 1; ; f a c t or *= s c a l e _f a c t or )/ /成s c a l e _f a c t or倍数匹配i nt posi t i ve = 0;i nt x, y;C vSi z e w i n_si z e = c vRound(w i n_si z e 0. w i dt h*fa c t or) ,c vRound(w i n_si z e 0. hei ght*f a c t or ) ;/ / w i ns i z e分类
30、器行列(扩大f a c t or倍)C vSi z e s z = c vRound( i m g- c ols / f a c t or ) , c vRound( i m g- r ows / f a c t or ) ;/ / s z图像行列(缩小f a c t or倍)三个C vs i z eC vSi z e s z 1 = s z . w i dt hw i n_si z e 0. w i dt h, s z . hei ghtw i n_si z e 0. hei ght ;/ / s z 1图像减分类器行列C vRe c t r e c t 1 = i c v_obje c t
31、 _wi n_border , i c v_obje c t _wi n_border ,w i n_si z e 0. w i dt hi c v_obje c t _wi n_border *2,/ / i c v_obje c t _wi n_border(i nt)初始值= 1w i n_si z e 0. hei ghti c v_obje c t _wi n_border *2 ;/ /矩形框r e c t 1C vMa t i m g1, s um 1, s qsum 1, norm 1, t i l t e d1, m a s k1;/ /多通道矩阵C vMa t * _t i
32、 l t e d = 0;i f ( s z 1. w i dt h 跳出br e a k;i f ( w i n_si z e . w i dt h 继续c onti nue;/ / C V _8UC 1见定义./ / #def i ne C V _MA K E T Y P E ( dept h, c n) ( ( dept h) + ( ( ( c n) - 1) dat a . pt r ) ;/ /小图的矩阵化i m g1单通道s um 1 = c vMa t ( s z . hei ght+ 1, s z . w i dt h+1, C V _32SC 1, s um - dat a
33、 . pt r ) ;/ /长宽+ 1 4通道8位多通道矩阵s qsum 1 = c vMa t ( s z . hei ght+ 1, s z . w i dt h+1, C V _64FC 1, s qsum - dat a . pt r ) ;/ /长宽+ 1 4通道16位i f ( t i l t e d )t i l t e d1 = c vMa t ( s z . hei ght+ 1, s z . w i dt h+1, C V _32SC 1, t i l t e d- dat a . pt r ) ; / /长宽+ 1 4通道8位_t i l t e d = / /长宽+ 1
34、 4通道8位norm 1 = c vMa t ( s z 1.hei ght, s z 1.w i dt h, C V _32FC 1, norm _im g ?norm _im g- dat a . pt r : 0 ) ; / / norm 1图像减分类器行列4通道m a s k1 = c vMa t ( s z 1. hei ght, s z 1. w i dt h, C V _8UC 1, t e m p- dat a . pt r ) ;/ / m a s k1灰度图c vRe s i z e ( i m g, / / i m g双线性插值输出到i m g1c vInt e gr a
35、 l ( / /计算积分图像i f ( us e _ipp / / m a s k1赋值为255f or ( i = 0; i c ount; i + + )i f ( i c vApplyHa a r C l a s s i f i e r _32s32f_C1R_p(s um 1.dat a . i , s um 1. s t e p,norm 1. dat a . f l , norm 1. s t e p, m a s k1.dat a . pt r , m a s k1.s t e p,s z 1, / /匹配图像.posi t i ve + = m a s k1.dat a . p
36、t r m a s k1.s t e p*y + x ;i f ( posi t i ve 0 )f or ( y = 0; y r ows + 1, i m g- c ols + 1, C V _32SC 1 ) ;/ /如果做c a nny边缘检测c vCa nny(i m g, t e m p, 0, 50, 3 ) ;c vInt e gr a l ( t e m p, s um c a nny ) ;i f ( ( unsi gned) s pli t _s t a ge = ( unsi gned) c a s c a de- c ount| |c a s c a de- hid_
37、ca s c a de- i s _t r e e )s pli t _s t a ge = c a s c a de- c ount;npas s = 1;f or ( f a c t or = 1; f a c t or *ca s c a de- or i g_wi ndow_si z e . w i dt h c ols10 f a c t or *= s c a l e _f a c t or )c onst double ys t e p = MA X ( 2, f a c t or ) ;C vSi z e w i n_si z e = c vRound(c a s c a de
38、- or i g_wi ndow_si z e . w i dt h * f a c t or ) ,c vRound(c a s c a de- or i g_wi ndow_si z e . hei ght * f a c t or ) ;C vRe c t e qu_re c t = 0, 0, 0, 0 ;i nt *p0 = 0, *p1 = 0, *p2 = 0, *p3= 0;i nt *pq0= 0, *pq1= 0, *pq2= 0, *pq3= 0;i nt pas s , s t a ge_off s e t = 0;i nt s t op_hei ght = c vRo
39、und( i m g- r ows w i n_si z e . hei ght) / ys t e p);i f ( w i n_si z e . w i dt h dat a . pt r + e qu_re c t . y*sum c a nny- s t e p) + e qu_re c t . x;p1 = ( i nt *) ( s um c a nny- dat a . pt r + e qu_re c t . y*sum c a nny- s t e p)+ e qu_re c t . x + e qu_re c t . w i dt h;p2 = ( i nt *) ( s
40、um c a nny- dat a . pt r + ( e qu_re c t . y +e qu_re c t . hei ght) *s um c a nny- s t e p) + e qu_re c t . x;p3 = ( i nt *) ( s um c a nny- dat a . pt r + ( e qu_re c t . y +e qu_re c t . hei ght) *s um c a nny- s t e p)+ e qu_re c t . x + e qu_re c t . w i dt h;pq0= ( i nt *) ( s um - dat a . pt
41、r + e qu_re c t . y*sum - s t e p) + e qu_re c t . x;pq1= ( i nt *) ( s um - dat a . pt r + e qu_re c t . y*sum - s t e p)+ e qu_re c t . x + e qu_re c t . w i dt h;pq2 = ( i nt *) ( s um - dat a . pt r + ( e qu_re c t . y + e qu_re c t . hei ght) *s um - s t e p) +e qu_re c t . x;pq3= ( i nt *) ( s
42、 um - dat a . pt r + ( e qu_re c t . y + e qu_re c t . hei ght) *s um - s t e p)+ e qu_re c t . x + e qu_re c t . w i dt h;c a s c a de- hid_ca s c a de- c ount = s pli t _s t a ge;/ /分裂级f or ( pas s = 0; pas s #inc l ude #inc l ude “ c v . h“#inc l ude “ hi ghgui. h“/ / * C hange t his t o youri ns
43、 t a l l l oc a t i on! */ / *#def i ne O P E N C V _ R O O T “ C : / P r ogra m F i l e s / O penCV “/ / *void dis pl a yDe t e c t i ons( I plI m a ge * pI npIm g, C vSe q * pFa c e R e c t S e q, c har * F i l e N a m e ) ;i nt m a i n( i nt a r gc, c har * a r gv)/ / var i a bl e sI plI m a ge *
44、 pI npIm g = 0;C vHa a r C l a s s i f i e r C a s c a de * pCa s c a de = 0; / / t he f a c e det e c t orC vMe m S t or a ge * pSt ora ge = 0; / / m e m or y f or det e c t or t o us eC vSe q * pFa c e R e c t S e q; / / m e m or y- a c c e s s i nt e r f a c e/ / us a ge c hec ki f ( a r gc n“, a
45、 r gv0) ;e xi t ( - 1);/ / i ni t i a l i z a t i onspI npIm g = ( a r gc 1) ? c vLoadI m a ge( a r gv1 , C V _LO A D _I MA G E _CO L O R ) : 0;pSt or a ge = c vCr e a t e Me m S t or a ge( 0);pCa s c a de = ( C vHa a r C l a s s i f i e r C a s c a de *) c vLoad( ( O P E N C V _RO O T “ / dat a / h
46、aa r c a s c a des / haa r c a s c a de_f r onta l f a c e _def a ult . xm l “ ) ,0, 0, 0 ) ;/ / val i da t e t hat e ver yt hing i ni t i a l i z e d pr oper l yi f ( ! pInpIm g | | ! pSt ora ge | | ! pCa s c a de )pr i nt f ( “ I ni t i a l i z a t i on f a i l e d: % s n“,( ! pInpIm g) ? “ c a n
47、t l oa d i m a ge f i l e “ :( ! pCa s c a de) ? “ c a n t l oa d haa r - c a s c a de - - “ m a ke s ur e pat h i s c or r e c t “ :“ unabl e t o a l l oc a t e m e m or y f or dat a s t ora ge“ , a r gv1) ;e xi t ( - 1);/ / det e c t f a c e s i n i m a gepFa c e R e c t S e q = c vHa a r D e t e
48、c t O bje c t s( pI npIm g, pCa s c a de, pSt or a ge,1. 1, / / i nc r e a s e s e a r c h s c a l e by 10%e a c h pas s3, / / m e r ge gr oupsof t hr e e det e c t i onsC V _HA A R _DO _CA N N Y _PR U N I N G , / / s kip r e gions unli kel y t o c onta i n a f a c ec vSi z e ( 40,40) ; / / s m a l
49、l e s t s i z e f a c e t o det e c t = 40x40/ / dis pl a y det e c t e d f a c e sdis pl a yDe t e c t i ons( pI npIm g, pFa c e R e c t S e q, a r gv1) ;/ / c l e a n up a nd r e l e a s e r e s ourc e sc vRe l e a s e I m a ge( i f ( pCa s c a de) c vRe l e a s e Ha a r C l a s s i f i e r C a s c a de( i f (