Detección de Objetos mediante HaarFeatures basados en clasificadores en cascada

download Detección de Objetos mediante HaarFeatures basados en clasificadores en cascada

of 30

Transcript of Detección de Objetos mediante HaarFeatures basados en clasificadores en cascada

  • 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=pdf
  • 7/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=171
  • 7/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.rar
  • 7/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.rar
  • 7/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.html
  • 7/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;}