7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
1/30
Deteccin deCaras.
Caractersticas Haar basadas en unacascada de clasificadores.
Miguel Crdova Ak.25/10/2011
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
2/30
20
Tabla de contenido
Tabla de contenido..............................................................................................2
Introduccin........................................................................................................3
Instalar OpenCV-2.3.1 en un ambiente Windows (Windows 7)............................5
Realizar pruebas con clasificadores Haar............................................................8
Entrenar y usar clasificadores Haar..................................................................10
Experimentos de Detecciones...........................................................................15
Falsos positivos (No caras clasificadas como caras.- 42.10 %).........................17
Falsos negativos (Caras clasificadas como no caras.- 2.63 %).........................18
Conclusiones..................................................................................................... 19
Referencias ...................................................................................................... 20
Anexo A ............................................................................................................ 21
Anexo B............................................................................................................. 26
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
3/30
20
Introduccin
Caractersticas Haar basadas en una cascada de clasificadores.
Este mtodo para la deteccin de objetos fue propuesto por Paul Viola y
mejorado por Rainer Lienhart.
Un clasificador (es decir, una cascada de clasificadores es impulsado a trabajar
con caractersticas haar-like) se entrena con cientos de imgenes que
contienen el determinado objeto (por ejemplo, una cara o un coche), llamados
ejemplos positivos, que se adaptan al mismo tamao (por ejemplo 20 x 20
pixeles), y ejemplos negativos, imgenes arbitrarias del mismo tamao.
Despus de que un clasificador se entrena, se puede aplicar a una determinada
regin de inters (del mismo tamao que se ha utilizado durante elentrenamiento) en una imagen de entrada.
El clasificador genera un 1 si la regin es probable que contenga muestre
el objeto (es decir la cara el coche), y 0 en caso contrario. Para buscar el
objeto en toda la imagen se puede mover la ventana de bsqueda a travs de
la imagen y comprobar todas la localidades con el clasificador. El clasificador
est diseado para que pueda ser modificado de tamao fcilmente con el fin
de ser capaz de encontrar el objeto de inters en diferentes tamaos, que es
ms eficiente que cambiar el tamao de la imagen en s. Por lo tanto para
encontrar un objeto de un tamao desconocido en la imagen el procedimiento
de barrido debe hacerse varias veces a diferentes escalas.
La palabra cascada en el nombre del clasificador significa que el clasificador
resultante se compone de varios clasificadores simples (etapas) que se aplican
posteriormente a una regin de inters hasta que en algn momento el
candidato es rechazado o ha aprobado todas las todas las etapas. La palabra
impulso significa que los clasificadores en cada etapa de la cascada son
complejos ellos mismo y se construyen a partir de los clasificadores bsicos
utilizando una de las cuatro tcnicas diferentes de boost. Actualmente
AdaBoost Discreto, AdaBoost Real, AdaBoost Suave, AdaBoost Logico son los
soportados. Los clasificadores bsicos son rboles de decisin, clasificadores
con 2 hojas. Las caractersticas Haar-Like son las entradas de los clasificadoresbsicos, y se calculan como se describe a continuacin. El algoritmo actual
utiliza los siguientes caractersticas Haar-Like:
http://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_CVPR2001.pdfhttp://citeseer.ist.psu.edu/viewdoc/download;jsessionid=BB01B35A9C6C3798A65B65B471427F32?doi=10.1.1.86.9433&rep=rep1&type=pdfhttp://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_CVPR2001.pdfhttp://citeseer.ist.psu.edu/viewdoc/download;jsessionid=BB01B35A9C6C3798A65B65B471427F32?doi=10.1.1.86.9433&rep=rep1&type=pdf7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
4/30
20
Las caractersticas a utilizar en un clasificador se especifican por su forma (1a,
2a, etc.), la posicin dentro de la regin de inters y de la escala (esta escala
no es la misma que la escala utilizada en la etapa de deteccin, aunque estas
dos escalas son multiplicado). Por ejemplo, en el caso de la caracterstica lineal
(2c) la respuesta se calcula como la diferencia entre la suma de los pixeles de
la imagen en rectngulo que abarcan la funcin de conjunto (las dos franjas
blancas y la franja de negro del centro) y la suma de los pixeles de la imagen
en la franja de negro, multiplicado por 3 en el fin de compensar las diferencias
en el tamao de la reas. La suma de los valores de los pixeles en una regin
rectangular se calcula rpidamente usando las imgenes integrales.
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
5/30
20
Instalar OpenCV-2.3.1 en un ambiente Windows(Windows 7)
1.- Descargar el archivo OpenCV-2.3.1-win-superpackde la siguiente
direccin: http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/
2. Despus de haber descargado el archivo OpenCV-2.3.1-win-superpacklo
ejecutamos, seleccionamos la unidad C y presionamos el botn Extract como
se muestra en la siguiente imagen.
3.- Ahora descargamos la librera extra tbb30_20110427oss de la siguiente
direccin:
http://threadingbuildingblocks.org/ver.php?fid=171
Seleccionamos la librera correspondiente a Windows;
tbb30_20110427oss_win.zip
Despus de haber descargado la librera, la descomprimimos en la siguiente
ruta:C:\opencv\build\common
3.- Ahora vamos a las propiedades del equipo - configuracin avanzada delsistema, debe poder visualizar una pantalla similar a la siguiente imagen.
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/http://threadingbuildingblocks.org/ver.php?fid=171http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/http://threadingbuildingblocks.org/ver.php?fid=1717/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
6/30
20
4.- Presionamos el botn Variables de entorno y editamos la variable del
sistema PATH a la cual le aadimos las siguientes rutas:C:\opencv\build\x86\vc10\bin;C:\opencv\build\common\tbb30_20110427oss\bin\ia32\vc10
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
7/30
20
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
8/30
20
Realizar pruebas con clasificadores Haar
Para realizar las pruebas debemos implementar una clase en la cual se haga uso de la funcincvHaarDetectObjects (Ver Anexo A).
O si prefiere puede descargar una Kit con estas clases con la librera necesarias para empezar a
trabajar de la siguiente direccin:http://www.iem.pw.edu.pl/~domanskj/haarkit.rar, para este
proyecto descargamos el kit, posteriormente lo descomprimimos en la carpeta haar en el disco C.
1. Al descomprimirlo obtenemos dos nuevos archivos:
READ_THIS_FIRST.txt
tools.rar
2.- Descomprimimos el archivo tools.rar, hasta ahora debemos tener los
siguientes archivos:
Cascade2xml
Temp
Test_recognition
Haarkit.rar
HaarTraining.bat
READ_THIS_FIRST.txt
Samples_creation.bat
Tools.rar
3.- Por ahora solo nos interesa la carpeta Test_recognition, navegamos dentro de ella ydebemos visualizar los siguientes archivos:
cv097.dll
cxcore097.dll
dane.xml
facedetect.exe
highgui097.dll
start.bat
Para realizar las pruebas haremos uso del comando facedetect.exe, para
ms detalle de este comando podemos editar el archivo start.bat.
4.- Seleccionamos imgenes que contengan rostros, ahora copiamos dichasimgenes en la carpeta Test_recognition.
5. Entramos a la lnea de comandos (ms-dos), y navegamos hasta la direccinde la carpeta Test_recognition, tecleamos lo siguiente:
http://www.iem.pw.edu.pl/~domanskj/haarkit.rarhttp://www.iem.pw.edu.pl/~domanskj/haarkit.rarhttp://www.iem.pw.edu.pl/~domanskj/haarkit.rarhttp://www.iem.pw.edu.pl/~domanskj/haarkit.rar7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
9/30
20
facedetect.exe cascade=dane.xml nombre_imagen.extensin(jpg,bmp,pgm,etc)
Ejemplo del comando:
Ejemplo de deteccin:
5.- Si queremos realizar otras pruebas, por ejemplo deteccin de ojos podemos hacer uso de
clasificadores proporcionados por la librera OpenCV-2.3.1; para ello nos dirigimos a la siguiente
direccin C:\opencv\data\haarcascades si usted descomprimi OpenCV-2.3.1 en la unidad C.
En dicha direccin podemos encontrar diversos clasificadores.
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
10/30
20
Entrenar y usar clasificadores HaarLos pasos para entrenar y usar clasificadores Haar son:
1. Colecciones de imgenes positivas y negativas para el entrenamiento.2. Marcar las imgenes positivas usando objectmarker.cpp3. Crear el archivo vector.vec usando createsamples.cpp4. Entrenar el clasificador usando haartraining.cpp5. Correr el clasificador usando la funcin cvHaarDetectObjects().
Todas estas clases se encuentran en la siguiente ruta: C:\opencv\modules\haartraining si usted
descomprimi la librera en la unidad C con excepcin de la clase objectmarker.cpp (Ver Anexo
B).
O si prefiere puede descargar una Kit con todas estas clases ya preparadas para empezar a
trabajar de la siguiente direccin:http://www.iem.pw.edu.pl/~domanskj/haarkit.rar, para este
proyecto descargamos el kit, posteriormente lo descomprimimos en la carpeta haar el disco C.
1. Al descomprimirlo obtenemos dos archivos nuevos:
READ_THIS_FIRST.txt
tools.rar
2.- Descomprimimos el archivo tools.rar, hasta ahora debemos tener lossiguientes archivos:
Cascade2xml
Temp
Test_recognition
Haarkit.rar
HaarTraining.bat
READ_THIS_FIRST.txt
Samples_creation.bat
Tools.rar
3.- En la carpeta ..\temp\negative guardamos las imgenes que nocontengan el objeto que deseamos sea reconocido.
Creamos la lista de imgenes para posteriormente guardarlo en el
archivo infofile.txt El archivo infofile.txt debe contener lneas como:
o image2619.BMPo image2620.BMP
Podemos usar el archivo create_list.bat para crear la lista deimgenes.
4.- En la carpeta ..\temp\positives\rawdata guardamos las imgenes quecontienen el objeto deseado.
http://www.iem.pw.edu.pl/~domanskj/haarkit.rarhttp://www.iem.pw.edu.pl/~domanskj/haarkit.rarhttp://www.iem.pw.edu.pl/~domanskj/haarkit.rarhttp://www.iem.pw.edu.pl/~domanskj/haarkit.rar7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
11/30
20
Usamos la herramienta ..\temp\positive\objectmarker.exe, esta herramientanos permite especificar las coordenadas x, y, el ancho y alto del objetodeterminado dentro de la imagen; a su vez crea un archivo info.txt el cualespecifica la informacin antes mencionada de la imagen.
Nota: La herramienta objectmarker.exe solo trabaja con imgenes bmp.
5.- Para el entrenamiento usaremos la herramienta createsamples.exe
Utilizamos el siguiente comando:
createsamples.exe -info positive/info.txt -vec data/vector.vec -num 103 -w24 -h 24
El cual creara un archivo vector.vec en la carpeta \temp\data.
Los parmetros son:
num 1800 nmero de imgenes positivas.
w 24 h 24 Ejemplo de tamao.
6.- Despus de crear el archivo vector.vec podemos iniciar con elentrenamiento, ejecutamos el siguiente comando:
haartraining.exe -data data/cascade -vec data/vector.vec -bgnegative/infofile.txt -npos 103 -nneg 35 -nstages 20 -mem 1000 -mode ALL -w24 -h 24 nonsym
Los parmetros son:
data data/cascade Ruta de los archivos de cascada. Cada etapacompletada creara un archivo en\temp\data\cascade\0..N\AdaBoostCARTHaarClassifier.txt
vec data/vector.vec Archivo que se creo concreatesamples.exe
bg negative/infofile.txt Lista de las imgenes negativas\temp\negative\
npos 103 Nmero de imgenes positivas
nneg 35 Nmero de imgenes negativas
nstages 20 Nmero de etapas para completar
mem 1000 Cantidad de memoria disponible asignada alprograma
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
12/30
20
mode ALL Vea la literatura para ms detalles de esteparmetro
w 24 -h 24 Ejemplo de tamao
nonsym Este parmetro no es necesario si el objeto essimtrico horizontal
Podemos usar el archivo haarTraining.bat.
Al correr el comando haartraining.exe obtenemos una salida similar a lasiguiente:
________________________________________________________________________________Parent node: 17
*** 1 cluster ***POS: 1656 1799 0.920511NEG: 2410 1.97289e-005BACKGROUND PROCESSING TIME: 1279.69Precalculation time: 63.20+----+----+-+---------+---------+---------+---------+| N |%SMP|F| ST.THR | HR | FA | EXP. ERR|+----+----+-+---------+---------+---------+---------+| 1|100%|-|-0.312590| 1.000000| 1.000000| 0.256272|+----+----+-+---------+---------+---------+---------+| 2|100%|-|-0.537043| 1.000000| 1.000000| 0.294638|+----+----+-+---------+---------+---------+---------+
| 3|100%|-|-0.776489| 1.000000| 1.000000| 0.238072|+----+----+-+---------+---------+---------+---------+| 4|100%|-|-1.415237| 1.000000| 1.000000| 0.264879|+----+----+-+---------+---------+---------+---------+| 5| 96%|-|-1.120346| 0.996981| 0.969710| 0.242253|+----+----+-+---------+---------+---------+---------+| 6| 84%|-|-1.471691| 0.996981| 0.956432| 0.218888|+----+----+-+---------+---------+---------+---------+| 7| 82%|-|-1.187260| 0.996981| 0.909959| 0.230939|+----+----+-+---------+---------+---------+---------+| 8| 83%|-|-1.209699| 0.995773| 0.897510| 0.216675|+----+----+-+---------+---------+---------+---------+
| 9| 83%|-|-1.187195| 0.995169| 0.848548| 0.196754|+----+----+-+---------+---------+---------+---------+| 10| 81%|-|-1.332160| 0.995169| 0.880498| 0.178062|+----+----+-+---------+---------+---------+---------+| 11| 83%|-|-1.529588| 0.995773| 0.881328| 0.190113|+----+----+-+---------+---------+---------+---------+| 12| 81%|-|-1.529296| 0.995169| 0.859751| 0.178554|+----+----+-+---------+---------+---------+---------+| 13| 80%|-|-1.471163| 0.995169| 0.820332| 0.165765|
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
13/30
20
+----+----+-+---------+---------+---------+---------+| 14| 80%|-|-1.439857| 0.995169| 0.797095| 0.157895|+----+----+-+---------+---------+---------+---------+| 15| 79%|-|-1.366838| 0.995169| 0.755602| 0.149287|+----+----+-+---------+---------+---------+---------+| 16| 77%|-|-1.357297| 0.995169| 0.729046| 0.148303|
+----+----+-+---------+---------+---------+---------+| 17| 77%|-|-1.350920| 0.995169| 0.698755| 0.142892|+----+----+-+---------+---------+---------+---------+| 18| 77%|-|-1.286876| 0.995169| 0.657261| 0.140187|+----+----+-+---------+---------+---------+---------+| 19| 76%|-|-1.340796| 0.995169| 0.643983| 0.137236|+----+----+-+---------+---------+---------+---------+| 20| 75%|-|-1.258729| 0.995169| 0.607054| 0.135022|+----+----+-+---------+---------+---------+---------+| 21| 75%|-|-1.259443| 0.995169| 0.594606| 0.124447|+----+----+-+---------+---------+---------+---------+| 22| 75%|-|-1.247393| 0.995169| 0.578008| 0.121249|
+----+----+-+---------+---------+---------+---------+| 23| 74%|-|-1.189301| 0.995169| 0.539419| 0.118790|+----+----+-+---------+---------+---------+---------+| 24| 74%|-|-1.278121| 0.995169| 0.547303| 0.116822|+----+----+-+---------+---------+---------+---------+| 25| 73%|-|-1.194187| 0.995169| 0.503734| 0.115347|+----+----+-+---------+---------+---------+---------+| 26| 73%|-|-1.216452| 0.995169| 0.484232| 0.110182|+----+----+-+---------+---------+---------+---------+Stage training time: 7788.05"Number of used features: 26
Parent node: 17Chosen number of splits: 0
Total number of splits: 0
Tree ClassifierStage+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 11| 12| 13| 14| 15| 16| 17| 18|+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
0---1---2---3---4---5---6---7---8---9--10--11--12--13--14--15--16--17--18________________________________________________________________________________
Podemos seguir despus de la finalizacin de las todas la etapas o parardespus del valor de la falsa alarma que es >=1*10e-5.
Por ejemplo:
Parent node: 17
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
14/30
20
*** 1 cluster ***POS: 1656 1799 0.920511NEG: 2410 1.97289e-005 esto es una falsa alarma.
7.- Ahora copiamos todas los carpetas que se encuentran \temp\data\cascadeestas carpetas estn nombradas de 0 a N (N es el nmero de etapascompletadas).
En cada una de estas carpetas debe de haber un archivoAdaBoostCARTHaarClassifier.txt.
Copiamos todas estas de 0 a N carpetas a ..\cascade2xml\data catalogue.
8.- Ahora convertiremos los archivos de cascada a un archivo xml, para esousaremos la herramienta \cascade2xml\haarconv.exe
El comando a ejecutar es el siguiente:
haarconv.exe data output.xml 24 24
Los parmetros son:
data output.xml Nombre del archivo xml que se generara.
24 24 Ejemplo de tamao.
9.- Realizar la prueba de reconocimiento, copiamos el archivo output.xml a lacarpeta \test_recognition
Usaremos el siguiente comando:
facedetect.exe --cascade="output.xml" imagen.jpg
10.- La base de datos de imgenes utilizada cuenta con 143 imgenes, 108positivas y 35 negativas; las imgenes fueron tomadas de 19 mujeres y 1hombre del Instituto de Educacin Comercial Bancario.
A continuacin ejemplos de imgenes positivas:
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
15/30
20
A continuacin ejemplos de imgenes negativas:
Experimentos de Detecciones
Para la experimentacin se utilizaron 38 imgenes de 5 mujeres y 3 hombresde los cuales se tomaron entre 5 y 4 fotos por persona.
Verdaderos positivos (Caras clasificadas como caras.- 55.26 %)
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
16/30
20
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
17/30
20
Falsos positivos (No caras clasificadas como caras.- 42.10 %).
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
18/30
20
Falsos negativos (Caras clasificadas como no caras.- 2.63 %).
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
19/30
20
Conclusiones
Las caractersticas Haar proveen una representacin simple y eficiente de laimagen para realizar deteccin, reconocimiento, clasificacin, etc. De igual
manera requieren normalizacin para ser robustas.
La imagen integral es til para calcular rpidamente las sumas de las regionesutilizadas en las caractersticas Haar.
Los altos porcentajes de deteccin y bajos tiempos de procesamientodemuestran la efectividad de la combinacin de tcnicas de boosting con filtrosde base Haar, para la deteccin de los ojos y caractersticas faciales y dan laposibilidad de llevar el sistema a una aplicacin en tiempo real.
Para obtener un mejor desempeo de deteccin se recomienda una base dedatos con miles imgenes positivas y negativas.
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
20/30
20
Referencias
Web
http://opencv.itseez.com/modules/objdetect/doc/cascade_classification.html#id
2
http://cgi.cse.unsw.edu.au/~cs4411/wiki/index.php?title=OpenCV_Guide#Haar_Classifier
http://note.sonots.com/SciSoftware/haartraining.html#v6f077ba
http://code.google.com/p/imageclipper/
http://www.cvpapers.com/datasets.html
Bibliogrficas
Ttulo: Learning OpenCV computer vision with the OpenCV library.Editorial: OREILLY.Autores: Gary Bradski y Adrian Kaehler.Pginas: 506- 515.
http://opencv.itseez.com/modules/objdetect/doc/cascade_classification.html#id2http://opencv.itseez.com/modules/objdetect/doc/cascade_classification.html#id2http://cgi.cse.unsw.edu.au/~cs4411/wiki/index.php?title=OpenCV_Guide#Haar_Classifierhttp://cgi.cse.unsw.edu.au/~cs4411/wiki/index.php?title=OpenCV_Guide#Haar_Classifierhttp://note.sonots.com/SciSoftware/haartraining.html#v6f077bahttp://code.google.com/p/imageclipper/http://www.cvpapers.com/datasets.htmlhttp://opencv.itseez.com/modules/objdetect/doc/cascade_classification.html#id2http://opencv.itseez.com/modules/objdetect/doc/cascade_classification.html#id2http://cgi.cse.unsw.edu.au/~cs4411/wiki/index.php?title=OpenCV_Guide#Haar_Classifierhttp://cgi.cse.unsw.edu.au/~cs4411/wiki/index.php?title=OpenCV_Guide#Haar_Classifierhttp://note.sonots.com/SciSoftware/haartraining.html#v6f077bahttp://code.google.com/p/imageclipper/http://www.cvpapers.com/datasets.html7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
21/30
20
Anexo A
#include "cv.h"#include "highgui.h"
#include #include #include #include #include #include #include #include #include
#ifdef _EiC#define WIN32
#endif
static CvMemStorage* storage = 0;static CvHaarClassifierCascade* cascade = 0;
void detect_and_draw( IplImage* img, double scale_factor, int min_neighbors,int flags, CvSize min_size );
const char* cascade_name ="haarcascade_frontalface_alt.xml";
/* "haarcascade_profileface.xml";*/
int main( int argc, char** argv ){
CvCapture* capture = 0;IplImage *frame, *frame_copy = 0;int optlen = strlen("--cascade=");const char* input_name = "0";int i;double scale_factor = 1.1;int min_neighbors = 1;int flags = 0;/*CV_HAAR_DO_CANNY_PRUNING*/CvSize min_size = cvSize(0,0);
if( argc == 1 ){
fprintf( stderr, "ERROR: Could not load classifier cascade\n" );fprintf( stderr,
"Usage: facedetect ""--cascade=\"\" or -c \n"" [ -sf < scale_factor = %f > ]\n"" [ -mn < min_neighbors = %d > ]\n"
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
22/30
20
" [ -fl < flags = %d > ]\n"" [ -ms < min_size = %d %d > ]\n"" [ filename | camera_index = %s ]\n",scale_factor, min_neighbors, flags, min_size.width, min_size.height,
input_name );fprintf( stderr, "See also: cvHaarDetectObjects() about option
parameters.\n" );return -1;
}
for( i = 1; i < argc; i++ ){
if( !strncmp( argv[i], "--cascade=", optlen ) ){
cascade_name = argv[++i] + optlen;}else if( !strcmp( argv[i], "-c" ) ){
cascade_name = argv[++i];}else if( !strcmp( argv[i], "-sf" ) ){
scale_factor = (float) atof( argv[++i] );}else if( !strcmp( argv[i], "-mn" ) ){
min_neighbors = atoi( argv[++i] );}else if( !strcmp( argv[i], "-fl" ) ){
flags = CV_HAAR_DO_CANNY_PRUNING;}else if( !strcmp( argv[i], "-ms" ) ){
min_size = cvSize( atoi( argv[++i] ), atoi( argv[++i] ) );}else{
input_name = argv[i];}
}
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );storage = cvCreateMemStorage(0);
if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') )
capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );else
capture = cvCaptureFromAVI( input_name );
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
23/30
20
cvNamedWindow( "result", 1 );
if( capture ){
for(;;){
if( !cvGrabFrame( capture ))break;
frame = cvRetrieveFrame( capture );if( !frame )
break;if( !frame_copy )
frame_copy = cvCreateImage( cvSize(frame->width,frame->height),IPL_DEPTH_8U, frame->nChannels );
if( frame->origin == IPL_ORIGIN_TL )cvCopy( frame, frame_copy, 0 );
elsecvFlip( frame, frame_copy, 0 );
detect_and_draw( frame_copy, scale_factor, min_neighbors, flags,
min_size );
if( cvWaitKey( 10 ) >= 0 )break;
}
cvReleaseImage( &frame_copy );cvReleaseCapture( &capture );
}else
{const char* filename = input_name ? input_name : (char*)"lena.jpg";IplImage* image = cvLoadImage( filename, 1 );
if( image ){
detect_and_draw( image, scale_factor, min_neighbors, flags, min_size );cvWaitKey(0);cvReleaseImage( &image );
}else{
/* assume it is a text file containing thelist of the image filenames to be processed - one per line */
FILE* f = fopen( filename, "rt" );if( f ){
char buf[1000+1];while( fgets( buf, 1000, f ) ){
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
24/30
20
int len = (int)strlen(buf);while( len > 0 && isspace(buf[len-1]) )
len--;buf[len] = '\0';image = cvLoadImage( buf, 1 );if( image )
{detect_and_draw( image, scale_factor, min_neighbors, flags,
min_size );cvWaitKey(0);cvReleaseImage( &image );
}}fclose(f);
}}
}
cvDestroyWindow("result");
return 0;}
void detect_and_draw( IplImage* img, double scale_factor, int min_neighbors,int flags, CvSize min_size ){
static CvScalar colors[] ={
{{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 scale = 1.3;IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),
cvRound (img->height/scale)), 8, 1 );int i;
cvCvtColor( img, gray, CV_BGR2GRAY );cvResize( gray, small_img, CV_INTER_LINEAR );cvEqualizeHist( small_img, small_img );cvClearMemStorage( storage );
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
25/30
20
if( cascade ){
double t = (double)cvGetTickCount();CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
scale_factor, min_neighbors, flags, min_size );//1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(30, 30) );t = (double)cvGetTickCount() - t;printf( "detection time = %gms\n", t/
((double)cvGetTickFrequency()*1000.) );for( i = 0; i < (faces ? faces->total : 0); i++ ){
CvRect* r = (CvRect*)cvGetSeqElem( faces, i );CvPoint center;int radius;center.x = cvRound((r->x + r->width*0.5)*scale);center.y = cvRound((r->y + r->height*0.5)*scale);radius = cvRound((r->width + r->height)*0.25*scale);
cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );}
}
cvShowImage( "result", img );cvReleaseImage( &gray );cvReleaseImage( &small_img );
}
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
26/30
20
Anexo B
#include #include
#include
// for filelisting#include #include // for fileoutput#include #include #include #include #include
using namespace std;
IplImage* image=0;IplImage* image2=0;//int start_roi=0;int roi_x0=0;int roi_y0=0;int roi_x1=0;int roi_y1=0;int numOfRec=0;int startDraw = 0;char* window_name="add save and load next exit";
string IntToString(int num){
ostringstream myStream; //creates an ostringstream objectmyStream
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
27/30
20
roi_y0=y;startDraw = 1;
} else {roi_x1=x;roi_y1=y;startDraw = 0;
}}if(event==CV_EVENT_MOUSEMOVE && startDraw)
{
//redraw ROI selectionimage2=cvCloneImage(image);
cvRectangle(image2,cvPoint(roi_x0,roi_y0),cvPoint(x,y),CV_RGB(255,0,255),1);cvShowImage(window_name,image2);cvReleaseImage(&image2);
}
}
int main(int argc, char** argv){
int iKey=0;string strPrefix;string strPostfix;string input_directory;string output_file;
if(argc != 3) {fprintf(stderr, "%s output_info.txt raw/data/directory/\n", argv[0]);return -1;
}
input_directory = argv[2];output_file = argv[1];
/* Get a file listing of all files with in the input directory */DIR *dir_p = opendir (input_directory.c_str());struct dirent *dir_entry_p;
if(dir_p == NULL) {fprintf(stderr, "Failed to open directory %s\n",
input_directory.c_str());return -1;
}
fprintf(stderr, "Object Marker: Input Directory: %s Output File: %s\n",input_directory.c_str(), output_file.c_str());
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
28/30
20
// init highguicvAddSearchPath(input_directory);cvNamedWindow(window_name,1);cvSetMouseCallback(window_name,on_mouse, NULL);
fprintf(stderr, "Opening directory...");// init output of rectangles to the info fileofstream output(output_file.c_str());fprintf(stderr, "done.\n");
while((dir_entry_p = readdir(dir_p)) != NULL){
numOfRec=0;
if(strcmp(dir_entry_p->d_name, ""))fprintf(stderr, "Examining file %s\n", dir_entry_p->d_name);
/* TODO: Assign postfix/prefix info */strPostfix="";strPrefix=input_directory;strPrefix+=dir_entry_p->d_name;//strPrefix+=bmp_file.name;fprintf(stderr, "Loading image %s\n", strPrefix.c_str());
if((image=cvLoadImage(strPrefix.c_str(),1)) != 0){
// work on current imagedo
{cvShowImage(window_name,image);
// used cvWaitKey returns:// =13 save added
rectangles and show next image// =27 exit program// =32 add rectangle to
current image// any other key clears rectangle drawing onlyiKey=cvWaitKey(0);switch(iKey){case 27:
cvReleaseImage(&image);cvDestroyWindow(window_name);return 0;
case 32:numOfRec++;
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
29/30
20
printf(" %d. rect x=%d\ty=%d\tx2h=%d\ty2=%d\n",numOfRec,roi_x0,roi_y0,roi_x1,roi_y1);
//printf(" %d. rect x=%d\ty=%d\twidth=%d\theight=%d\n",numOfRec,roi_x1,roi_y1,roi_x0-roi_x1,roi_y0-roi_y1);
// currently two draw directions possible:// from top left to bottom right
or vice versaif(roi_x0roi_y1){
printf(" %d. rect x=%d\ty=%d\twidth=%d\theight=%d\n",numOfRec,roi_x1,roi_y1,roi_x0-roi_x1,roi_y0-roi_y1);
// append rectangle coord toprevious line content
strPostfix+=""+IntToString(roi_x1)+" "+IntToString(roi_y1)+" "+IntToString(roi_x0-roi_x1)+""+IntToString(roi_y0-roi_y1);
}break;
}}while(iKey!=13);
// save to info file as later used for HaarTraining:// \bmp_file.name numOfRec x0 y0 width0
height0 x1 y1 width1 height1...if(numOfRec>0 && iKey==13){
//append line/* TODO: Store output information. */output
7/16/2019 Deteccin de Objetos mediante HaarFeatures basados en clasificadores en cascada
30/30
}
output.close();cvDestroyWindow(window_name);closedir(dir_p);
return 0;}
Top Related