2012-02-16 20 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

を書き後cvRectは、このように作成されるだけでなく – lakesh

+0

....私はそれを試してみました..しかし、エラーがまだ存在します: CvRect rect = cvRect(25,25、img2-> width、img2-> height);あなたは単にcvSeq *をcvRect *にキャストしています。あなたは顔がどこにあるのかを理解する必要があり、これが矩形の最初のポイントである場合、シーケンス内のサイズはrectのサイズになります。それでもエラーはありますが、setROI – andrea

+0

ではなく、間違いを修正する方法はありません。 – lakesh

2

cvSetImageROI()は、第2引数としてcvRectを取り、それがその領域に画像をクリップする入力パラメータとして、それを使用しています。

つまり、有効な情報を持つcvRectを作成する必要があります。あなたは、関数を呼び出す前にそれを行う、またはインラインすることができます

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

私はまた、あなたのコードでは、あなたが同じ関数内に少なくとも3つのdiferent場所にCvRect* r;を作成することに気づきました。悪い練習!ヒント:コードを使用する瞬間に、その前にではなく、コードに変数を作成してください。

+1

検出された顔領域とcvSetImageROIをリンクさせる方法は? – lakesh

0

だけr=(CvRect*)cvGetSeqElem(faces,i)としてCvRect *rを交換し、forループ二行

cvSetImageROI(img, cvRect(r->x,r->y,r->width,r->height)); 
cvSaveImage("C1.jpg",img); 
関連する問題