2012-02-16 2 views
2

Я пытаюсь обнаружить лицо на изображении и попытаться сохранить обнаруженное лицо как изображение в OpenCV.Обнаружение лица и сохранение обнаруженного лица в OpenCV

Наличие некоторых проблем в функции детекторов ниже.

#include "stdafx.h" 

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

CvHaarClassifierCascade *cascade; 
CvMemStorage   *storage; 

void detectFaces(IplImage *img); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    //CvCapture *capture; 
    IplImage *img;//*out; 
    int  key = 0; 
    char  *filename = "C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml"; 

    cascade = (CvHaarClassifierCascade*)cvLoad(filename, 0, 0, 0); 
    storage = cvCreateMemStorage(0); 
    img  = cvLoadImage("Yurico.png"); 

    assert(cascade && storage && img); 

    cvNamedWindow("video:", 1); 
    //cvNamedWindow("video1:", 1); 
    //out = detectFaces(img); 
    detectFaces(img); 
    cvWaitKey(0); 
    //cvShowImage("video", out); 
    cvDestroyWindow("video:"); 
    //cvDestroyWindow("video1:"); 
    cvReleaseImage(&img); 
    cvReleaseHaarClassifierCascade(&cascade); 
    cvReleaseMemStorage(&storage); 

    return 0; 
} 

void detectFaces(IplImage *img) 
{ 
    int i; 
    CvRect *r; 
    CvSeq *faces = cvHaarDetectObjects(
      img, 
      cascade, 
      storage, 
      1.1, 
      3, 
      0 /*CV_HAAR_DO_CANNY_PRUNNING*/, 
      cvSize(40, 40)); 

    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); 
    } 

    //cvShowImage("video:", img); 
    cvSetImageROI(img, CvRect *r); 

    IplImage *img2 = cvCreateImage(cvGetSize(img), 
           img->depth, 
           img->nChannels); 

    cvSaveImage("Lakshmen.jpg",img2); 
} 

Есть ошибки, говоря так:

Error 1 error C2664: 'cvSetImageROI' : cannot convert parameter 2 from 'CvRect *' to 'CvRect' c:\users\hp\documents\visual studio 2010\projects\facedetect\facedetect\facedetect.cpp 67 1 facedetect 

Хочет, чтобы сохранить область интереса в другое изображение. Любые исправления или улучшения скажут мне.

ответ

2

вам необходимо передать CvRect, а не CvRect *, поэтому вам не нужен указатель (*) до r. и так как это уже cvRect вы должны просто написать:

cvSetImageROI(img, &r); 
+0

я пытался с этим .. но ошибка все еще существует .... – lakesh

+0

Ну cvRect создается следующим образом: CvRect rect = cvRect (25, 25, img2-> width, img2-> height); вы просто бросаете cvSeq * в cvRect *. вам нужно понять, где лицо будет выглядеть, и это первая точка прямоугольника, тогда размер в последовательности будет размером прямоугольника. все еще ошибка есть, а не в setROI – andrea

+0

, тогда как я исправлю ошибку. – lakesh

2

cvSetImageROI() занимает cvRect как 2-й аргумент, и он использует его в качестве входного параметра, чтобы обрезать изображение в этой области.

Другими словами, вам необходимо создать cvRect с действительной информацией. Вы можете сделать это перед вызовом функции или инлайн:

cvSetImageROI(img_corr, cvRect(x_pos, y_pos, width, height)); 

Я также заметил, что в вашем коде, вы создаете CvRect* r; по крайней мере 3 местах Diferent внутри одной и той же функции. Плохая практика! Совет. Создайте переменные в своем коде в тот момент, когда вы собираетесь использовать их, а не раньше этого.

+1

Как связать обнаруженную область лица вместе с cvSetImageROI? – lakesh

0

Просто замените CvRect *r в r=(CvRect*)cvGetSeqElem(faces,i) и после для петли написать две строки

cvSetImageROI(img, cvRect(r->x,r->y,r->width,r->height)); 
cvSaveImage("C1.jpg",img); 
Смежные вопросы