4.1.1 Không gian mầu RGB
Không gian mầu RGB dựa trên mô hình mầu RGB. RGB là viết tắt của 3 ký tự đầu của 3 mầu cơ bản: Red (đỏ), Green (xanh lá cây), Blue (xanh nước biển). RGB là một mô hình mầu thuận tiện cho đồ họa máy tính do nó hoạt động theo cách thức tương tự hệ thống nhãn quang của con người.
Hình 8 – Biểu diễn khối hộp của không gian mầu RGB
Trong ảnh 24bit RGB, mỗi điểm ảnh được biểu diễn bởi 24 bit dữ liệu gồm 8 bit dữ liệu mầu đỏ, 8 bit dữ liệu mầu xanh là cây và 8 bit dữ liệu mầu xanh nước biển.
Chuyển đổi ảnh mầu RGB sang ảnh đa mức xám (Grayscale)
Không có phương thức chuyển đổi chính xác từ ảnh RGB sang ảnh đa mức xám do việc này phụ thuộc rất nhiều vào cảm quang của con người. Một công thức được sử dụng phổ biến trong những hệ thống truyền hình và TV màu chuẩn như PAL, NTSC hay mô hình mầu Lab là:
4.1.2 Không gian mầu HSL
Không gian mầu HSL, còn gọi là không gian mầu HLS, viết tắt của 3 yếu tố Hue tức mầu sắc, Saturation tức mức độ bão hòa, và Lightness (còn dùng Luminance hay Luminosity) tức cường độ sáng. Không gian mầu HSL có thể được biểu diễn theo hình nón kép hoặc hình cầu, là những biến dạng khác nhau của khối mầu RGB. Hai đỉnh của hình nón kép tương ứng với hai màu đen và trắng. Tham số góc tương ứng với mầu sắc , khoảng cách tới trục tương ứng với mức độ bão hòa, và khoảng cách theo trục đen -trắng tương ứng với cường độ sáng.
Không gian mầu HSL không định nghĩa chính xác các mầu, vì cũng như không gian mầu RGB, HSL không phải là một không gian mầu tuyệt đối. Và nếu nói chính xác, HSL không phải là một không gian mầu mà là một mô hình mầu.
Chuyển đổi từ không gian mầu RGB sang không gian mầu HSL
Xét mầu (R, G, B) là một mầu trong không gian mầu RGB Các giá trị (R, G, B) được biểu diễn trong khoảng [0, 1]
MAX là giá trị lớn nhất trong các giá trị R, G, B MIN là giá trị bé nhất trong các giá trị R, G, B
Mầu (H, S, L) trong không gian mầu HSL tương ứng xác định như sau:
H thường được chuẩn hóa để có giá trị trong khoảng từ 0 đến 360o.
Khi , H thường được dùng với giá trị 0 thay cho giá trị không xác định. Hệ mầu HSV có chung định nghĩa giá trị tham số mầu sắc (H), những tham số còn lại được xác định như sau:
Chuyển đổi từ không gian mầu HSL sang không gian mầu RGB
Xét một màu (H, S, L) trong không gian mầu HSL với H nằm trong khoảng [0.0, 360.0) và S, L trong đoạn [0.0, 1.0]. Mầu (R, G, B) tương ứng trong không gian mầu RGB xác định theo như sau:
Nếu , mầu (R, G, B) tương ứng là không mầu hoặc mầu xám. Trong trường hợp này, R, G, B lấy giá trị L.
Nếu S khác 0:
nếu với mỗi
nếu với mỗi
với mỗi màu
4.1.3 Không gian mầu YCbCr
YCbCr là một họ các không gian mầu sử dụng trong những hệ thống truyền hình.
Y là thành phần luma – độ sáng của điểm ảnh.
Cb vả Cr là các thành phần xanh biển và đỏ.
Chuyển đổi từ không gian mầu RGB sang không gian mầu YCbCr
4.1.4 Ứng dụng các không gian mầu trong việc lọc mầu da (Skin color filtering) color filtering)
Mầu da của con người có sự phân bố mầu sắc riêng và thường khác so với hầu hết những đối tượng không-phải-là-mặt. Yếu tố này có thể được sử dụng để lọc ảnh đầu vào nhằm thu được những vùng có khả năng chứa khuôn mặt. Phương pháp này cũng có thể được sử dụng để xây dựng một bộ phát hiện khuôn mặc dựa trên mầu sắc da mặt trong những môi trường đặc biệt.
Một thuật toán phát hiện khuôn mặt dựa trên mầu sắc da mặt đơn giản thường gồm hai bước:
(1) phân vùng những khu vực có khả năng chứa khuôn mặt (2) kết hợp các vùng
Nhiều không gian mầu khác nhau được sử dụng trong việc phát hiện khuôn mặt, bao gồm HSL, RGB, YCrCb,… trong đó không gian mầu HSL được cho là có hiệu quả nhất trong việc phát hiện da người.
Để xác định vùng mầu da người trong không gian mầu HSL có thể thực hiện phương pháp thống kê dựa vào một tập hợp các ảnh mẫu. Các ảnh này được tập hợp ngẫu nhiên từ nhiều nguồn (ảnh chụp, từ internet,…) và được tách riêng bằng tay phần da thịt. Các ảnh này sẽ được sử dụng để tạo ra biểu đồ mức biểu diễn sự phân bố của các thành phần H và S của mầu da.
Hình 10 – Phân bố của các thành phần H và S của mầu da người trong không gian mầu HLS
Mặc dù những hệ thống phát hiện dựa trên mấu sắc da người có hiệu năng tính toán cao, nhưng nếu chỉ dựa vào mầu sắc thì sẽ không thể đạt được độ chính xác mong muốn do những ảnh hưởng về ánh sáng, bóng, hay chủng tộc.
Ngoài ra, vùng phát hiện sẽ bao gồm cả những bộ phận khác của cơ thể (thường là chân, tay, cổ,…) và những đối tượng có mầu gần với mầu da người. Những kỹ thuật xử lý khác cần được áp dụng tiếp để loại bỏ những vùng này.
4.2 Kỹ thuật Trừ ảnh [8]
Trừ ảnh được dùng để tách nhiễu khỏi nền. Ta quan sát ảnh ở 2 thời điểm khác nhau, so sánh chúng để tìm ra sự khác biệt.
Việc trừ ảnh được thực hiện bằng cách dóng thẳng 2 ảnh rồi trừ đi để thu được ảnh mới. Ảnh thu được chính là sự khác nhau giữa hai ảnh.
4.3 Kỹ thuật cắt theo mức [8]
Kỹ thuật cắt theo mức dùng 2 phép ánh xạ khác nhau cho trường hợp có nền và không nền Có nền: … Không nền: 4.4 Phép co (Erosion) [8] Phép co là một trong những phép toán xử lý hình thể.
Phép lọc này cho phép loại bỏ hiệu quả những điểm ảnh nhiễu.
4.5 Kết hợp các bộ lọc để xây dựng một bộ phát hiện chuyển động động
Có nhiều cách khác nhau để phát hiện chuyển động. Cách phổ biến nhất là so sánh khung hình hiện tại với khung hình trước đó.
Giả sử khung hình hiện tại là một ảnh 24bit RGB (image), một bản sao đa mức xám (currentFrame) của ảnh đó và bản sao đa mức xám của khung hình trước đó (backgroundFrame).
Đầu tiên ta xác định những vùng mà hai ảnh có sự khác nhau bằng cách sử dụng các bộ lọc chênh lệch và bộ lọc ngưỡng.
// tính giá trị chênh lệch ở từng điểm ảnh sử dụng bộ lọc difference
Difference differenceFilter = new Difference( );
IFilter thresholdFilter = new Threshold(15); differenceFilter.OverlayImage = backgroundFrame;
Bitmap tmp1 = differenceFilter.Apply(currentFrame);
// lấy ngưỡng để bỏ qua những điểm ảnh thay đổi không đáng kể
Bitmap tmp2 = thresholdFilter.Apply(tmp1);
B
Sau bước nay, ta sẽ thu được một ảnh với những điểm ảnh trắng thể hiện những vùng mà khung hình hiện tại khác với khung hình trước đó với một giá trị ngưỡng xác định. Ta có thể đếm số lượng những điểm ảnh trắng này và đánh giá mức độ khác biệt của hai khung hình.
Tuy nhiên, nguồn ảnh thu nhận từ các thiết bị camera đều thường kèm theo nhiễu. Để loại bỏ những điểm ảnh nhiễu, ta sử dụng bộ lọc ăn mòn.
IFilter erosionFilter = new Erosion();
Bitmap tmp3 = erosionFilter.Apply(tmp2);
Việc đếm số lượng những điểm ảnh trắng bây giờ sẽ thu được kết quả chính xác hơn rất nhiều.
Chương 5
Phát hiện khuôn mặt trên ảnh tĩnh
Bài toán 5.1 Bộ phát hiện khuôn mặt 5.2 Cấu trúc dữ liệu lưu trữ kết quả huấn luyện 5.3 Biểu diễn ảnh bằng kỹ thuật ảnh tích phân 5.4
5.1 Bài toán
Đầu vào của bài toán là một hình ảnh tĩnh
Bài toán đặt ra là phải xác định được tất cả (hoặc càng nhiều càng tốt) những khuôn mặt hiện diện trong ảnh đầu vào.
5.1.1 Khó khăn của bài toán
Có rất nhiều khó khăn phải khắc phục khi giải quyết bài toán phát hiện khuôn mặt:
• Đối tượng khuôn mặt có thể hiện rất đa dạng trên ảnh, dễ thay đổi
• Điều kiện ánh sáng và môi trường
• Nền ảnh phức tạp
5.1.2 Giới hạn phạm vi bài toán
Việc giải quyết bài toán tổng quát còn là một vấn đề bỏ ngỏ. Mỗi phương pháp đã được đề xuất và phát triển đều chỉ tiếp cận bài toán trong một phạm vi nhất định. Trong đồ án này, đối tượng khuôn mặt có khả năng phát hiện phải thỏa mãn một số những điều kiện sau:
• Phải là hoặc gần với khuôn mặt trực diện
Góc xoay quanh trục thẳng đứng của khuôn mặt phải nhỏ hơn 20o về mỗi bên, còn góc xoay quanh trục nằm ngang thường không quá 10o.
Một điểm quan trọng là khuôn mặt phải có chiều thẳng đứng (không bị xoay ngược). Việc phát hiện những khuôn mặt này vẫn có thể được thực hiện bằng cách quét kết hợp với xoay ảnh ban đầu ở những góc khác nhau, nhưng thao tác xoay ảnh đòi hỏi nhiều xử lý phức tạp và làm giảm chất lượng của phương pháp.
• Phải có kích thước không quá nhỏ
Kích thước khuôn mặt phải có chiều dài từ trên xuống ít nhất là 60 điểm ảnh. Với những khuôn mặt nhỏ hơn đòi hỏi phải thực hiện thao tác phóng ánh, đây cũng là một phép xử lý tốn nhiều thời gian.
• Không bị ảnh hưởng quá nhiều bởi điều kiện ánh sáng
Sự phân bố cường độ sáng trên khuôn mặt đòi hỏi phải khá đồng đều, không có những vùng quá sáng hoặc quá tối so với tổng thể chung.
• Không bị che khuất bởi nhưng chi tiết phụ
Những chi tiết không thuộc khuôn mặt như kính mắt, lọn tóc, khăn buộc đầu, mũ,… đều có ảnh hưởng tới khả năng phát hiện ra khuôn mặt. Những vùng quan trọng của khuôn mặt bao gồm vùng trán tới mãi tóc, đôi mắt không được phép bị che khuất một phần hay toàn bộ.
• Kích thước ảnh đầu vào không nên quá lớn
Kích thước của ảnh không ảnh hưởng tới khả năng phát hiện ra khuôn mặt, nhưng một cách tự nhiên, ảnh càng lớn thì số lần quét ảnh càng nhiều và do đó ảnh hưởng trực tiếp tới tốc độ phát hiện.
Với những điều kiện trên, phương pháp cho phép đạt được tỷ lệ phát hiện tốt.
5.2 Bộ phát hiện khuôn mặt
Bộ phát hiện khuôn mặt sử dụng dữ liệu lưu trữ trong tệp tin XML để thực hiện việc phát hiện khuôn mặt.
Phương thức quan trọng nhất là:
public List<FoundFace> DetectFaces(Bitmap srcImg)
Đầu vào là ảnh cần phát hiện
Đầu ra là danh sách những khuôn mặt phát hiện được trong ảnh đầu vào.
Phương thức này sử dung hai phương thức phụ là RunHaarClassifierCascade
và SetImagesForHaarClassifierCascade
Phương thức SetImagesForHaarClassifierCascade có nhiệm vụ điều chỉnh các trọng số chứa trong đối tượng classifierCascade cho phù hợp với ảnh đầu vào mới.
Phương thức RunHaarClassifierCascade thực hiện các tính toán dựa trên dữ liệu trong đối tượng classifierCascade để xác định xem vùng ảnh trong một cửa sổ quét có phải là khuôn mặt hay không.
5.3 Cấu trúc dữ liệu lưu trữ kết quả huấn luyện5.3.1 Cấu trúc tệp tin XML 5.3.1 Cấu trúc tệp tin XML
Bộ phân lớp xếp tầng sử dụng để phát hiện khuôn mặt được lưu trữ dưới dạng một file XML có cấu trúc như sau:
<?xml version="1.0"?> <opencv_storage> <haarcascade_frontalface_alt type_id="opencv-haar-classifier"> <size>20 20</size> <stages> <_> <!-- stage 0 --> <trees> <_> <!-- tree 0 --> <_> <!-- root node --> <feature> <rects> <_>3 7 14 4 -1.</_> <_>3 9 14 2 2.</_></rects> <tilted>0</tilted></feature> <threshold>4.0141958743333817e-003</threshold> <left_val>0.0337941907346249</left_val> <right_val>0.8378106951713562</right_val> </_> .
. những tree tiếp theo
. </_> </_>
</_> .
. những stage tiếp theo
. <_> <!—stage n --> . . . </_>
</stages>
</haarcascade_frontalface_alt> </opencv_storage>
5.3.2 Thiết kế những lớp dữ liệu tương ứng
Dữ liệu được tổ chức theo mô hình cây với nút gốc chứa toàn bộ thông tin của bộ phân lớp xếp tầng. Gốc này rẽ nhánh thành các stage, mỗi stage có nhiều tree, mỗi tree có nhiều node, mỗi node có nhiều feature và mỗi feature có từ 2 đến 3 rectangle. Để đọc dữ liệu trong tệp tin XML này, ta xây dựng những lớp tương ứng:
• HaarClassifierCascade: chứa toàn bộ thông tin lưu giữ trong tệp, ứng với nút gốc.
• HaarStageClassifier: chứa thông tin về từng tầng được sử dụng trong bộ phân lớp ứng với từng nút con <_> trong nút <stages> (những nút có tên stage n).
• HaarClassifier: chứa thông tin của một bộ phân lớp riêng biệt ứng với những nút có tên tree n.
• HaarNode: chứa thông tin của từng nút trong cây, ứng với những nút có tên root node.
• HaarFeature: chứa thông tin về một chi tiết Haar được sử dụng, ứng với những nút có tên <feature>.
• HaarRectangle: chứa thông tin về vị trí và hình dạng của từng chi tiết Haar.
Chi tiết các lớp:
5.3.3 Đọc dữ liệu từ tên tin XML
Việc đọc dữ liệu được thực hiện bằng cách khởi tạo một đối tượng
HaarClassifierCascade và truyền vào tham số là nút gốc của tệp XML. Hàm khởi tạo này duyệt danh sách các nút con của nút gốc truyền vào, và tùy theo tên của nút để đọc dữ liệu tương ứng vào các trường. Trong trường hợp nút ứng với một stage, hàm này sẽ khởi tạo đối tượng HaarStageClassifier với tham số là nút ứng với stage đó.
Đến lượt mình, hàm khởi tạo của lớp HaarStageClassifier cũng thực hiện công việc tương tự: duyệt lần lượt các nút và đọc dữ liệu tương ứng vào các trường, nếu là nút ứng với các tree thì khởi tạo đối tượng HaarClassifier với tham số là nút đó.
Quá trình này sẽ được tiếp tục cho đến những nút trong cùng.
Kết quả cuối cùng ta thu được một đối tượng thuộc lớp
5.4 Biểu diễn ảnh bằng kỹ thuật ảnh tích phân
Chương trình sử dụng hai loại ảnh tích phân:
• Ảnh tích phân thường (NormalIntegralImage) được xây dựng sử dụng những công thức đã giới thiệu trong chương 3.
• Ảnh tích phân bình phương (SquareIntegralImage), cũng giống như ảnh tích phân thường nhưng giá trị của từng vị trí điểm ảnh trong ảnh ban đầu được lấy bình phương.
Hai phương thức HaarValue và AverageHaaarValue cho phép tính tổng giá trị các điểm ảnh và giá trị trung bình của tổng các điểm ảnh trong một vùng chữ nhật của ảnh ban đầu.
Chương 6
Phát hiện khuôn mặt trên hình ảnh động
Bài toán 6.1 Thu nhận hình ảnh 6.2 Những kỹ thuật tăng tốc độ phát hiện 6.3
6.1 Bài toán phát hiện khuôn mặt trên hình ảnh động
Đầu vào của bài toán là chuỗi hình ảnh động liên tục được thu nhận trực tiếp từ các thiết bị camera hoặc đọc từ tệp tin video.
Bài toán đặt ra là phải phát hiện được những khuôn mặt có trong hình. Việc phát hiện khuôn mặt được thực hiện tương tự như trong bài toán phát hiện khuôn mặt trên hình ảnh tĩnh. Tốc độ phát hiện mới là vấn đề chính cần quan tâm giải quyết của bài toán.
Những khó khăn của bài toán
• Tốc độ phát hiện
Hình ảnh được thu nhận liên tục với tốc độ từ 10 hình/giây (với những thiết bị camera đơn gian) cho đến 24 hình/giây hoặc cao hơn (tệp tin video hay những thiết bị camera cao cấp). Tốc độ phát hiện khuôn mặt cần phải đủ nhanh để đảm bảo được tính liên tục của hình ảnh.
• Sự đa dạng về thể hiện của khuôn mặt
Đối tượng thường chuyển động không ngừng trước camera nên các khuôn mặt thường được thu nhận ở nhiều tư thế và góc đa dạng.
• Chất lượng hình ảnh
Chất lượng hình ảnh phụ thuộc nhiều vào chất lượng của camera và điều kiện ánh sáng khi thu nhận, đặc biệt trong những ứng dụng ngoài trời.
Mô hình bài toán
Hình 11 – Mô hình bài toán phát hiện khuôn mặt trực tiếp từ Camera.
6.2 Thu nhận hình ảnh
6.2.1 Thu nhận hình ảnh từ thiết bị camera
Hình ảnh từ camera sẽ được thu nhận thông qua việc sử dụng thu viện
VideoCabLib. Đây là một thư viện mạnh và dễ sử dụng.
Tuy nhiên, thư viện không cung cấp sự kiện thông báo khi có hình ảnh mới thu nhận được. Do đó, ta phải sử dụng một đối tượng timer để định kỳ thu nhận hình