Sau khi hoàn thành việc huấn luyện, ta sẽ sử dụng file huấn luyện cho việc phát hiện khuôn mặt. OpenCV đã hỗ trợ đầy đủ các câu lệnh trong việc truy xuất bộ phân lớp XML và kết xuất kết quả ra ảnh nên việc thực hiện khá đơn giản. Ở phần này, ta sẽ xây dựng hàm phục vụ cho việc phát hiện khuôn mặt dựa trên các câu lệnh của OpenCV và bộ phân lớp vừa huấn luyện.
Xây dựng hàm: void detect_and_draw( IplImage* img ) với img là ảnh đầu vào. Hàm này được viết như sau:
CvSeq *faces = cvHaarDetectObjects( img, cascade, storage, 1.1, 3, 0 /*CV_HAAR_DO_CANNY_PRUNNING*/, cvSize( 40, 40 ) );
Khai báo khuôn mặt của người được xác định trên ảnh . Khuôn mặt được xác định bằng hàm:
IntPtr cvHaarDetectObjects(IntPtr image,
IntPtr cascade,
IntPtr storage,
double scaleFactor,
38
int flags,
MCvSize minSize)
Trong đó:
img: Ảnh đầu vào.
cascade: Bộ huấn luyện.
storage: Bộ đệm.
scaleFactor: Hệ số tỉ lệ của cửa sổ kết quả.
minNeighbors: Số lượng hình chữ nhật kết quả nhỏ nhất của một nhóm. Nhóm
nào có số lượng hình chữ nhật nhỏ hơn tham số này sẽ bị loại bỏ.
minSize: Kích cỡ nhỏ nhất của hình chữ nhật quét qua ảnh để lấy các đặc trưng
Haarlike.
Hàm này hoạt động như sau: Scan toàn bộ ảnh bằng một vùng có kích thước cố định. Xét xem vùng đó có chứa khuôn mặt hay không bằng cách đưa qua máy phân lớp AdaBoost theo hàm cvRunHaarClassifierCascade. Trong đó, hàm cvRunHaarClassifierCascade sẽ kiểm tra xem vùng ảnh đó có đi qua hết các bộ phân lớp yếu hay không? Bộ phân lớp sẽ dựa trên tập huấn luyện XML để quyết định. Để đảm bảo phát hiện được tất cả các khuôn mặt với kích thước khác nhau, hàm sẽ quét ảnh trên nhiều độ phân giải. Kết quả xuất ra là tất cả các vùng ảnh đã qua được tất cả các bộ phân lớp yếu. Các vùng ảnh này được chồng lên nhau trên ảnh kết quả. Trong các vùng đó, sẽ có những vùng sai hoặc bị lệch đôi chút. Hàm sẽ tự động phân nhóm các vùng đó và cho ra kết quả cuối cùng là vùng trung bình của nhóm đó [3].
Tìm tất cả các gương mặt trong ảnh và xác định vị trí của khuôn mặt
/* với mỗi khuôn mặt tìm được, vẽ một hình chữ nhật */
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 );
}
/* hiển thị */
cvShowImage( "pic", img ); Trong hàm main:
CvHaarClassifierCascade *cascade; CvMemStorage *storage;
//Dẫn đường dẫn tới bộ huấn luyện có sẵn trong OpenCV
const char* cascade_name =
"D:/Soft/Programmer/Run/Library/OpenCV/opencv/data/haarcascades/haarcascade_fro ntalface_alt2.xml";
cascade = ( CvHaarClassifierCascade* )cvLoad( cascade_name, 0, 0, 0 );
39
/*dung lượng bộ nhớ đệm cho việc detect */
storage = cvCreateMemStorage( 0 );
IplImage *img = cvLoadImage("D:\\Code\\OpenCV\\HaarLike Pic\\Resource\\2.jpg"); detect_and_draw(img);
cvWaitKey();
cvReleaseImage(&img); cvDestroyWindow("result");
Hình 3.8 Result window