Menu

Friday, June 7, 2013

[OpenCV] วิธีการตรวจจับใบหน้า โดยใช้ Haar Cascade Classifier
[OpenCV] How to Detect Face using Haar Cascade Classifier

สมมติว่า img เป็นภาพสีสำหรับตรวจจับใบหน้า
Assume that img is color image for face detection

  1. const char* cascade_name = "haarcascade_frontalface_alt.xml";
  2. static CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name );
  3. static CvMemStorage* storage = cvCreateMemStorage(0);

  4. CvSeq* detectFace(IplImage* img){
  5.      
  6.      static IplImage* gray=0;
  7.      if(gray && (gray->width!=img->width || gray->height!= img->height)){
  8.           cvReleaseImage(&gray);
  9.           gray=0;
  10.      }
  11.      if(!gray)
  12.           gray=cvCreateImage(cvGetSize(img),8,1);

  13.      cvCvtColor(img,gray,CV_BGR2GRAY);
  14.      cvClearMemStorage( storage );
  15.      CvSeq* faces = cvHaarDetectObjects( gray, cascade, storage, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(100, 100) );
  16.      return faces;
  17. }

บรรทัดที่ 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 it
min_size is the minimum size of object to be detected

โค้ดด้านล่างเป็นการวาดสี่เหลี่ยมรอบใบหน้าที่ตรวจจับได้
The below code, rectangles are drawn around detected faces
  1. CvPoint pt1, pt2;
  2. for(int i = 0; i < (faces ? faces->total : 0); i++ )
  3. {
  4.      // Create a new rectangle for drawing the face
  5.      CvRect* r = (CvRect*)cvGetSeqElem( faces, i );

  6.      // Find the dimensions of the face,and scale it if necessary
  7.      pt1.x = r->x;
  8.      pt2.x = (r->x+r->width);
  9.      pt1.y = r->y;
  10.      pt2.y = (r->y+r->height);

  11.       // Draw the rectangle in the input image
  12.      cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
  13. }

No comments:

Post a Comment