Обнаружение лица и сохранение обнаруженного лица в OpenCV
Я пытаюсь определить лицо на изображении и пытаюсь сохранить обнаруженное лицо как изображение в OpenCV.
Возникли некоторые проблемы в функции Detefaces ниже.
#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
Хотите сохранить интересующую область в другое изображение. Любые исправления или улучшения, скажите мне..
3 ответа
Вам нужно передать CvRect, а не CvRect*, поэтому вам не нужен указатель (*) перед r. и так как это уже cvRect, вы должны просто написать:
cvSetImageROI(img, &r);
cvSetImageROI()
занимает cvRect
как второй аргумент, и он использует его в качестве входного параметра, чтобы обрезать изображение в этой области.
Другими словами, вам нужно создать cvRect
с действительной информацией. Вы можете сделать это перед вызовом функции или встроенным:
cvSetImageROI(img_corr, cvRect(x_pos, y_pos, width, height));
Я также заметил, что в вашем коде вы создаете CvRect* r;
как минимум в 3 разных местах внутри одной и той же функции. Плохая практика! Совет: создавайте переменные в своем коде в тот момент, когда вы собираетесь их использовать, а не до этого.
Просто замените CvRect *r
как r=(CvRect*)cvGetSeqElem( faces,i)
и после цикла for напишите две строки
cvSetImageROI(img, cvRect(r->x,r->y,r->width,r->height));
cvSaveImage("C1.jpg",img);