2012-02-16 116 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);