2010-10-30 26 views
2

Je travaille sur la détection d'objets (yeux) en utilisant OpenCV. Voici le code car il n'est pas capable d'identifier un objet œil (exactement ou à proximité). Quelqu'un peut-il m'aider à résoudre ce problème?Détection des yeux en utilisant Opencv

if(imageView.image) { 
    cvSetErrMode(CV_ErrModeParent); 

    IplImage *image = [self CreateIplImageFromUIImage:imageView.image]; 

    // Scaling down 
    IplImage *small_image = cvCreateImage(cvSize(image->width/2,image->height/2), IPL_DEPTH_8U, 3); 
    cvPyrDown(image, small_image, CV_GAUSSIAN_5x5); 
    int scale = 2; 

    // Load XML 
    NSString *path1=[[NSBundle mainBundle] pathForResource:@"haarcascade_eye" ofType:@"xml"]; 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_default" ofType:@"xml"]; 
    CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad([path cStringUsingEncoding:NSASCIIStringEncoding], NULL, NULL, NULL); 
    CvHaarClassifierCascade* cascade1= (CvHaarClassifierCascade*)cvLoad([path1 cStringUsingEncoding:NSASCIIStringEncoding], NULL, NULL,NULL); 
    CvMemStorage* storage = cvCreateMemStorage(0); 

    // Detect faces and draw rectangle on them 
    CvSeq* faces = cvHaarDetectObjects(small_image, cascade, storage, 1.2f, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(20, 20)); 
    cvReleaseImage(&small_image); 

    // Create canvas to show the results 
    CGImageRef imageRef = imageView.image.CGImage; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef contextRef = CGBitmapContextCreate(NULL, imageView.image.size.width, imageView.image.size.height, 
       8, imageView.image.size.width * 4, 
       colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault); 
    CGContextDrawImage(contextRef, CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height), imageRef); 

    CGContextSetLineWidth(contextRef, 4); 
    CGContextSetRGBStrokeColor(contextRef, 0.0, 0.0, 1.0, 0.5); 

    CvRect cvrect; 

    // Draw results on the iamge 
    for(int i = 0; i < faces->total; i++) 
    { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // Calc the rect of faces 
    cvrect = *(CvRect*)cvGetSeqElem(faces, i); 
    CGRect face_rect = CGContextConvertRectToDeviceSpace(contextRef, CGRectMake(cvrect.x * scale, cvrect.y * scale, cvrect.width * scale, cvrect.height * scale)); 

    if(overlayImage) 
    { 
    CGContextDrawImage(contextRef, face_rect, overlayImage.CGImage); 
    } 
    else 
    { 
    CGContextStrokeRect(contextRef, face_rect); 
    } 
    [pool release]; 
    } 

    cvClearMemStorage(storage); 

    // cvSetImageROI(image,cvRect((cvrect.x * scale),(cvrect.y * (scale +((cvrect.height * scale)/5.5))), (cvrect.width * scale), (cvrect.height * scale)/3.0)); 
    cvSetImageROI(image, cvRect(80,100,300,300)); 
    CvSeq* eyes=cvHaarDetectObjects(image, cascade1, storage, 1.15, 3, 0, cvSize(25, 15)); 
    for(int i=0;i<eyes->total;i++) 
    { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    CvRect cvrect= *(CvRect*)cvGetSeqElem(eyes, i); 
     // cvRectangle(img,cvPoint(cvrect.x * scale, cvrect.y * scale),cvPoint(cvrect.x * scale + cvrect.width * scale, cvrect.y * scale+cvrect.height * scale); 
    CGRect eyes_rect = CGContextConvertRectToDeviceSpace(contextRef, CGRectMake(cvrect.x * scale, cvrect.y * scale, cvrect.width * scale, cvrect.height * scale));  
    if(overlayImage) { 
    CGContextDrawImage(contextRef, eyes_rect, overlayImage.CGImage); 
    } 
    else 
    { 
    CGContextStrokeRect(contextRef, eyes_rect); 
    } 
    [pool release]; 
    } 
     cvResetImageROI(image); 




    imageView.image = [UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)]; 
    CGContextRelease(contextRef); 
    CGColorSpaceRelease(colorSpace); 


    cvReleaseMemStorage(&storage); 
    cvReleaseHaarClassifierCascade(&cascade); 
    //int i; 

    [self hideProgressIndicator]; 
} 

} 
+0

Votre question est un peu sèche ... Votre système de détection de visage fonctionne-t-il correctement? Quel est votre symptôme exact de 'ne pas travailler', vous avez toujours 'yeux-> total' == 0? – rotoglup

+0

avez-vous réussi à détecter les yeux? – mayuur

Répondre

1

cela semble basé sur le code de l'échantillon facedetect inclus avec OpenCV 2.1 Le fichier XML que vous utilisez est inclus dans le répertoire de données de la distro.

Je ne suis pas certain de la façon dont l'échelle est invariante. Je vous suggère de changer l'échelle pour que cela fonctionne pour votre échelle d'image d'entrée.

Jetez un oeil à l'exemple de code python facedetect.py pour quelques indices

0

set cadre face_rect alors que le passage de paramètres pour

setImageRIO

CGRect face_rect;

// Draw results on the iamge 
for(int i = 0; i < faces->total; i++) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // Calc the rect of faces 
    CvRect cvrect = *(CvRect*)cvGetSeqElem(faces, i); 

    face_rect = CGContextConvertRectToDeviceSpace(contextRef, 
          CGRectMake(cvrect.x * scale, cvrect.y * scale, cvrect.width * scale, cvrect.height * scale)); 
    CGContextStrokeRect(contextRef, face_rect); 

    [pool release]; 


} 

cvClearMemStorage (stockage);

cvSetImageROI(image, cvRect(face_rect.origin.x,face_rect.origin.y,face_rect.size.width,face_rect.size.height)); 

CvSeq *eye = cvHaarDetectObjects(small_image, cascade, storage,1.1, 3, 0, cvSize(10, 10)); 

for(int i=0;i<eye->total;i++) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    CvRect cvrect= *(CvRect*)cvGetSeqElem(eye, i); 

    CGRect eyes_rect; 

    CGContextSetRGBStrokeColor(contextRef, 1.1, 1.0, 0.0, 0.5); 
     //left eye detection 
     eyes_rect = CGContextConvertRectToDeviceSpace(contextRef, CGRectMake((cvrect.x *scale + 20), (cvrect.y * scale)+(cvrect.height - 30) , cvrect.width - 30, 40)); 

     CGContextStrokeRect(contextRef, eyes_rect); 

     //right eye detection 
    CGRect eyes_Right = CGContextConvertRectToDeviceSpace(contextRef, CGRectMake((cvrect.x *scale + cvrect.width+ 10), (cvrect.y * scale)+(cvrect.height - 30) , cvrect.width - 30, 40)); 

     CGContextStrokeRect(contextRef, eyes_Right);  

    [pool release]; 
} 
+0

-1 pour jeter un gros code chunck sans aucune explication du but de celui-ci. – rotoglup

+0

ouais, cela semble fonctionner ... merci toute idée de savoir comment détecter la bouche –