OpenCV模板匹配文本替换为黑框+背景置白及坐标获取问题求助
你现有代码存在以下4个问题:
- 宽高取值颠倒:
template.shape[:-1]返回顺序为(高度, 宽度),你直接赋值给w, h会导致后续绘制矩形的尺寸和模板不符,无法正确覆盖匹配区域。 - 匹配阈值过低:0.5的阈值会引入大量误匹配,是当前结果出现大量杂乱黑块的核心原因,文本类模板匹配场景阈值建议调整到0.8以上,可根据实际匹配效果微调。
- 缺少背景置白逻辑:你直接在原图上绘制矩形,没有做背景替换的操作,自然无法得到全白背景的输出。
- 未做匹配结果去重:模板匹配针对同一个目标通常会返回多个重叠的坐标点,直接遍历绘制会出现重复绘制的问题。
修正后的完整代码如下:
import cv2 import numpy as np # 读取原图与模板 img_rgb = cv2.imread('./image/10.jpg') template = cv2.imread('./image/matchedTxt_106.jpg') # 正确获取模板的高度、宽度 h, w = template.shape[:-1] # 执行模板匹配 res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED) # 调高匹配阈值过滤误匹配 threshold = .85 loc = np.where(res >= threshold) # 收集所有匹配到的框坐标 boxes = [] for pt in zip(*loc[::-1]): boxes.append([int(pt[0]), int(pt[1]), int(pt[0]+w), int(pt[1]+h)]) # 对重叠的匹配框去重 if len(boxes) > 0: boxes, _ = cv2.groupRectangles(boxes, 1, 0.2) # 创建和原图尺寸一致的全白背景 result = np.full_like(img_rgb, 255, dtype=np.uint8) # 绘制黑色填充矩形,同时输出坐标 for (x1, y1, x2, y2) in boxes: cv2.rectangle(result, (x1, y1), (x2, y2), (0,0,0), -1) # 此处打印的就是匹配区域的坐标,你也可以存入列表做后续使用 print(f"匹配区域:左上角({x1}, {y1}),右下角({x2}, {y2})") cv2.imwrite('result1.png', result)
关于匹配坐标的获取:你遍历zip(*loc[::-1])得到的pt就是匹配区域的左上角(x,y)坐标,结合模板的宽高即可算出右下角坐标,上述代码已经包含了坐标输出的逻辑。
内容的提问来源于stack exchange,提问作者Carol.Kar
相关产品推荐
相关产品推荐

