7

大きな画像の中から小さな画像を見つけようとしていて、MatchTemplate() を使用しました

img = cv2.imread("c:\picture.jpg")
template = cv2.imread("c:\template.jpg")

result = cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
y,x = np.unravel_index(result.argmax(), result.shape)

私は常に左上隅の座標を取得しますが、それは 1 つのポイントだけです。全体像に複数の一致がある場合、それらすべてを取得するにはどうすればよいですか?

4

2 に答える 2

8

方法は次のとおりです。

result = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)

#the get the best match fast use this:
(min_x, max_y, minloc, maxloc) = cv2.minMaxLoc(result)
(x,y) = minloc

#get all the matches:
result2 = np.reshape(result, result.shape[0]*result.shape[1])
sort = np.argsort(result2)
(y1, x1) = np.unravel_index(sort[0], result.shape) # best match
(y2, x2) = np.unravel_index(sort[1], result.shape) # second best match

上記は、完全に間違ったものであっても、すべての一致をソートするため、これが最速の方法であることに注意してください。パフォーマンスが重要な場合は、代わりにボトルネックのpartsort関数を使用できます。

于 2013-02-06T12:36:09.413 に答える