2012-02-16 117 views
2

我试图检测图像中的脸部并尝试将检测到的脸部保存为OpenCV中的图像。在OpenCV中检测脸部并保存检测到的脸部

在下面的detectfaces函数中有一些问题。

#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 2012-02-16 16:36:32

+0

以及一个cvRect是这样创建的: CvRect rect = cvRect(25,25,img2-> width,img2-> height);你只是将一个cvSeq *转换成一个cvRect *。你需要了解脸部开始的位置,这是矩形的第一个点,那么序列中的大小就是矩形的大小。仍然错误在那里,并没有在setROI – andrea 2012-02-16 16:42:04

+0

然后我怎么纠正这个错误.. – lakesh 2012-02-16 16:50:10

2

cvSetImageROI()需要cvRect作为第二个参数,并使用它作为输入参数图片夹到该区域。

换句话说,您需要创建一个带有效信息的cvRect。您可以调用函数,或内联之前做到这一点:

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

我还注意到,在你的代码,你在同一个函数内至少3个diferent位置创建CvRect* r;。糟糕的做法!提示:在您要使用它们的时刻在您的代码中创建变量,而不是在此之前。

+1

如何将检测到的面部区域与cvSetImageROI链接起来? – lakesh 2012-02-16 19:58:42

0

只需更换CvRect *rr=(CvRect*)cvGetSeqElem(faces,i)和for循环后写两行

cvSetImageROI(img, cvRect(r->x,r->y,r->width,r->height)); 
cvSaveImage("C1.jpg",img);