Computer >> Máy Tính >  >> Lập trình >> Python

Đối sánh mẫu bằng OpenCV trong Python

Đối sánh mẫu là một kỹ thuật, nhờ đó một bản vá hoặc mẫu có thể được đối sánh từ một hình ảnh thực tế. Về cơ bản đây là một cơ chế đối sánh mẫu.

Trong Python có mô-đun OpenCV. Sử dụng openCV, chúng tôi có thể dễ dàng tìm thấy kết quả phù hợp. Vì vậy, trong vấn đề này, các kỹ thuật đối sánh mẫu OpenVC được sử dụng.

Để sử dụng chức năng OpenCV, chúng tôi cần tải chúng xuống bằng cách sử dụng pip .

sudo pip3 install opencv-python

Đối với nhiệm vụ đối sánh mẫu, có một yếu tố chính xác, yếu tố này được gọi là ngưỡng. Ví dụ, chúng ta có thể nói rằng chúng ta có thể dễ dàng tạo lược đồ nhận dạng khuôn mặt bằng cách sử dụng giải pháp đối sánh mẫu này. Chúng tôi có thể cung cấp một số hình ảnh về mắt hoặc bất kỳ bộ phận nào khác của khuôn mặt, sau đó sử dụng những hình ảnh đó làm mẫu, nó có thể dễ dàng tìm thấy sự phù hợp, nhưng có những biến thể khác nhau về mắt. Vì vậy, nếu chúng tôi đặt mức độ chính xác là 50%, nó sẽ phát hiện tốt hơn mức độ chính xác 100%. Nói chung, mức độ chính xác là 80% trong các trường hợp khác nhau.

Các bước để đối sánh Mẫu

  • Chụp hình ảnh thực tế và chuyển đổi nó thành hình ảnh tỷ lệ xám.

  • Lấy mẫu làm hình ảnh tỷ lệ xám

  • Mẫu trượt qua hình ảnh thực tế và tìm vị trí phù hợp với mức độ chính xác.

  • Khi kết quả lớn hơn mức chính xác, hãy đánh dấu vị trí đó là được phát hiện.

Đối với trường hợp đầu tiên, Hình ảnh đầu vào và mẫu là -

Hình ảnh chính

Đối sánh mẫu bằng OpenCV trong Python

Mẫu

Đối sánh mẫu bằng OpenCV trong Python

Mã mẫu

import cv2
import numpy as np
#open the main image and convert it to gray scale image
main_image = cv2.imread('main_image.png')
gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY)
#open the template as gray scale image
template = cv2.imread('template1.png', 0)
width, height = template.shape[::-1] #get the width and height
#match the template using cv2.matchTemplate
match = cv2.matchTemplate(gray_image, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
position = np.where(match >= threshold) #get the location of template in the image
for point in zip(*position[::-1]): #draw the rectangle around the matched template
   cv2.rectangle(main_image, point, (point[0] + width, point[1] + height), (0, 204, 153), 0)
cv2.imshow('Template Found', main_image)
cv2.waitKey(0)

Đầu ra

Đối sánh mẫu bằng OpenCV trong Python

Đoạn mã trên không hỗ trợ đa tỷ lệ. Vì vậy, nếu kích thước của mẫu không giống nhau, nó sẽ không phát hiện. Vì vậy, trong phần tiếp theo, chúng ta sẽ xem cách chúng ta có thể sử dụng tính năng đa tỷ lệ để phát hiện các mẫu.

Theo cách tiếp cận này, hình ảnh thực tế được chuyển đổi thành các kích thước khác nhau, mỗi khi nó khớp với mẫu và tìm hệ số tương quan lớn nhất để xác định vị trí phù hợp.

Đây hình ảnh thực tế giống nhau, bản mẫu ở đây -

Đối sánh mẫu bằng OpenCV trong Python

Mã mẫu

import imutils
import cv2
import numpy as np
#Open template and get canny
template = cv2.imread('template3.jpg')
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
template = cv2.Canny(template, 10, 25)
(height, width) = template.shape[:2]
#open the main image and convert it to gray scale image
main_image = cv2.imread('main_image.png')
gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY)
temp_found = None
for scale in np.linspace(0.2, 1.0, 20)[::-1]:
   #resize the image and store the ratio
   resized_img = imutils.resize(gray_image, width = int(gray_image.shape[1] * scale))
   ratio = gray_image.shape[1] / float(resized_img.shape[1])
   if resized_img.shape[0] < height or resized_img.shape[1] < width:
      break
   #Convert to edged image for checking
   e = cv2.Canny(resized_img, 10, 25)
   match = cv2.matchTemplate(e, template, cv2.TM_CCOEFF)
   (_, val_max, _, loc_max) = cv2.minMaxLoc(match)
   if temp_found is None or val_max>temp_found[0]:
      temp_found = (val_max, loc_max, ratio)
#Get information from temp_found to compute x,y coordinate
(_, loc_max, r) = temp_found
(x_start, y_start) = (int(loc_max[0]), int(loc_max[1]))
(x_end, y_end) = (int((loc_max[0] + width)), int((loc_max[1] + height)))
#Draw rectangle around the template
cv2.rectangle(main_image, (x_start, y_start), (x_end, y_end), (153, 22, 0), 5)
cv2.imshow('Template Found', main_image)
cv2.waitKey(0)

Đầu ra

Đối sánh mẫu bằng OpenCV trong Python