Grifo wrote:salve sono nuovo e devo fare i complimenti per i lavori che l'autore ha realizzato, specie per quanto riguarda la robotica
e i sistemi di intelligenza artificiale.
mi piacerebbe sapere se qualcuno ha mai utilizzato le openCv per riconoscere un oggetto, in particolare
il viso, e seguirlo con una telecamera. (ho visto che è possibile farlo)
Se si, chiedo all' autore del sito, o altri, se mi potete aiutare almeno nelle prime fasi:
cosa occorre
librerie
ed altro.
saluti
Ecco un esempio di come si può fare un riconoscimento dei visi con OpenCV utilizzando
il metodo dei classificatori "HaarClassifierCascade".
Avendo un file di classificazione dei visi o di altre parte del corpo (generato utilizzando circa 10000 immagini di visi diversi su altrettanti sfondi per il background) si può usare con opencv questo metodo. Il sistema di sviluppo utilizzato è il visual studio 6 , in particolare il "C". Nel programma ho integrato anche la gestione della porta seriale attraverso la quale possone essere trasmesse le coordinate del riquadro che racchiude il viso riconosciuto.
NB.Prima di iniziare a smanettare con la visione artificiale, vi consiglio di dare un'occhiata a questa presentazione:
http://www.delucagiovanni.com/files/Computer%20Vision_file/frame.htm- Code: Select all
/*********************************************************
* Face Tracking by G. De Luca 19-02-2011
*********************************************************/
#include <stdio.h>
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "conio.h"
#include "Tserial.h"
CvHaarClassifierCascade *cascade;
CvMemStorage *storage;
Tserial *com;
void detectFaces( IplImage *img );
//-------------------------------- main program ---------------------
int main( int argc, char** argv )
{
com = new Tserial();
{
com->connect("COM11", 115200, spNONE); //apri la com
CvCapture *capture;
IplImage *frame;
int key;
//char *filename = "occhi.xml";
char *filename = "haarcascade_frontalface_default.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 != 'q' ) {
/* get a frame */
frame = cvQueryFrame( capture );
/* always check */
if( !frame )
break;
/* 'fix' frame */
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 );
com->disconnect();
delete com;
com = 0;
}
return 0;
}
//-----------------------------------------------------
void detectFaces( IplImage *img )
{
int i;
char OutStr[256];
/* detect faces */
CvSeq *faces = cvHaarDetectObjects(
img,
cascade,
storage,
1.1,
3,
0 /*CV_HAAR_DO_CANNY_PRUNNING*/,
cvSize( 40, 40 ) ); //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 );
//converti i valori in stringa e trasmessi sulla porta seriale
sprintf(OutStr, "(FOUND,x,%d,%d,%d,%d)\r\n", r->x, r->y,r->x + r->width,r->y + r->height);
com->sendArray(OutStr, strlen(OutStr));
}
/* display video */
cvShowImage( "video", img );
}