我将使用OpenCV进行人脸检测。首先,我从Harpia导出了我的基本算法。不改变任何东西(除了删除cvauxh .h的包含),当我用gcc facedetect.c -std=c99 -lm -Wall
' pkg-config -libs -cflags opencv ' -o facedetect.elf
编译它时,我得到错误:facedetect.c:64: error: too few arguments to function ‘cvHaarDetectObjects’
这是从Harpia导出的代码,我需要让它运行。
// Auto-generated C Code - S2i Harpia
/*
* In order to compile this source code run, in a terminal window, the following command:
* gcc sourceCodeName.c `pkg-config --libs --cflags opencv` -o outputProgramName
*
* the `pkg-config ... opencv` parameter is a inline command that returns the path to both
* the libraries and the headers necessary when using opencv. The command also returns other necessary compiler options.
*/
// header:
#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>
#include <math.h>
#define PI 3.1415926535898
double rads(double degs)
{
return (PI/180 * degs);
}
int main(int argc, char ** argv)
{
//declaration block
char block2_arg_Filename[] = "/home/user/Harpia/uebung06/img/faces.png";
IplImage * block2_img_o1 = NULL;
IplImage * block1_img_i1 = NULL;
CvPoint block1_point_o1 = cvPoint(0,0);
CvRect block1_rect_o2 = cvRect( 0, 0, 1, 1);
IplImage * block1_img_o3 = NULL;
double block1_double_o4 = 0.0;
static CvMemStorage* block1_storage = 0;
static CvHaarClassifierCascade* block1_cascade = 0;
const char* block1_cascade_name = "/usr/share/harpia/images/haarcascade_frontalface_alt2.xml";
IplImage * block10_img_i1 = NULL;
IplImage * block10_img_o1 = NULL;
IplImage * block5_img_i1 = NULL;
IplImage * block5_img_o1 = NULL;
CvRect block5_rect_i2;
IplImage * block9_img_i1 = NULL;
IplImage * block9_img_o1 = NULL;
//execution block
//Weight: 1
block2_img_o1 = cvLoadImage(block2_arg_Filename,-1);
block1_img_i1 = cvCloneImage(block2_img_o1);// IMAGE conection
block5_img_i1 = cvCloneImage(block2_img_o1);// IMAGE conection
//Weight: 2
if(block1_img_i1){
double scale = 1.3;
block1_cascade = (CvHaarClassifierCascade*)cvLoad(block1_cascade_name, 0, 0, 0);
IplImage* gray = cvCreateImage(cvSize(block1_img_i1->width,block1_img_i1->height), 8, 1);
IplImage* small_img = cvCreateImage(cvSize(cvRound(block1_img_i1->width/scale), cvRound(block1_img_i1->height/scale)), 8, 1);
cvCvtColor(block1_img_i1, gray, CV_BGR2GRAY);
cvResize(gray, small_img, CV_INTER_LINEAR);
cvEqualizeHist(small_img, small_img);
if(!block1_img_o3)
block1_img_o3 = cvCloneImage(block1_img_i1);
cvCopy(block1_img_i1,block1_img_o3,0);
block1_storage = cvCreateMemStorage(0);
cvClearMemStorage(block1_storage);
block1_rect_o2 = cvRect( 0, 0, 1, 1);
CvSeq* faces = cvHaarDetectObjects(small_img, block1_cascade, block1_storage, 1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,cvSize(30, 30));
block1_double_o4 = faces->total;
if(faces)
{
int i;
for( i = 0; i < (faces ? faces->total : 0); i++ )
{
CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
if(r)
{
CvPoint center;
int radius;
center.x = cvRound((r->x + r->width*0.5)*scale);
center.y = cvRound((r->y + r->height*0.5)*scale);
radius = cvRound((r->width + r->height)*0.25*scale);
cvCircle( block1_img_o3, center, radius, cvScalarAll(0), 3, 8, 0 );
if(i == 0)
{
block1_point_o1 = center;
block1_rect_o2.x = (r->x)*scale;
block1_rect_o2.y = (r->y)*scale;
block1_rect_o2.width = (r->width)*scale;
block1_rect_o2.height = (r->height)*scale;
}
}
}
}
cvReleaseImage( &gray );
cvReleaseImage( &small_img );
}
block5_rect_i2 = block1_rect_o2;// RECT conection
block10_img_i1 = cvCloneImage(block1_img_o3);// IMAGE conection
//Weight: 3
block10_img_o1 = cvCloneImage(block10_img_i1);
if(block10_img_i1)
cvSaveImage("/home/user/Harpia/uebung06/img/detected.png", block10_img_i1, 0);
//Weight: 4
if(block5_img_i1){
block5_rect_i2.x = MAX(0,block5_rect_i2.x);//Check whether point is negative
block5_rect_i2.y = MAX(0,block5_rect_i2.y);
block5_rect_i2.x = MIN(block5_img_i1->width-1,block5_rect_i2.x);//Check whether point is out of the image
block5_rect_i2.y = MIN(block5_img_i1->height-1,block5_rect_i2.y);
block5_rect_i2.width = MIN(block5_img_i1->width-block5_rect_i2.x,block5_rect_i2.width);//Check whether rect reaches out of the image
block5_rect_i2.height = MIN(block5_img_i1->height-block5_rect_i2.y,block5_rect_i2.height);
block5_img_o1 = cvCreateImage(cvSize(block5_rect_i2.width,block5_rect_i2.height), block5_img_i1->depth,block5_img_i1->nChannels);
cvSetImageROI(block5_img_i1,block5_rect_i2);
cvCopyImage(block5_img_i1,block5_img_o1);
}
block9_img_i1 = cvCloneImage(block5_img_o1);// IMAGE conection
//Weight: 9
block9_img_o1 = cvCloneImage(block9_img_i1);
if(block9_img_i1)
cvSaveImage("/home/user/Harpia/uebung06/img/32.png", block9_img_i1, 0);
cvNamedWindow("Control Window",CV_WINDOW_AUTOSIZE );
//deallocation block
cvReleaseImage(&block2_img_o1);
cvReleaseImage(&block1_img_o3);
cvReleaseImage(&block1_img_i1);
cvReleaseMemStorage(&block1_storage);
cvReleaseImage(&block10_img_o1);
cvReleaseImage(&block10_img_i1);
cvReleaseImage(&block5_img_o1);
cvReleaseImage(&block5_img_i1);
cvReleaseImage(&block9_img_o1);
cvReleaseImage(&block9_img_i1);
return 0;
} //closing main()
谢谢你的帮助!
正确的函数签名为
CVAPI(CvSeq*) cvHaarDetectObjects( const CvArr* image,
CvHaarClassifierCascade* cascade, CvMemStorage* storage,
double scale_factor CV_DEFAULT(1.1),
int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0),
CvSize min_size CV_DEFAULT(cvSize(0,0)), CvSize max_size CV_DEFAULT(cvSize(0,0)));
这一行应该是
CvSeq* faces = cvHaarDetectObjects(small_img, block1_cascade, block1_storage, 1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,cvSize(10, 10), cvSize(30, 30));