Я пытаюсь определить положение части головоломки на изображении головоломки. У меня есть
- изображение части пазла (прозрачный png)
- изображение доски-головоломки с белым контуром вокруг правильного положения
Во-первых Я извлекаю контур на изображении 1. и использую его, чтобы нарисовать мой окончательный шаблон. Затем я сопоставляю окончательный шаблон с доской и сохраняю несколько изображений результатов.
Вот несколько примеров результатов, которые я получаю https://imgur.com/a/ZYyw7tU
На некоторых из изображений явно много несоответствий, и для некоторых изображений увеличение порога скроет правильное совпадение, и некоторые несоответствия останутся.
Любые советы или мысли по оптимизации были бы очень признательны!
Это мой полный код:
full_image = cv2.imread('puzzle_1.jpg')
piece = cv2.imread('piece_1.png', cv2.IMREAD_UNCHANGED)
partial_image = cv2.cvtColor(piece,cv2.COLOR_BGR2GRAY)
contours, hierarchy = cv2.findContours(partial_image.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
template = np.zeros((55, 55, 4), dtype=np.uint8)
cv2.drawContours(template, contours, -1, (255, 255, 255, 255),1)
hh, ww = template.shape[:2]
puzzleP = template[:,:,0:3]
alpha = template[:,:,3]
alpha = cv2.merge([alpha,alpha,alpha])
correlation = cv2.matchTemplate(full_image, puzzleP, cv2.TM_CCORR_NORMED, mask=alpha)
threshhold = 0.98
loc = np.where(correlation >= threshhold)
result = full_image.copy()
for pt in zip(*loc[::-1]):
cv2.rectangle(result, pt, (pt[0]+ww, pt[1]+hh), (0,0,255), 1)
print(pt)
cv2.imwrite('puzzle_piece.png', puzzleP)
cv2.imwrite('full_image_alpha.png', alpha)
cv2.imwrite('full_image_matches.jpg', result)
РЕДАКТИРОВАТЬ: Вот пример двух файлов (piece_1.png и puzzle_1.jpg) (в этом примере много несоответствий) https://imgur.com/a/nGSXcNg