2012-02-17 53 views
0

我正在使用本网站提供的代码:http://nashruddin.com/OpenCV_Face_Detection来进行人脸检测。如何在OpenCV中增加haar检测器的窗口大小

我想增加检测到的脸部区域的大小。我不知道该怎么做。需要一些关于它的帮助..

我使用的代码是这样的: //

#include "stdafx.h" 

#include <stdio.h> 
#include <cv.h> 
#include <highgui.h> 

CvHaarClassifierCascade *cascade; 
CvMemStorage   *storage; 

void detectFaces(IplImage *img); 

int main(int argc, char** argv) 
{ 
    CvCapture *capture; 
    IplImage *frame; 
    int  key; 
    char  *filename = "C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml"; 

    cascade = (CvHaarClassifierCascade*)cvLoad(filename, 0, 0, 0); 
    storage = cvCreateMemStorage(0); 
    capture = cvCaptureFromCAM(0); 

    assert(cascade && storage && capture); 

    cvNamedWindow("video", 1); 

    while(key != 'q') { 
     frame = cvQueryFrame(capture); 

     if(!frame) { 
      fprintf(stderr, "Cannot query frame!\n"); 
      break; 
     } 

     cvFlip(frame, frame, -1); 
     frame->origin = 0; 

     detectFaces(frame); 

     key = cvWaitKey(10); 
    } 

    cvReleaseCapture(&capture); 
    cvDestroyWindow("video"); 
    cvReleaseHaarClassifierCascade(&cascade); 
    cvReleaseMemStorage(&storage); 

    return 0; 
} 

void detectFaces(IplImage *img) 
{ 
    int i; 

    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); 
} 

回答

1

这增加了头像周围的矩形的大小。如果您的意思是增加哈雷探测器的窗口大小,请更新您的问题。

int padding_width = 30; // pixels 
int padding_height = 30; // pixels 

for(i = 0 ; i < (faces ? faces->total : 0) ; i++) { 
    CvRect *r = (CvRect*)cvGetSeqElem(faces, i); 

    // Yes yes, all of this could be written much more compactly. 
    // It was written like this for clarity. 

    int topleft_x = r->x - (padding_width/2); 
    int topleft_y = r->y - (padding_height/2); 
    if (topleft_x < 0) 
     topleft_x = 0; 
    if (topleft_y < 0) 
     topleft_y = 0; 

    int bottomright_x = r->x + r->width + (padding_width/2); 
    int bottomright_y = r->y + r->height + (padding_height/2); 
    if (bottomright_x >= img->width) 
     bottomright_x = img->width - 1; 
    if (bottomright_y >= img->height) 
     bottomright_y = img->height - 1; 

    cvRectangle(img, 
       cvPoint(topleft_x, topleft_y), 
       cvPoint(bottomright_x, bottomright_y), 
       CV_RGB(255, 0, 0), 1, 8, 0); 
} 
+0

另一个问题:如何增加大小,使其100×100? – lakesh 2012-02-22 19:51:38

+0

@lakesh如果我理解正确,只需将'padding_width'和'padding_height'改为'100'即可。 – 2012-02-22 19:54:27

+0

哎呀..没有看到那部分..再次感谢.. – lakesh 2012-02-22 19:55:10

相关问题