我无法在 opencv 中使用 matchtemplate

I can't get matchtemplate in opencv to work

我有这段代码:

import cv2 as cv
import numpy as np

haystack = cv.imread('cards4/deck 4.png', cv.IMREAD_REDUCED_COLOR_2)
grayhaystack = cv.cvtColor(haystack, cv.COLOR_BGR2GRAY)

needle = cv.imread('cards4/eightofspades.png', cv.IMREAD_REDUCED_COLOR_2)
grayneedle =cv.cvtColor(needle, cv.COLOR_BGR2GRAY)

cv.imshow('Needle', needle)
cv.imshow('Haystack', haystack)

#methods available :[cv.TM_CCOEFF, cv.TM_CCOEFF_NORMED, cv.TM_CCORR, cv.TMO_CCORR_NORMED, cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]
result = cv.matchTemplate(grayhaystack, grayneedle, cv.TM_SQDIFF_NORMED)


min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
needle_w = needle.shape[1]
needle_h = needle.shape[0]
top_left = max_loc
bottom_right = (top_left[0] + needle_w, top_left[1] + needle_h)
cv.rectangle(grayhaystack, top_left, bottom_right, (0, 255,0), 2, cv.LINE_4)

cv.imshow('Haystack', grayhaystack)
cv.imshow('Result', result)
cv.waitKey(0)

我直接在大海捞针图像上拍摄针图像,我尝试了所有可用的不同方法,但我总是得到不好的结果。

有什么方法可以使这个工作

correct size needle image

Haystack image

编辑:我固定了图像的大小,但它仍然没有给我一个好的结果

以下在 Python/OpenCV 对我有效。

我认为您的主要问题(固定模板大小后)是:1) 您不能在灰度图像上绘制颜色(不转换为 3 通道)和 2) 您没有保存绘制矩形的输出。

import cv2
import numpy as np

haystack = cv2.imread('haystack.png')
grayhaystack = cv2.cvtColor(haystack, cv2.COLOR_BGR2GRAY)

needle = cv2.imread('needle.png')
grayneedle =cv2.cvtColor(needle, cv2.COLOR_BGR2GRAY)

cv2.imshow('Needle', needle)
cv2.imshow('Haystack', haystack)

#methods available :[cv2.TM_CCOEFF, cv2.TM_CCOEFF_NORMED, cv2.TM_CCORR, cv2.TMO_CCORR_NORMED, cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]
result = cv2.matchTemplate(grayhaystack, grayneedle, cv2.TM_CCOEFF_NORMED)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
needle_w = needle.shape[1]
needle_h = needle.shape[0]
top_left = max_loc
bottom_right = (top_left[0] + needle_w, top_left[1] + needle_h)
output = cv2.rectangle(haystack, top_left, bottom_right, (0, 0, 255), 3)

cv2.imshow('Haystack', grayhaystack)
cv2.imshow('Result', result)
cv2.imshow('output', output)
cv2.waitKey(0)

cv2.imwrite('haystack_needle.png', output)

结果: