我想检测一个简单的2D棋盘上的所有棋子。问题是,我的代码只检测黑暗方块上的棋子。我需要检测所有白色的棋子。以下是我的设置:
代码:
import cv2
import numpy as np
import imutils
def main():
img = cv2.imread('full_board.png', 0)
# Piece templates:
img_rgb = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
pawn_white_template = cv2.imread('wp.png', 0)
cv2.imshow("Template", pawn_white_template)
cv2.waitKey(0)
w_pawn_white, h_pawn_white = pawn_white_template.shape[::-1]
res_pawn_white = cv2.matchTemplate(img_gray,pawn_white_template,cv2.TM_CCOEFF_NORMED)
threshhold = 0.6
loc = np.where(res_pawn_white >= threshhold)
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb,pt,(pt[0]+w_pawn_white, pt[1]+h_pawn_white),(0,255,255),1)
cv2.imshow('detected',img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
更改阈值对我没有帮助。我不知道为什么它只检测暗方棋子。 你知道如何检测所有的棋子吗
如果删除alpha通道,将看到模板的背景为深绿色。因此,它将只匹配暗背景方块。您正在使用alpha读取模板,但在模板匹配中不会使用alpha通道。您需要提取模板的alpha通道作为遮罩,并使用matchTemplate中的遮罩选项?这应该可以解决问题
您似乎还在将输入转换为灰度,但尝试与彩色模板匹配。请注意,您可以在彩色图像上进行模板匹配
以下是不带alpha的模板:
以下是模板中的alpha通道:
见https://docs.opencv.org/4.1.1/df/dfb/group__imgproc__object.html#ga586ebfb0a7fb604b35a23d85391329be
下面是Python/OpenCV中的示例,其中包含彩色图像和蒙版模板匹配
输入:
模板:
不带alpha通道的模板:
提取的alpha通道作为遮罩:
输入时产生的匹配位置:
但请注意,每个位置实际上都有几个邻近的匹配项。所以一个人实际上有太多的匹配项
处理多个匹配的正确方法是在循环中屏蔽相关图像中的每个匹配区域,从而避免附近高于阈值的非峰值匹配
这里有一种方法可以做到这一点
结果匹配:
以下是他们的实际比赛成绩:
具有圆形遮罩区域的相关图像:
相关问题 更多 >
编程相关推荐