5.30. So khớp mẫu¶
Các bộ phát hiện được đề cập cho đến nay trả lời các câu hỏi về nội dung của một khung hình đơn lẻ: các vùng màu (blob) ở đâu, các đường thẳng đi theo hướng nào, mã in có nội dung gì. Một lớp câu hỏi khác so sánh một ảnh với ảnh khác. Vùng này trong khung hình chụp có trông giống với mảnh tham chiếu mà tôi đã lưu lúc hiệu chỉnh không? Các phương thức so khớp trả lời câu hỏi đó.
Phân tích âm điệu và thống kê đã giới thiệu get_similarity() cho câu hỏi liên quan -- hai ảnh cùng kích thước này giống nhau đến mức nào nói chung? -- với SSIM là chỉ số nền tảng. Câu hỏi so khớp còn lại là câu hỏi về định vị: không phải "hai ảnh này giống nhau đến mức nào" mà là "mảnh nhỏ đó xuất hiện ở đâu bên trong ảnh lớn hơn này?" Công cụ phù hợp cho câu hỏi định vị là so khớp mẫu.
5.30.1. Lời gọi cơ bản¶
find_template() tìm kiếm vị trí đầu tiên mà một ảnh mẫu nhỏ xuất hiện bên trong khung hình đã chụp. Cài đặt sử dụng tương quan chéo chuẩn hóa (NCC): mẫu trượt qua khung hình, điểm số khớp tại mỗi vị trí được tính từ tương quan giữa các điểm ảnh của mẫu và các điểm ảnh khung hình bên dưới (chuẩn hóa theo giá trị trung bình và phương sai cục bộ để các thay đổi về độ khuếch đại không gây nhầm lẫn cho kết quả khớp), và vị trí đầu tiên có điểm số vượt threshold sẽ được trả về dưới dạng hộp giới hạn:
template = image.Image("/sdcard/template.bmp", copy_to_fb=False)
template.to_grayscale()
match = img.find_template(template, threshold=0.7,
search=image.SEARCH_DS)
if match is not None:
img.draw_rectangle(match, color=(255, 0, 0))
Phương thức chỉ hoạt động trên ảnh thang xám. Chụp ở chế độ thang xám (lựa chọn tự nhiên cho bất kỳ camera nào không có cảm biến màu sắc), hoặc chuyển đổi tại chỗ bằng to_grayscale() trước khi gọi. Điều tương tự áp dụng cho mẫu được tải từ đĩa: một mẫu màu sắc được chuyển đổi bằng cùng phương thức đó, kết quả là những gì bộ so khớp mong đợi.
threshold là một số thực từ 0.0 đến 1.0. Giá trị 1.0 yêu cầu khớp hoàn hảo từng điểm ảnh (điều này không bao giờ xảy ra với ảnh chụp thực tế), 0.0 chấp nhận bất kỳ kết quả nào, và các giá trị từ 0.6 đến 0.8 bao gồm trường hợp thông thường khi mẫu được chụp trong điều kiện ánh sáng tương tự và cảnh vật không thay đổi đáng kể. Tăng ngưỡng để loại bỏ kết quả dương tính giả; giảm ngưỡng để chấp nhận các kết quả khớp nhiễu hơn với chi phí là nhiều kết quả giả mạo hơn.
5.30.2. Chiến lược tìm kiếm¶
search chọn giữa hai chiến lược. image.SEARCH_EX là tìm kiếm toàn diện: mẫu trượt qua mọi vị trí step điểm ảnh trong khung hình và trả về kết quả khớp đầu tiên vượt ngưỡng. image.SEARCH_DS là tìm kiếm hình thoi: bộ so khớp lấy mẫu thô trước, sau đó tinh chỉnh xung quanh điểm số tốt nhất, điều này nhanh hơn đáng kể nhưng có thể bỏ lỡ kết quả khớp thực sự nếu bước đầu thô tình cờ đáp xuống gần cực đại cục bộ cao hơn cực đại toàn cục. Đối với đường xử lý thời gian thực nơi mẫu được xác định rõ và khó bị nhầm lẫn, SEARCH_DS là mặc định phù hợp; đối với hiệu chỉnh một lần nơi chi phí bỏ lỡ cao hơn chi phí quét chậm hơn, SEARCH_EX an toàn hơn.
step kiểm soát bước nhảy điểm ảnh trong quá trình quét toàn diện (tìm kiếm hình thoi tự quản lý bước của nó). Giá trị step lớn hơn tăng tốc quét nhưng giảm độ chính xác dưới mức điểm ảnh. roi giới hạn tìm kiếm trong một vùng của khung hình, vừa thu hẹp phạm vi bộ so khớp xem xét vừa giảm khối lượng công việc.
Giá trị trả về là một bộ giá trị (x, y, w, h) xác định kết quả khớp tốt nhất dưới dạng hộp giới hạn, hoặc None nếu không có vị trí nào vượt ngưỡng. Hộp giới hạn có thể truyền trực tiếp vào draw_rectangle() hoặc crop() cho giai đoạn xử lý tiếp theo.
5.30.3. Bẫy tỷ lệ và xoay¶
Cạm bẫy cổ điển với so khớp mẫu là độ nhạy với tỷ lệ và góc xoay. Bộ so khớp so sánh mẫu với khung hình từng điểm ảnh; một mẫu chụp ở một khoảng cách không khớp với cùng đối tượng đó khi chụp ở khoảng cách khác, và một mẫu chụp thẳng không khớp với cùng đối tượng đó khi nhìn từ góc lệch. Ngưỡng âm thầm giảm xuống dưới mức khớp ngay cả khi đối tượng rõ ràng hiển thị với mắt người, và phương thức trả về None.
Có một vài cách khắc phục cho các trường hợp đơn giản. Ứng dụng có thể chụp nhiều mẫu ở các tỷ lệ khác nhau và chạy find_template() cho từng mẫu theo thứ tự, chấp nhận cái đầu tiên vượt ngưỡng; chi phí tăng theo số lượng mẫu. Ứng dụng có thể tiền xử lý khung hình bằng rotation_corr() hoặc biến đổi cực (Biến đổi hình học) để loại bỏ góc xoay gây rắc rối trước khi so khớp chạy; mẫu đã khớp vẫn phải khớp với hình học đã được hiệu chỉnh.
Một thành ngữ hữu ích cho các đường xử lý kiểm tra QA ghép bộ so khớp mẫu với bộ tính điểm tương đồng mà phân tích âm điệu và thống kê đã giới thiệu: find_template() xác định vị trí bộ phận trong khung hình đã chụp và hộp giới hạn được trả về được cắt xén và truyền cho get_similarity() so sánh với mảnh tham chiếu. Bước so khớp mẫu quyết định bộ phận ở đâu; bước tính điểm tương đồng quyết định bộ phận có chấp nhận được không. Hai bước chạy mỗi khung hình, ngưỡng trên mean là tiêu chí đạt/trượt, và hộp giới hạn đã khớp được vẽ lại vào khung hình là bản xem trước trong IDE mà người vận hành theo dõi.