Está en la página 1de 30

Deteccin de Caras.

Caractersticas Haar basadas en una cascada de clasificadores.

Miguel Crdova Ak. 25/10/2011

Tabla de contenido
Tabla de contenido.............................................................................................. 2 Introduccin........................................................................................................ 3 Instalar OpenCV-2.3.1 en un ambiente indo!s " indo!s #$............................%

&eali'ar pruebas con clasificadores Haar............................................................( )ntrenar * usar clasificadores Haar..................................................................10 )+perimentos de ,etecciones...........................................................................1% -alsos positi.os "/o caras clasificadas como caras.- 02.10 1$.........................1# -alsos ne2ati.os "Caras clasificadas como no caras.- 2.33 1$.........................1( Conclusiones..................................................................................................... 14 &eferencias ...................................................................................................... 20 5ne+o 5 ............................................................................................................ 21 5ne+o 6............................................................................................................. 23

20

Introduccin
Caractersticas aar basadas en una cascada de clasi!icadores.

)ste m7todo para la deteccin de ob8etos fue propuesto por 9aul Viola * me8orado por &ainer :ien;art. <n clasificador "es decir= una cascada de clasificadores es impulsado a traba8ar con caractersticas ;aar-li>e$ se entrena con cientos de im?2enes @ue contienen el determinado ob8eto "por e8emplo= una cara o un coc;e$= llamados e8emplos positi.os= @ue se adaptan al mismo tamaAo "por e8emplo 20 + 20 pi+eles$= * e8emplos ne2ati.os= im?2enes arbitrarias del mismo tamaAo. ,espu7s de @ue un clasificador se entrena= se puede aplicar a una determinada re2in de inter7s "del mismo tamaAo @ue se ;a utili'ado durante el entrenamiento$ en una ima2en de entrada. )l clasificador 2enera un B1C si la re2in es probable @ue conten2a muestre el ob8eto "es decir la cara el coc;e$= * B0C en caso contrario. 9ara buscar el ob8eto en toda la ima2en se puede mo.er la .entana de bDs@ueda a tra.7s de la ima2en * comprobar todas la localidades con el clasificador. )l clasificador est? diseAado para @ue pueda ser modificado de tamaAo f?cilmente con el fin de ser capa' de encontrar el ob8eto de inter7s en diferentes tamaAos= @ue es m?s eficiente @ue cambiar el tamaAo de la ima2en en s. 9or lo tanto para encontrar un ob8eto de un tamaAo desconocido en la ima2en el procedimiento de barrido debe ;acerse .arias .eces a diferentes escalas. :a palabra BcascadaC en el nombre del clasificador si2nifica @ue el clasificador resultante se compone de .arios clasificadores simples "etapas$ @ue se aplican posteriormente a una re2in de inter7s ;asta @ue en al2Dn momento el candidato es rec;a'ado o ;a aprobado todas las todas las etapas. :a palabra BimpulsoC si2nifica @ue los clasificadores en cada etapa de la cascada son comple8os ellos mismo * se constru*en a partir de los clasificadores b?sicos utili'ando una de las cuatro t7cnicas diferentes de BboostC. 5ctualmente 5da6oost ,iscreto= 5da6oost &eal= 5da6oost Eua.e= 5da6oost :o2ico son los soportados. :os clasificadores b?sicos son ?rboles de decisin= clasificadores con 2 ;o8as. :as caractersticas Haar-:i>e son las entradas de los clasificadores b?sicos= * se calculan como se describe a continuacin. )l al2oritmo actual utili'a los si2uientes caractersticas Haar-:i>eF

20

:as caractersticas a utili'ar en un clasificador se especifican por su forma "1a= 2a= etc.$= la posicin dentro de la re2in de inter7s * de la escala "esta escala no es la misma @ue la escala utili'ada en la etapa de deteccin= aun@ue estas dos escalas son multiplicado$. 9or e8emplo= en el caso de la caracterstica lineal "2c$ la respuesta se calcula como la diferencia entre la suma de los pi+eles de la ima2en en rect?n2ulo @ue abarcan la funcin de con8unto "las dos fran8as blancas * la fran8a de ne2ro del centro$ * la suma de los pi+eles de la ima2en en la fran8a de ne2ro= multiplicado por 3 en el fin de compensar las diferencias en el tamaAo de la ?reas. :a suma de los .alores de los pi+eles en una re2in rectan2ular se calcula r?pidamente usando las im?2enes inte2rales.

20

Instalar OpenCV-2.3.1 en un ambiente " indo!s #$

indo!s

1.- ,escar2ar el arc;i.o "#enC$%2.&.1%'in%su#er#ack de la si2uiente direccinF ;ttpFGGsourcefor2e.netGpro8ectsGopenc.librar*GfilesGopenc.-!inG2.3.1G 2. ,espu7s de ;aber descar2ado el arc;i.o "#enC$%2.&.1%'in%su#er#ack lo e8ecutamos= seleccionamos la unidad C * presionamos el botn )+tract como se muestra en la si2uiente ima2en.

3.- 5;ora descar2amos la librera e+tra tbb&0(20110)2*oss de la si2uiente direccinF ;ttpFGGt;readin2buildin2bloc>s.or2G.er.p;pHfidI1#1 Eeleccionamos la librera correspondiente a tbb&0(20110)2*oss('in.+i# indo!sJ

,espu7s de ;aber descar2ado la librera= la descomprimimos en la si2uiente rutaF C:\opencv\build\common 3.- 5;ora .amos a las propiedades del e@uipo - confi2uracin a.an'ada del sistema= debe poder .isuali'ar una pantalla similar a la si2uiente ima2en.

20

0.- 9resionamos el botn Variables de entorno * editamos la .ariable del sistema ,AT a la cual le aAadimos las si2uientes rutasF
C:\opencv\build\x86\vc10\bin;C:\opencv\build\common\tbb30_20110427oss\bin\i 32\vc10

20

20

&eali'ar pruebas con clasificadores Haar


! " "e li# " l s p"ueb s debemos implement " un cl se en l cu l se $ % uso de l &unci'n cvHaarDetectObjects ()e" *nexo *+,

- si p"e&ie"e puede desc "% " un .it con est s cl ses con l lib"e"/ neces "i s p " empe# " t" b 0 " de l si%uiente di"ecci'n: http://www.iem.pw.edu.pl/~domanskj/haarkit.rar1 p " este p"o2ecto desc "% mos el 3it1 poste"io"mente lo descomp"imimos en l c "pet $ " en el disco C,

1. 5l descomprimirlo obtenemos dos nue.os arc;i.osF &)5,KTHIEK-I&ET.t+t tools.rar

2.- ,escomprimimos el arc;i.o tools.rar= ;asta a;ora debemos tener los si2uientes arc;i.osF Cascade2+ml Temp TestKreco2nition Haar>it.rar HaarTrainin2.bat &)5,KTHIEK-I&ET.t+t EamplesKcreation.bat Tools.rar

3,4 !o" $o" solo nos inte"es l c "pet Test_recognition= na.e2amos dentro de ella *

debemos .isuali'ar los si2uientes arc;i.osF c.04#.dll c+core04#.dll dane.+ml facedetect.e+e ;i2;2ui04#.dll start.bat

9ara reali'ar las pruebas ;aremos uso del comando !acedetect.e-e= para m?s detalle de este comando podemos editar el arc;i.o start.bat. 0.- Eeleccionamos im?2enes @ue conten2an rostros= a;ora copiamos dic;as im?2enes en la carpeta Test(recognition. %. )ntramos a la lnea de comandos "ms-dos$= * na.e2amos ;asta la direccin de la carpeta Test(recognition= tecleamos lo si2uienteF

20

facedetect.e+e LcascadeICdane.+mlC nombreKima2en.e+tensin "8p2=bmp=p2m=etc$ )8emplo del comandoF

50emplo de detecci'n:

6,4 7i 8ue"emos "e li# " ot" s p"ueb s1 po" e0emplo detecci'n de o0os podemos $ ce" uso de cl si&ic do"es p"opo"cion dos po" l lib"e"/ OpenCV- .!."; p " ello nos di"i%imos l si%uiente di"ecci'n C:\opencv\data\haarcascades si usted descomp"imi' -penC)42,3,1 en l unid d C, 5n dic$ di"ecci'n podemos encont" " dive"sos cl si&ic do"es,

20

.ntrenar / usar clasi!icadores


9os p sos p " ent"en " 2 us " cl si&ic do"es : 2, " son:

aar

1. Colecciones de im;%enes positiv s 2 ne% tiv s p " el ent"en miento, 3. C"e " el "c$ivo vector.vec us ndo createsamples.cpp 0. 5nt"en " el cl si&ic do" us ndo haartrainin#.cpp %. Co""e" el cl si&ic do" us ndo l &unci'n cvHaarDetectObjects$%,
=od s est s cl ses se encuent" n en l si%uiente "ut : C:\opencv\modules\$ "t" inin% si usted descomp"imi' l lib"e"/ en l unid d C con excepci'n de l cl se objectmarker.cpp ()e" *nexo >+, - si p"e&ie"e puede desc "% " un .it con tod s est s cl ses 2 p"ep " d s p " empe# " t" b 0 " de l si%uiente di"ecci'n: http://www.iem.pw.edu.pl/~domanskj/haarkit.rar1 p " este p"o2ecto desc "% mos el 3it1 poste"io"mente lo descomp"imimos en l c "pet haar el disco C, < "c " l s im;%enes positiv s us ndo objectmarker.cpp

1. 5l descomprimirlo obtenemos dos arc;i.os nue.osF &)5,KTHIEK-I&ET.t+t tools.rar

2.- ,escomprimimos el arc;i.o tools.rar= ;asta a;ora debemos tener los si2uientes arc;i.osF Cascade2+ml Temp TestKreco2nition Haar>it.rar HaarTrainin2.bat &)5,KTHIEK-I&ET.t+t EamplesKcreation.bat Tools.rar

3.- )n la carpeta B..MtempMne2ati.eC 2uardamos las im?2enes @ue no conten2an el Bob8etoC @ue deseamos sea reconocido. Creamos la lista de im?2enes para posteriormente 2uardarlo en el arc;i.o in!o!ile.t-t )l arc;i.o in!o!ile.t-t debe contener lneas comoF o ima2e2314.6N9 o ima2e2320.6N9 9odemos usar el arc;i.o create(list.bat para crear la lista de im?2enes.

0.- )n la carpeta B..MtempMpositi.esMra!dataC 2uardamos las im?2enes @ue contienen el ob8eto deseado.

20

<samos la ;erramienta ..MtempMpositi.eMob0ect1arker.e-e= esta ;erramienta nos permite especificar las coordenadas += *= el anc;o * alto del ob8eto determinado dentro de la ima2enJ a su .e' crea un arc;i.o in!o.t-t el cual especifica la informacin antes mencionada de la ima2en. /otaF :a ;erramienta ob0ect1arker.e-e solo traba8a con im?2enes bmp. %.- 9ara el entrenamiento usaremos la ;erramienta createsa1#les.e-e <tili'amos el si2uiente comandoF Bcreatesa1#les.e-e -info positi.eGinfo.t+t -.ec dataG.ector..ec -num 103 -! 20 -; 20C )l cual creara un arc;i.o vector.vec en la carpeta MtempMdata. :os par?metros sonF num 1(00 nDmero de im?2enes positi.as. ! 20 L; 20 )8emplo de tamaAo.

3.- ,espu7s de crear el arc;i.o vector.vec podemos iniciar con el entrenamiento= e8ecutamos el si2uiente comandoF B2aartraining.e-e -data dataGcascade -.ec dataG.ector..ec -b2 ne2ati.eGinfofile.t+t -npos 103 -nne2 3% -nsta2es 20 -mem 1000 -mode 5:: -! 20 -; 20 Lnons*mC :os par?metros sonF data dataGcascade &uta de los arc;i.os de cascada. Cada etapa completada creara un arc;i.o en MtempMdataMcascadeM0../M5da6oostC5&THaarClassifier.t+t .ec dataG.ector..ec createsamples.e+e b2 ne2ati.eGinfofile.t+t MtempMne2ati.eM npos 103 nne2 3% nsta2es 20 mem 1000 pro2rama 5rc;i.o @ue se creo con :ista de las im?2enes ne2ati.as /Dmero de im?2enes positi.as /Dmero de im?2enes ne2ati.as /Dmero de etapas para completar Cantidad de memoria disponible asi2nada al

20

mode 5:: par?metro ! 20 -; 20 nons*m sim7trico ;ori'ontal

Vea la literatura para m?s detalles de este )8emplo de tamaAo )ste par?metro no es necesario si el ob8eto es

9odemos usar el arc;i.o 2aarTraining.bat. 5l correr el comando 2aartraining.e-e obtenemos una salida similar a la si2uienteF KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 9arent nodeF 1# OOO 1 cluster OOO 9OEF 13%3 1#44 0.420%11 /)PF 2010 1.4#2(4e-00% 65CQP&O</, 9&OC)EEI/P TIN)F 12#4.34 9recalculation timeF 33.20 R----R----R-R---------R---------R---------R---------R S / S1EN9S-S ET.TH& S H& S -5 S )T9. )&&S R----R----R-R---------R---------R---------R---------R S 1S1001S-S-0.312%40S 1.000000S 1.000000S 0.2%32#2S R----R----R-R---------R---------R---------R---------R S 2S1001S-S-0.%3#003S 1.000000S 1.000000S 0.24033(S R----R----R-R---------R---------R---------R---------R S 3S1001S-S-0.##30(4S 1.000000S 1.000000S 0.23(0#2S R----R----R-R---------R---------R---------R---------R S 0S1001S-S-1.01%23#S 1.000000S 1.000000S 0.230(#4S R----R----R-R---------R---------R---------R---------R S %S 431S-S-1.120303S 0.4434(1S 0.434#10S 0.2022%3S R----R----R-R---------R---------R---------R---------R S 3S (01S-S-1.0#1341S 0.4434(1S 0.4%3032S 0.21((((S R----R----R-R---------R---------R---------R---------R S #S (21S-S-1.1(#230S 0.4434(1S 0.4044%4S 0.230434S R----R----R-R---------R---------R---------R---------R S (S (31S-S-1.204344S 0.44%##3S 0.(4#%10S 0.2133#%S R----R----R-R---------R---------R---------R---------R S 4S (31S-S-1.1(#14%S 0.44%134S 0.(0(%0(S 0.143#%0S R----R----R-R---------R---------R---------R---------R S 10S (11S-S-1.332130S 0.44%134S 0.((004(S 0.1#(032S R----R----R-R---------R---------R---------R---------R S 11S (31S-S-1.%24%((S 0.44%##3S 0.((132(S 0.140113S R----R----R-R---------R---------R---------R---------R S 12S (11S-S-1.%24243S 0.44%134S 0.(%4#%1S 0.1#(%%0S R----R----R-R---------R---------R---------R---------R S 13S (01S-S-1.0#1133S 0.44%134S 0.(20332S 0.13%#3%S

20

R----R----R-R---------R---------R---------R---------R S 10S (01S-S-1.034(%#S 0.44%134S 0.#4#04%S 0.1%#(4%S R----R----R-R---------R---------R---------R---------R S 1%S #41S-S-1.333(3(S 0.44%134S 0.#%%302S 0.1042(#S R----R----R-R---------R---------R---------R---------R S 13S ##1S-S-1.3%#24#S 0.44%134S 0.#24003S 0.10(303S R----R----R-R---------R---------R---------R---------R S 1#S ##1S-S-1.3%0420S 0.44%134S 0.34(#%%S 0.102(42S R----R----R-R---------R---------R---------R---------R S 1(S ##1S-S-1.2(3(#3S 0.44%134S 0.3%#231S 0.1001(#S R----R----R-R---------R---------R---------R---------R S 14S #31S-S-1.300#43S 0.44%134S 0.3034(3S 0.13#233S R----R----R-R---------R---------R---------R---------R S 20S #%1S-S-1.2%(#24S 0.44%134S 0.30#0%0S 0.13%022S R----R----R-R---------R---------R---------R---------R S 21S #%1S-S-1.2%4003S 0.44%134S 0.%40303S 0.12000#S R----R----R-R---------R---------R---------R---------R S 22S #%1S-S-1.20#343S 0.44%134S 0.%#(00(S 0.121204S R----R----R-R---------R---------R---------R---------R S 23S #01S-S-1.1(4301S 0.44%134S 0.%34014S 0.11(#40S R----R----R-R---------R---------R---------R---------R S 20S #01S-S-1.2#(121S 0.44%134S 0.%0#303S 0.113(22S R----R----R-R---------R---------R---------R---------R S 2%S #31S-S-1.1401(#S 0.44%134S 0.%03#30S 0.11%30#S R----R----R-R---------R---------R---------R---------R S 23S #31S-S-1.2130%2S 0.44%134S 0.0(0232S 0.1101(2S R----R----R-R---------R---------R---------R---------R Eta2e trainin2 timeF ##((.0% U/umber of used featuresF 23 9arent nodeF 1# C;osen number of splitsF 0 Total number of splitsF 0 Tree Classifier Eta2e R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R S 0S 1S 2S 3S 0S %S 3S #S (S 4S 10S 11S 12S 13S 10S 1%S 13S 1#S 1(S R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R---R 0---1---2---3---0---%---3---#---(---4--10--11--12--13--10--1%--13--1#--1( KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 9odemos se2uir despu7s de la finali'acin de las todas la etapas o parar despu7s del .alor de la falsa alarma @ue es VI1O10e-%. 9or e8emploF 9arent nodeF 1#

20

OOO 1 cluster OOO 9OEF 13%3 1#44 0.420%11 /)PF 2010 1.4#2(4e-00% esto es una falsa alarma.

#.- 5;ora copiamos todas los carpetas @ue se encuentran MtempMdataMcascade estas carpetas est?n nombradas de B0C a B/C "/ es el nDmero de etapas completadas$. )n cada una de estas carpetas debe de ;aber un arc;i.o Ada3oostCA4T aarClassi!ier.t-t. Copiamos todas estas de 0 a / carpetas a ..Mcascade2+mlMdata catalo2ue. (.- 5;ora con.ertiremos los arc;i.os de cascada a un arc;i.o +ml= para eso usaremos la ;erramienta Mcascade2+mlM2aarconv.e-e )l comando a e8ecutar es el si2uienteF B2aarconv.e-e data output.+ml 20 20C :os par?metros sonF data output.+ml 20 20 /ombre del arc;i.o +ml @ue se 2enerara. )8emplo de tamaAo.

4.- &eali'ar la prueba de reconocimiento= copiamos el arc;i.o out#ut.-1l a la carpeta MtestKreco2nition <saremos el si2uiente comandoF !acedetect.e-e --cascadeIUoutput.+mlU ima2en.8p2 10.- :a base de datos de im?2enes utili'ada cuenta con 103 im?2enes= 10( positi.as * 3% ne2ati.asJ las im?2enes fueron tomadas de 14 mu8eres * 1 ;ombre del Instituto de )ducacin Comercial 6ancario. 5 continuacin e8emplos de im?2enes positi.asF

20

5 continuacin e8emplos de im?2enes ne2ati.asF

.-#eri1entos de Detecciones
9ara la e+perimentacin se utili'aron 3( im?2enes de % mu8eres * 3 ;ombres de los cuales se tomaron entre % * 0 fotos por persona. $erdaderos #ositivos 5Caras clasi!icadas co1o caras.% 55.26 78

20

20

9alsos #ositivos 5:o caras clasi!icadas co1o caras.% )2.10 78.

20

9alsos negativos 5Caras clasi!icadas co1o no caras.% 2.6& 78.

20

Conclusiones
:as caractersticas Haar pro.een una representacin simple * eficiente de la ima2en para reali'ar deteccin= reconocimiento= clasificacin= etc. ,e i2ual manera re@uieren normali'acin para ser robustas. :a ima2en inte2ral es Dtil para calcular r?pidamente las sumas de las re2iones utili'adas en las caractersticas Haar. :os altos porcenta8es de deteccin * ba8os tiempos de procesamiento demuestran la efecti.idad de la combinacin de t7cnicas de boostin2 con filtros de base Haar= para la deteccin de los o8os * caractersticas faciales * dan la posibilidad de lle.ar el sistema a una aplicacin en tiempo real. 9ara obtener un me8or desempeAo de deteccin se recomienda una base de datos con miles im?2enes positi.as * ne2ati.as.

20

4e!erencias
;eb ;ttpFGGopenc..itsee'.comGmodulesGob8detectGdocGcascadeKclassification.;tmlWid 2 ;ttpFGGc2i.cse.uns!.edu.auGXcs0011G!i>iGinde+.p;pH titleIOpenCVKPuideWHaarKClassifier ;ttpFGGnote.sonots.comGEciEoft!areG;aartrainin2.;tmlW.3f0##ba ;ttpFGGcode.2oo2le.comGpGima2eclipperG ;ttpFGG!!!.c.papers.comGdatasets.;tml 3ibliogr<!icas TtuloF :earnin2 OpenCV computer .ision !it; t;e OpenCV librar*. )ditorialF OY&)I::Z. 5utoresF Par* 6rads>i * 5drian Qae;ler. 9?2inasF %03- %1%.

20

Ane-o A
Winclude Uc..;U Winclude U;i2;2ui.;U Winclude Winclude Winclude Winclude Winclude Winclude Winclude Winclude Winclude [stdio.;V [stdlib.;V [strin2.;V [assert.;V [mat;.;V [float.;V [limits.;V [time.;V [ct*pe.;V

Wifdef K)iC Wdefine I/32 Wendif static C.NemEtora2eO stora2e I 0J static C.HaarClassifierCascadeO cascade I 0J .oid detectKandKdra!" IplIma2eO im2= double scaleKfactor= int minKnei2;bors= int fla2s= C.Ei'e minKsi'e $J const c;arO cascadeKname I U;aarcascadeKfrontalfaceKalt.+mlUJ GO U;aarcascadeKprofileface.+mlUJOG int main" int ar2c= c;arOO ar2. $ \ C.CaptureO capture I 0J IplIma2e Oframe= OframeKcop* I 0J int optlen I strlen"U--cascadeIU$J const c;arO inputKname I U0UJ int iJ double scaleKfactor I 1.1J int minKnei2;bors I 1J int fla2s I 0JGOCVKH55&K,OKC5//ZK9&</I/POG C.Ei'e minKsi'e I c.Ei'e"0=0$J if" ar2c II 1 $ \ fprintf" stderr= U)&&O&F Could not load classifier cascadeMnU $J fprintf" stderr= U<sa2eF facedetect U U--cascadeIMU[cascadeK+mlKpat;VMU or -c [cascadeK+mlKpat;VMnU U ] -sf [ scaleKfactor I 1f V ^MnU U ] -mn [ minKnei2;bors I 1d V ^MnU

20

U ] -fl [ fla2s I 1d V ^MnU U ] -ms [ minKsi'e I 1d 1d V ^MnU U ] filename S cameraKinde+ I 1s ^MnU= scaleKfactor= minKnei2;bors= fla2s= minKsi'e.!idt;= minKsi'e.;ei2;t= inputKname $J fprintf" stderr= UEee alsoF c.Haar,etectOb8ects"$ about option parameters.MnU $J return -1J _ for" i I 1J i [ ar2cJ iRR $ \ if" `strncmp" ar2.]i^= U--cascadeIU= optlen $ $ \ cascadeKname I ar2.]RRi^ R optlenJ _ else if" `strcmp" ar2.]i^= U-cU $ $ \ cascadeKname I ar2.]RRi^J _ else if" `strcmp" ar2.]i^= U-sfU $ $ \ scaleKfactor I "float$ atof" ar2.]RRi^ $J _ else if" `strcmp" ar2.]i^= U-mnU $ $ \ minKnei2;bors I atoi" ar2.]RRi^ $J _ else if" `strcmp" ar2.]i^= U-flU $ $ \ fla2s I CVKH55&K,OKC5//ZK9&</I/PJ _ else if" `strcmp" ar2.]i^= U-msU $ $ \ minKsi'e I c.Ei'e" atoi" ar2.]RRi^ $= atoi" ar2.]RRi^ $ $J _ else \ inputKname I ar2.]i^J _ _ cascade I "C.HaarClassifierCascadeO$c.:oad" cascadeKname= 0= 0= 0 $J stora2e I c.CreateNemEtora2e"0$J if" `inputKname SS "isdi2it"inputKname]0^$ aa inputKname]1^ II bM0b$ $ capture I c.Capture-romC5N" `inputKname H 0 F inputKname]0^ - b0b $J else capture I c.Capture-rom5VI" inputKname $J

20

c./amed indo!" UresultU= 1 $J if" capture $ \ for"JJ$ \ if" `c.Prab-rame" capture $$ brea>J frame I c.&etrie.e-rame" capture $J if" `frame $ brea>J if" `frameKcop* $ frameKcop* I c.CreateIma2e" c.Ei'e"frame-V!idt;=frame-V;ei2;t$= I9:K,)9THK(<= frame-VnC;annels $J if" frame-Vori2in II I9:KO&IPI/KT: $ c.Cop*" frame= frameKcop*= 0 $J else c.-lip" frame= frameKcop*= 0 $J detectKandKdra!" frameKcop*= scaleKfactor= minKnei2;bors= fla2s= minKsi'e $J if" c. aitQe*" 10 $ VI 0 $ brea>J _ c.&eleaseIma2e" aframeKcop* $J c.&eleaseCapture" acapture $J _ else \ const c;arO filename I inputKname H inputKname F "c;arO$Ulena.8p2UJ IplIma2eO ima2e I c.:oadIma2e" filename= 1 $J if" ima2e $ \ detectKandKdra!" ima2e= scaleKfactor= minKnei2;bors= fla2s= minKsi'e $J c. aitQe*"0$J c.&eleaseIma2e" aima2e $J _ else \ GO assume it is a te+t file containin2 t;e list of t;e ima2e filenames to be processed - one per line OG -I:)O f I fopen" filename= UrtU $J if" f $ \ c;ar buf]1000R1^J !;ile" f2ets" buf= 1000= f $ $ \

20

int len I "int$strlen"buf$J !;ile" len V 0 aa isspace"buf]len-1^$ $ len--J buf]len^ I bM0bJ ima2e I c.:oadIma2e" buf= 1 $J if" ima2e $ \ detectKandKdra!" ima2e= scaleKfactor= minKnei2;bors= fla2s= minKsi'e $J c. aitQe*"0$J c.&eleaseIma2e" aima2e $J _ _ fclose"f$J _ _ _ c.,estro* indo!"UresultU$J return 0J _ .oid detectKandKdra!" IplIma2eO im2= double scaleKfactor= int minKnei2;bors= int fla2s= C.Ei'e minKsi'e $ \ static C.Ecalar colors]^ I \ \\0=0=2%%__= \\0=12(=2%%__= \\0=2%%=2%%__= \\0=2%%=0__= \\2%%=12(=0__= \\2%%=2%%=0__= \\2%%=0=0__= \\2%%=0=2%%__ _J double scale I 1.3J IplIma2eO 2ra* I c.CreateIma2e" c.Ei'e"im2-V!idt;=im2-V;ei2;t$= (= 1 $J IplIma2eO smallKim2 I c.CreateIma2e" c.Ei'e" c.&ound "im2-V!idt;Gscale$= c.&ound "im2-V;ei2;tGscale$$= (= 1 $J int iJ c.C.tColor" im2= 2ra*= CVK6P&2P&5Z $J c.&esi'e" 2ra*= smallKim2= CVKI/T)&K:I/)5& $J c.)@uali'eHist" smallKim2= smallKim2 $J c.ClearNemEtora2e" stora2e $J

20

if" cascade $ \ double t I "double$c.PetTic>Count"$J C.Ee@O faces I c.Haar,etectOb8ects" smallKim2= cascade= stora2e= scaleKfactor= minKnei2;bors= fla2s= minKsi'e $J GG1.1= 2= 0GOCVKH55&K,OKC5//ZK9&</I/POG= c.Ei'e"30= 30$ $J t I "double$c.PetTic>Count"$ - tJ printf" Udetection time I 12msMnU= tG ""double$c.PetTic>-re@uenc*"$O1000.$ $J for" i I 0J i [ "faces H faces-Vtotal F 0$J iRR $ \ C.&ectO r I "C.&ectO$c.PetEe@)lem" faces= i $J C.9oint centerJ int radiusJ center.+ I c.&ound""r-V+ R r-V!idt;O0.%$Oscale$J center.* I c.&ound""r-V* R r-V;ei2;tO0.%$Oscale$J radius I c.&ound""r-V!idt; R r-V;ei2;t$O0.2%Oscale$J c.Circle" im2= center= radius= colors]i1(^= 3= (= 0 $J _ _ c.E;o!Ima2e" UresultU= im2 $J c.&eleaseIma2e" a2ra* $J c.&eleaseIma2e" asmallKim2 $J _

20

Ane-o 3
Winclude [openc.Gc..;V Winclude [openc.Gc.au+.;V Winclude [openc.G;i2;2ui.;V GG for filelistin2 Winclude [stdio.;V Winclude [io.;V GG for fileoutput Winclude [strin2V Winclude [fstreamV Winclude [sstreamV Winclude [dirent.;V Winclude [s*sGt*pes.;V usin2 namespace stdJ IplIma2eO ima2eI0J IplIma2eO ima2e2I0J GGint startKroiI0J int roiK+0I0J int roiK*0I0J int roiK+1I0J int roiK*1I0J int numOf&ecI0J int start,ra! I 0J c;arO !indo!KnameIU[E95C)Vadd [)/T)&Vsa.e and load ne+t [)ECVe+itUJ strin2 IntToEtrin2"int num$ \ ostrin2stream m*EtreamJ GGcreates an ostrin2stream ob8ect m*Etream [[ num [[ flus;J GO O outputs t;e number into t;e strin2 stream and t;en flus;es O t;e buffer "ma>es sure t;e output is put into t;e stream$ OG return"m*Etream.str"$$J GGreturns t;e strin2 form of t;e strin2stream ob8ect _J .oid onKmouse"int e.ent=int +=int *=int fla2= .oid Oparam$ \ if"e.entIICVK)V)/TK:6<TTO/,O /$ \ if"`start,ra!$ \ roiK+0I+J

20

roiK*0I*J start,ra! I 1J _ else \ roiK+1I+J roiK*1I*J start,ra! I 0J _ _ if"e.entIICVK)V)/TKNO<E)NOV) aa start,ra!$ \ GGredra! &OI selection ima2e2Ic.CloneIma2e"ima2e$J c.&ectan2le"ima2e2=c.9oint"roiK+0=roiK*0$=c.9oint"+=*$=CVK&P6"2%%=0=2%%$=1$J c.E;o!Ima2e"!indo!Kname=ima2e2$J c.&eleaseIma2e"aima2e2$J _ _ int main"int ar2c= c;arOO ar2.$ \ int iQe*I0J strin2 str9refi+J strin2 str9ostfi+J strin2 inputKdirector*J strin2 outputKfileJ if"ar2c `I 3$ \ fprintf"stderr= U1s outputKinfo.t+t ra!GdataGdirector*GMnU= ar2.]0^$J return -1J _ inputKdirector* I ar2.]2^J outputKfile I ar2.]1^J GO Pet a file listin2 of all files !it; in t;e input director* OG ,I& OdirKp I opendir "inputKdirector*.cKstr"$$J struct dirent OdirKentr*KpJ if"dirKp II /<::$ \ fprintf"stderr= U-ailed to open director* 1sMnU= inputKdirector*.cKstr"$$J return -1J _ fprintf"stderr= UOb8ect Nar>erF Input ,irector*F 1s Output -ileF 1sMnU= inputKdirector*.cKstr"$= outputKfile.cKstr"$$J

20

GG init ;i2;2ui c.5ddEearc;9at;"inputKdirector*$J c./amed indo!"!indo!Kname=1$J c.EetNouseCallbac>"!indo!Kname=onKmouse= /<::$J fprintf"stderr= UOpenin2 director*...U$J GG init output of rectan2les to t;e info file ofstream output"outputKfile.cKstr"$$J fprintf"stderr= Udone.MnU$J !;ile""dirKentr*Kp I readdir"dirKp$$ `I /<::$ \ numOf&ecI0J if"strcmp"dirKentr*Kp-VdKname= UU$$ fprintf"stderr= U)+aminin2 file 1sMnU= dirKentr*Kp-VdKname$J GO TO,OF 5ssi2n postfi+Gprefi+ info OG str9ostfi+IUUJ str9refi+IinputKdirector*J str9refi+RIdirKentr*Kp-VdKnameJ GGstr9refi+RIbmpKfile.nameJ fprintf"stderr= U:oadin2 ima2e 1sMnU= str9refi+.cKstr"$$J if""ima2eIc.:oadIma2e"str9refi+.cKstr"$=1$$ `I 0$ \ GG do \ !or> on current ima2e c.E;o!Ima2e"!indo!Kname=ima2e$J GG used c. aitQe* returnsF GG [)nterVI13 sa.e added rectan2les and s;o! ne+t ima2e GG [)ECVI2# e+it pro2ram GG [EpaceVI32 add rectan2le to current ima2e GG an* ot;er >e* clears rectan2le dra!in2 onl* iQe*Ic. aitQe*"0$J s!itc;"iQe*$ \ case 2#F c.&eleaseIma2e"aima2e$J c.,estro* indo!"!indo!Kname$J return 0J case 32F numOf&ecRRJ

20

printf"U 1d. rect +I1dMt*I1dMt+2;I1dMt*2I 1dMnU=numOf&ec=roiK+0=roiK*0=roiK+1=roiK*1$J GGprintf"U 1d. rect +I1dMt*I1dMt!idt;I1dMt;ei2;tI 1dMnU=numOf&ec=roiK+1=roiK*1=roiK+0-roiK+1=roiK*0-roiK*1$J GG currentl* t!o dra! directions possibleF GG from top left to bottom ri2;t or .ice .ersa if"roiK+0[roiK+1 aa roiK*0[roiK*1$ \ printf"U 1d. rect +I1dMt*I 1dMt!idt;I1dMt;ei2;tI1dMnU=numOf&ec=roiK+0=roiK*0=roiK+1-roiK+0=roiK*1roiK*0$J GG append rectan2le coord to pre.ious line content str9ostfi+RIU URIntToEtrin2"roiK+0$RU URIntToEtrin2"roiK*0$RU URIntToEtrin2"roiK+1-roiK+0$RU URIntToEtrin2"roiK*1-roiK*0$J _ if"roiK+0VroiK+1 aa roiK*0VroiK*1$ \ printf"U 1d. rect +I1dMt*I 1dMt!idt;I1dMt;ei2;tI1dMnU=numOf&ec=roiK+1=roiK*1=roiK+0-roiK+1=roiK*0roiK*1$J GG append rectan2le coord to pre.ious line content str9ostfi+RIU URIntToEtrin2"roiK+1$RU URIntToEtrin2"roiK*1$RU URIntToEtrin2"roiK+0-roiK+1$RU URIntToEtrin2"roiK*0-roiK*1$J _ brea>J _ _ !;ile"iQe*`I13$J GG sa.e to info file as later used for HaarTrainin2F GG [relKpat;VMbmpKfile.name numOf&ec +0 *0 !idt;0 ;ei2;t0 +1 *1 !idt;1 ;ei2;t1... if"numOf&ecV0 aa iQe*II13$ \ GGappend line GO TO,OF Etore output information. OG output [[ str9refi+ [[ U U[[ numOf&ec [[ str9ostfi+ [[UMnUJ _ c.&eleaseIma2e"aima2e$J _ else \ fprintf"stderr= U-ailed to load ima2e= 1sMnU= str9refi+.cKstr"$$J _

20

_ output.close"$J c.,estro* indo!"!indo!Kname$J closedir"dirKp$J return 0J _

20

También podría gustarte