我要使用OpenCV进行人脸检测。首先,我从Harpia导出了我的基本算法。不更改任何内容(除去删除cvaux.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));

关于c - OpenCV:从竖琴导出源代码后: “too few arguments to function ‘cvHaarDetectObjects’”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17212569/

10-10 18:35