Elso nap, folytatás...

Most nem fogom ujraolvasni, hol hagytam abba a legutóbbi bejegyzésnél, inkább leírom, hogy mire jutottam ma.

Topic : arcfelismerés -> Haar-like feature.

Ez egyfajta osztályozási algoritmus, aminek a lényege, hogy bizonyos arányban gondosan elosztott téglalappal végigpásztázzuk a képet, olyan helyek után kutatva, ahol a megfelelő szín-arányt találjuk. Ezzel az algoritmussal dolgozik az OpenCV könyvtári arc- illetve objektum kereső függvénye is. Ezek a függvények már betanított értékhalmazzal és sokszintes döntési struktúrával rendelkeznek arcfelismerésre, orr- és szemfelismerésre illetve felsőtest felismerésre. Persze interneten elég sok ilyen már megtanított szűrőt találhatunk kezdve a rajzfilmfigura felismeréstől egészen a céges logó vagy spagettistál felismerésig. A program működése elég gyengén van dokumentálva, annak ellenére, hogy teljesen ingyenes és publikus a forráskódja. Nem igazán találtam olyat, hogy bárki is megpróbálta volna reprodukálni avagy gyökerekig hatolva megérteni a program működését. Aki foglalkozott a témával és rátaláltam dokumentációjára, az inkább csak használta ezeket a könyvtári függvényeket. Lehetőségünk van viszonylag egyszerűen új neuronháló tanításra is (példáúl megtaníthaunk egy neuronhálót, hogy ismerjen fel minden ellenséges katonát :P :D )

Bemásolom ide a legelső kipróbált és működőképes arcfelismerő forráskódot, persze OpenCV könyvtári függvények használatával:

#include <stdio.h>
#include "cv.h"
#include "highgui.h"

CvHaarClassifierCascade *cascade;
CvMemStorage            *storage;

void detectFaces( IplImage *img );

int main()
{
    CvCapture *capture;
    IplImage  *frame;
    int       key=0;
    char      *filename = "haarcascade_frontface_alt.xml";

    /* load the classifier
       note that I put the file in the same directory with
       this code */
    cascade = ( CvHaarClassifierCascade* )cvLoad( filename, 0, 0, 0 );

    /* setup memory buffer; needed by the face detector */
    storage = cvCreateMemStorage( 0 );
    /* initialize camera */
    capture = cvCaptureFromCAM( 0 );
    /* always check */
    assert( cascade && storage && capture );
    /* create a window */
    cvNamedWindow( "video", 1 );
    while( key != 27 ) {
        /* get a frame */
        frame = cvQueryFrame( capture );
        /* always check */
        if( !frame ) break;
        /* 'fix' frame */
        //cvFlip( frame, frame, -1 );
        cvFlip(frame,frame,1);
        frame->origin = 0;
        /* detect faces and display video */
        detectFaces( frame );
        /* quit if user press 'q' */
        key = cvWaitKey( 10 );
    }
/* free memory */
    cvReleaseCapture( &capture );
    cvDestroyWindow( "video" );
    cvReleaseHaarClassifierCascade( &cascade );
    cvReleaseMemStorage( &storage );
    return 0;
}

void detectFaces( IplImage *img )
{
    int i;
    /* detect faces */
    CvSeq *faces = cvHaarDetectObjects(
            img,
            cascade,
            storage,
            1.1,
            3,
            0 /*CV_HAAR_DO_CANNY_PRUNNING*/,
            cvSize( 40, 40 ) );
    /* for each face found, draw a red box */
    for( i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ ) {
        CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );
        cvRectangle( img,
                     cvPoint( r->x, r->y ),
                     cvPoint( r->x + r->width, r->y + r->height ),
                     CV_RGB( 255, 0, 0 ), 1, 8, 0 );
    }
    /* display video */
    cvShowImage( "video", img );
}





     Ami a történetből kimaradt, az a Visual Studio beállítása, hogy működjön az OpenCV. Sajnos már nem tudom, melyik link után sikerült, lényeg, hogy OpenCV 2.0 verzió.

     Most fogok neki, és írok egy keresőfüggvényt C-ben. Keresek olyan régiókat, ahol a feketével jelölt négyzet alatti pixelek átlaga mindkét esetben nagyobb lesz, mint a fehér négyzet alatti pixelek átlaga. Ha végeztem vele, teszek fel pár tesztképet.

0 megjegyzés:

Megjegyzés küldése

Return top