2012-02-17 2 views
0

나는이 웹 사이트에서 사용할 수있는 코드를 사용하고 있습니다 : http://nashruddin.com/OpenCV_Face_Detection 얼굴 검출.OpenCV에서 haar detector의 창 크기를 늘리는 방법

감지 된 얼굴 영역의 크기를 늘리고 싶습니다. 어떻게해야할지 모르겠다. //

#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

이 얼굴 주위에 사각형의 크기를 증가 :

내가 사용하고있는 코드는 이것이다 .. 거기에 약간의 도움이 필요합니다. haar detector의 창 크기를 늘리려면, 질문을 업데이트하십시오.

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

다른 질문 : 100x100 크기를 늘리는 방법? – lakesh

+0

@lakesh 올바르게 이해했다면'padding_width'와'padding_height'을'100'으로 변경하십시오. –

+0

죄송합니다 .. 그 부분을 보지 못했습니다 .. 다시 한 번 감사드립니다 .. – lakesh