首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Opencv matchTemplate在地图中找不到布什

Opencv matchTemplate在地图中找不到布什
EN

Stack Overflow用户
提问于 2022-05-22 05:26:40
回答 2查看 111关注 0票数 0

我想在一张2d地图中找到2d灌木丛的图像。根据他们的网站我用了这个代码

代码语言:javascript
复制
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函数还是其他包),或者是我的代码问题。

使用这些图像(布什在地图下面)

布什:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-22 07:10:58

实际上,我已经找到了答案,正如fmw42在评论中建议我做一个灌木掩膜,因此使用这段代码我得到了答案。后来,我还不得不将门槛提高到0.9。或者,将阈值降低到0.24也是有效的,但是对于不同的图像,它会有不同的阈值,而我不想要这些阈值

代码语言:javascript
复制
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)

票数 2
EN

Stack Overflow用户

发布于 2022-05-23 16:54:37

您的模板具有透明的背景。但是您的matchTemplate没有使用透明alpha通道的掩码。因此,你是匹配的背景下的透明度,这很可能不匹配的地区周围灌木丛。在你的模板中,背景是黑色的,你的灌木有一个白色的背景。因此,要么将模板背景更改为白色,要么使用matchTemplate()中alpha通道的掩码。有关使用Python/OpenCV中掩码图像(以下中的最后参数)的文档,请参阅matchTemplate文档:

代码语言:javascript
复制
result  =   cv.matchTemplate(   image, templ, method[, result[, mask]]  )

因此,以模板图像(灌木)为例:

并提取alpha通道并只保留图像的BGR通道:

代码语言:javascript
复制
mask = template[:,:,3]

代码语言:javascript
复制
template = template[:,:,0:3]

不要转换为灰度。matchTemplate可以处理彩色图像。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72335003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档