Assume that img is color image for face detection
- const char* cascade_name = "haarcascade_frontalface_alt.xml";
- static CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name );
- static CvMemStorage* storage = cvCreateMemStorage(0);
- CvSeq* detectFace(IplImage* img){
- static IplImage* gray=0;
- if(gray && (gray->width!=img->width || gray->height!= img->height)){
- cvReleaseImage(&gray);
- gray=0;
- }
- if(!gray)
- gray=cvCreateImage(cvGetSize(img),8,1);
- cvCvtColor(img,gray,CV_BGR2GRAY);
- cvClearMemStorage( storage );
- CvSeq* faces = cvHaarDetectObjects( gray, cascade, storage, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(100, 100) );
- return faces;
- }
บรรทัดที่ 1-3, ประกาศตัวแปรแบบ global สำหรับใช้ในการตรวจจับใบหน้า
At line 1-3, the global variables that are used for face detection are declared
บรรทัดที่ 7-13, gray ถูกนิยามให้เป็นภาพที่มีความลึก 8 บิท 1 แชนเนล และมีขนาดเดียวกับ img
At line 7-13, gray is defined to be an image with 8 bits depth, 1 channel, and the same size as img
บรรทัดที่ 15, img ถูกแปลงเป็นภาพสีเทาและเก็บลงใน gray
At line 15, img is converted to gray scale image and stored in gray
บรรทัดที่ 16, ทำการล้างข้อมูลในหน่วยความจำที่ใช้ในการคำนวณ
At line 16, the storage is cleared for calculation
บรรทัดที่ 17, ทำการตรวจจับใบหน้าโดยใช้ Haar Cascade Classifier
At line 17, The faces are detected using Haar Cascade Classifier
CvSeq* faces = cvHaarDetectObjects( gray, cascade, storage, scale_factor, min_neighbor, CV_HAAR_DO_CANNY_PRUNING, min_size);
scale_factor ระบุว่าต้องลดขนาดภาพทีละเท่าไหร่
min_neighbor ระบุว่าต้องมีการถูกเลือกมากเท่าไหร่ จึงจะถูกเลือกเป็นคำตอบmin_size ระบุขนาดเล็กที่สุดที่เป็นไปได้ของวัตถุที่ต้องการตรวจจับ
scale_factor specify how much the image size is reduced at each image scale
min_neighbor specify how many neighbors each candidate rectangle should have to retain itmin_size is the minimum size of object to be detected
The below code, rectangles are drawn around detected faces
- CvPoint pt1, pt2;
- for(int i = 0; i < (faces ? faces->total : 0); i++ )
- {
- // Create a new rectangle for drawing the face
- CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
- // Find the dimensions of the face,and scale it if necessary
- pt1.x = r->x;
- pt2.x = (r->x+r->width);
- pt1.y = r->y;
- pt2.y = (r->y+r->height);
- // Draw the rectangle in the input image
- cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
- }
No comments:
Post a Comment