Mẫu phù hợp với opencv c ++

Có thể thấy, khi vật thể lớn hơn hoặc nhỏ hơn so với mẫu thì thuật toán không phát hiện được. Ta có thể áp dụng mẹo sau để phát hiện vật thể lớn hơn (hoặc làm ngược lại vật thể có thể thu nhỏ)

  • Downscale ảnh đầu vào để giảm nhiều kích thước khác nhau (or upscale up)
  • Áp dụng thuật toán lên ảnh ở nhiều kích thước khác nhau
  • Lấy ngưỡng và thu nhỏ lại cấp độ được tìm thấy
Mã số

Đầu tiên vẫn là chi tiết mục ảnh quen thuộc

THRESHOLD = 0.9
img = cv2.imread('sun_work/ace.png')
#Convert to grayscale
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template = cv2.imread('template.png', 0)
template_width, template_height = template.shape[1], template.shape[0]
imshow(img)

Định nghĩa các thang đo ảnh khác nhau bằng hàm np.linspace

for scale in np.linspace(0.1,1.0,20)[::-1]:
     resized = imutils.resize(img_gray, width=int(img_gray.shape[1]* scale))
     ratio = img_gray.shape[1]/float(resized.shape[1])#Bé hơn template thì dừngif resized.shape[0]< template_height or resized.shape[1]< template_width:break

Áp dụng đối sánh mẫu

res = cv2.matchTemplate(resized, template, cv2.TM_CCOEFF_NORMED)
loc = np.where(res >= THRESHOLD)#Draw boudning boxfor y, x inzip(loc[0], loc[1]):
    cv2.rectangle(img,(x, y),(x + w, y + h),(255,0,0),1)

Kết quả

Mẫu phù hợp với opencv c ++

Kết luận

Có thể thấy thuật toán chỉ phát hiện được một phần của vật thể. Tuy đã giải quyết được một phần vấn đề với các vật thể có nhiều kích thích khác nhau, nhưng cách cải tiến đơn giản này vẫn hoạt động không tốt trong các điều kiện khác như ảnh nghiêng. Một số cách tiếp cận khác để xử lý vẫn đề này có thể được kể đến như đối sánh điểm chính bằng cách sử dụng SIFT hoặc SURF

So khớp mẫu là phương pháp tìm kiếm và tìm vị trí của hình ảnh mẫu trong hình ảnh lớn hơn. OpenCV đi kèm với chức năng cv. matchTemplate() cho mục đích này. Nó chỉ đơn giản là trượt hình ảnh mẫu qua hình ảnh đầu vào (như trong tích chập 2D) và so sánh mẫu và bản vá của hình ảnh đầu vào bên dưới hình ảnh mẫu. Một số phương pháp so sánh được triển khai trong OpenCV. (Bạn có thể kiểm tra tài liệu để biết thêm chi tiết). Nó trả về một hình ảnh thang độ xám, trong đó mỗi pixel biểu thị mức độ lân cận của pixel đó khớp với mẫu

Nếu hình ảnh đầu vào có kích thước (WxH) và hình ảnh mẫu có kích thước (wxh), hình ảnh đầu ra sẽ có kích thước là (W-w+1, H-h+1). Khi bạn nhận được kết quả, bạn có thể sử dụng cv. hàm minMaxLoc() để tìm giá trị lớn nhất/nhỏ nhất ở đâu. Lấy nó làm góc trên cùng bên trái của hình chữ nhật và lấy (w,h) làm chiều rộng và chiều cao của hình chữ nhật. Hình chữ nhật đó là vùng mẫu của bạn

Lưu ý Nếu bạn đang sử dụng cv. TM_SQDIFF làm phương pháp so sánh, giá trị tối thiểu cho kết quả phù hợp nhất

Khớp mẫu trong OpenCV

Ở đây, ví dụ, chúng tôi sẽ tìm kiếm khuôn mặt của Messi trong bức ảnh của anh ấy. Vì vậy, tôi đã tạo một mẫu như dưới đây

Mẫu phù hợp với opencv c ++

Chúng tôi sẽ thử tất cả các phương pháp so sánh để có thể xem kết quả của chúng như thế nào

từ matplotlib nhập pyplot dưới dạng plt

w, h = mẫu. hình dạng[. -1]

phương pháp = ['cv. TM_CCOEFF', 'cv. TM_CCOEFF_NORMED', 'cv. TM_CCORR',

'cv. TM_CCORR_NORMED', 'cv. TM_SQDIFF', 'cv. TM_SQDIFF_NORMED']

phương thức if trong [cv. TM_SQDIFF, cv. TM_SQDIFF_NORMED]

bottom_right = (top_left[0] + w, top_left[1] + h)

plt. ô con(121),plt. imshow(res,cmap = 'xám')

plt. title('Kết quả phù hợp'), plt. xticks([]), plt. yticks([])

plt. ô con(122),plt. imshow(img,cmap = 'xám')

plt. title('Điểm đã phát hiện'), plt. xticks([]), plt. yticks([])

Xem kết quả bên dưới

Mẫu phù hợp với opencv c ++

Mẫu phù hợp với opencv c ++

Mẫu phù hợp với opencv c ++

Mẫu phù hợp với opencv c ++

Mẫu phù hợp với opencv c ++

Mẫu phù hợp với opencv c ++

Bạn có thể thấy rằng kết quả sử dụng cv. TM_CCORR không tốt như chúng tôi mong đợi

Khớp mẫu với nhiều đối tượng

Trong phần trước, chúng tôi đã tìm kiếm hình ảnh khuôn mặt của Messi, khuôn mặt này chỉ xuất hiện một lần trong hình ảnh. Giả sử bạn đang tìm kiếm một đối tượng có nhiều lần xuất hiện, cv. minMaxLoc() sẽ không cung cấp cho bạn tất cả các vị trí. Trong trường hợp đó, chúng tôi sẽ sử dụng ngưỡng. Vì vậy, trong ví dụ này, chúng tôi sẽ sử dụng ảnh chụp màn hình của trò chơi nổi tiếng Mario và chúng tôi sẽ tìm thấy những đồng xu trong đó