Opencv matchTemplate 在地图中找不到灌木丛
Opencv matchTemplate couldn't find bush inside map
我想在二维地图中找到灌木丛的二维图像。根据他们的网站,我使用了这段代码
image = cv2.imread('images/Pallet_Town.png', cv2.IMREAD_UNCHANGED)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
template = cv2.imread('images/Bush (small).png', cv2.IMREAD_UNCHANGED)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2RGB)
print(image.shape)
w, h, _ = template.shape
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(result >= threshold)
print(*loc[::-1])
for pt in zip(*loc[::-1]):
cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.imwrite('images/result.png', image)
代码无效,无法找到任何灌木丛。结果图像没有矩形。我还应该使用什么函数来找到图像中的灌木丛(无论是 opencv 函数还是任何其他包)还是我的代码问题。
使用这些图像(布什在地图下方)
布什:
我实际上找到了答案,正如 fmw42 在评论中建议我制作灌木丛的面具并因此使用此代码我得到了答案。后来我也不得不将阈值提高到0.9。或者将阈值降低到 0.24 也有效,但对于不同的图像,它会有不同的阈值,这是我不想要的
image = cv2.imread('images/Pallet_Town.png', cv2.IMREAD_UNCHANGED)
template = cv2.imread('images/Bush (small).png', cv2.IMREAD_UNCHANGED)
bush = template[:, :, 0:3]
alpha = template[:, :, 3]
alpha = cv2.merge([alpha, alpha, alpha])
result = cv2.matchTemplate(image, bush, cv2.TM_CCORR_NORMED, mask=alpha)
w, h, _ = template.shape
threshold = 0.9
loc = np.where(result >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.imwrite('images/result.png', image)
您的模板具有透明背景。但是您的 matchTemplate 没有使用透明度 alpha 通道中的蒙版。因此,您正在与透明度下的任何背景进行匹配,这可能与灌木丛周围的区域不匹配。在你的模板中,背景是黑色的,你的灌木丛是白色的。因此,要么将模板背景更改为白色,要么在 matchTemplate() 中使用来自 alpha 通道的蒙版。请参阅 matchTemplate 文档以了解在 Python/OpenCV:
中使用掩码图像(以下最后一个参数)
result = cv.matchTemplate( image, templ, method[, result[, mask]] )
所以拿你的模板图片(灌木):
并提取 alpha 通道并仅保留图像的 BGR 通道:
mask = template[:,:,3]
template = template[:,:,0:3]
不转换为灰度。 matchTemplate 可以处理彩色图像。
我想在二维地图中找到灌木丛的二维图像。根据他们的网站,我使用了这段代码
image = cv2.imread('images/Pallet_Town.png', cv2.IMREAD_UNCHANGED)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
template = cv2.imread('images/Bush (small).png', cv2.IMREAD_UNCHANGED)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2RGB)
print(image.shape)
w, h, _ = template.shape
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(result >= threshold)
print(*loc[::-1])
for pt in zip(*loc[::-1]):
cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.imwrite('images/result.png', image)
代码无效,无法找到任何灌木丛。结果图像没有矩形。我还应该使用什么函数来找到图像中的灌木丛(无论是 opencv 函数还是任何其他包)还是我的代码问题。
使用这些图像(布什在地图下方)
布什:
我实际上找到了答案,正如 fmw42 在评论中建议我制作灌木丛的面具并因此使用此代码我得到了答案。后来我也不得不将阈值提高到0.9。或者将阈值降低到 0.24 也有效,但对于不同的图像,它会有不同的阈值,这是我不想要的
image = cv2.imread('images/Pallet_Town.png', cv2.IMREAD_UNCHANGED)
template = cv2.imread('images/Bush (small).png', cv2.IMREAD_UNCHANGED)
bush = template[:, :, 0:3]
alpha = template[:, :, 3]
alpha = cv2.merge([alpha, alpha, alpha])
result = cv2.matchTemplate(image, bush, cv2.TM_CCORR_NORMED, mask=alpha)
w, h, _ = template.shape
threshold = 0.9
loc = np.where(result >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.imwrite('images/result.png', image)
您的模板具有透明背景。但是您的 matchTemplate 没有使用透明度 alpha 通道中的蒙版。因此,您正在与透明度下的任何背景进行匹配,这可能与灌木丛周围的区域不匹配。在你的模板中,背景是黑色的,你的灌木丛是白色的。因此,要么将模板背景更改为白色,要么在 matchTemplate() 中使用来自 alpha 通道的蒙版。请参阅 matchTemplate 文档以了解在 Python/OpenCV:
中使用掩码图像(以下最后一个参数)result = cv.matchTemplate( image, templ, method[, result[, mask]] )
所以拿你的模板图片(灌木):
并提取 alpha 通道并仅保留图像的 BGR 通道:
mask = template[:,:,3]
template = template[:,:,0:3]
不转换为灰度。 matchTemplate 可以处理彩色图像。