Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.87 MB, 67 trang )
Thuật toán
Ta sử dụng mẫu học dựa trên kỹ thuật Haar + Adaboost cho 6 đối
tƣợng sau: mặt thẳng, đôi mắt, mắt trái, mắt phải, mũi, miệng.
Hình 3.2: Nhận dạng khuôn mặt dựa trên thành phần
Bƣớc 1: Phát hiện thô khuôn mặt trên ảnh bằng mẫu mặt thẳng. Sau
bƣớc này ta sẽ đƣợc một tập các vùng ảnh có khả năng là khuôn mặt.
Bƣớc 2: Phát hiện đôi mắt ở vùng từ 1/6 đến 1/2 ảnh khuôn mặt tính
từ trên xuống. Nếu tìm thấy chuyển qua bƣớc 3.
Bƣớc 3: Phát hiện mắt trái trong vùng từ 1/6 đến 1/2 chiều cao và từ
giữa đôi mắt sang trái. Nếu thấy chuyển bƣớc 4.
Bƣớc 4: Phát hiện mắt phải trong vùng từ 1/6 đến 1/2 chiều cao và từ
giữa đôi mắt sang phải. Nếu thấy chuyển bƣớc 5.
Bƣớc 5: Phát hiện mũi trong vùng từ 1/4 đến 3/4 chiều rộng và từ
giữa đôi mắt đến khoảng 1/8 cận dƣới. Nếu thấy chuyển bƣớc 6.
Bƣớc 6: Phát hiện miệng trong vùng từ 1/8 đến 7/8 chiều rộng và từ
giữa mũi đến khoảng 1/8 cận dƣới. Nếu thấy thì thông báo tìm thấy
khuôn mặt.
52
// Hàm dò các mặt trong ảnh và vẽ khung vào các bộ phận mặt, mắt,
mũi, miệng
void detectAnDraw(const IplImage* src, IplImage* dst, FaceFinder* detector) {
vector
IplImage* face;
int i, j;
// khai báo các hình vuông cho các bộ phận
CvRect ep, le, re, no, mo;
CvMemStorage *stor;
stor = cvCreateMemStorage(0);
detector->detect(src, faces, 0);
// Duyệt tất cả các khuôn mặt có trong ảnh
for (i=0; i
face = getSubImage(src, faces[i]);
detector->calcFCs(face, ep, le, re, no, mo, stor);
drawRect(dst, 0, 0, faces[i].x, faces[i].y, faces[i].width,
faces[i].height, 0, 255, 0);
drawRect(dst, faces[i].x, faces[i].y, ep.x, ep.y, ep.width, ep.height,
255, 255, 255);
//Vẽ hình vuông vào mắt trái
drawRect(dst, faces[i].x, faces[i].y, le.x, le.y, le.width, le.height, 0,
0, 255);
//Vẽ hình vuông vào mắt phải
drawRect(dst, faces[i].x, faces[i].y, re.x, re.y, re.width, re.height, 0,
255, 255);
//Vẽ hình vuông vào mũi
drawRect(dst, faces[i].x, faces[i].y, no.x, no.y, no.width, no.height,
255, 0, 0);
53
//Vẽ hình vuông vào miệng
drawRect(dst, faces[i].x, faces[i].y, mo.x, mo.y, mo.width,
mo.height, 255, 255, 0);
cvReleaseImage(&face);
}
3.4 Giao diện và cách sử dụng
* Khởi động chƣơng trình
Kích nút Open image
- Chọn ảnh
- Kích nút open
Chƣơng trình tự phát hiện khuôn mặt, hiện kết quả
54
3.5 Kết quả thử nghiệm
3.5.1 Góc chụp so với hƣớng ống kính
Các kết quả này đƣợc thực hiện trên các ảnh màu, mỗi ảnh chỉ có
duy nhất một khuôn mặt. Khuôn mặt đƣợc lần lƣợt đƣợc chụp theo các góc
độ khác nhau từ chính diện, xoay dần đến góc 900. Các kết quả cho khả
năng phát hiện khuôn mặt sẽ khó khăn dần khi khuôn mặt chếch nhiều so
với hƣớng ống kính.
Đặc điểm, góc chụp khuôn mặt
Kết quả thực nghiệm
Khuôn mặt chính diện
55