如何定位特定识别文本周边的按钮边框坐标?
问题:定位含特定文本的按钮边框坐标
我有一批截图,需要定位含“EXIT”文本的按钮边框坐标。用EasyOCR识别文本坐标的过程很简单,但不知道怎么获取文本周边的边框坐标。
当前代码如下:
import cv2 import easyocr img = cv2.imread('C:/Users/xyz/PycharmProjects/findTextImage_v0/testBank/sampleScreen.png') text = easyocr.Reader(['en'], gpu = True) result = text.readtext(img) for item in result: if "EXIT" in item: print(item[0], item[1]) else: print("False")
不同截图里的按钮样式不固定:边距、位置、背景色等都可能不同。之前用模板匹配定位按钮,精度不够,每个项目还要手动调整,准备多套模板和函数,效率很低。
请问识别到目标文本后,怎么获取其周边最近边框的坐标?

解决方案
核心思路是利用EasyOCR得到的文本坐标,结合OpenCV的轮廓检测功能,筛选出文本周边的按钮边框。具体步骤如下:
- 图像预处理:将原图转为灰度图,再做二值化处理突出边框轮廓;若图像有噪声,可添加高斯模糊降噪。
- 基于文本坐标筛选轮廓:先检测图像中所有矩形轮廓,再判断每个轮廓是否包含文本区域,同时过滤过小或过大的无效轮廓。
- 确定最近边框:计算文本区域中心到每个候选轮廓中心的距离,选择距离最近的轮廓作为按钮边框。
修改后的代码示例:
import cv2 import easyocr import numpy as np # 读取图像 img = cv2.imread('C:/Users/xyz/PycharmProjects/findTextImage_v0/testBank/sampleScreen.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 预处理:二值化+降噪 blurred = cv2.GaussianBlur(gray, (5, 5), 0) _, thresh = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) # 检测所有轮廓 contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # EasyOCR识别文本 reader = easyocr.Reader(['en'], gpu=True) results = reader.readtext(img) # 遍历识别结果,找含EXIT的文本 for (bbox, text, prob) in results: if "EXIT" in text.upper(): # 获取文本区域的坐标 (tl, tr, br, bl) = bbox tl = (int(tl[0]), int(tl[1])) br = (int(br[0]), int(br[1])) text_center = ((tl[0] + br[0])//2, (tl[1] + br[1])//2) # 筛选候选轮廓:面积合适且包含文本区域 candidate_contours = [] for cnt in contours: area = cv2.contourArea(cnt) # 过滤过小和过大的轮廓,可根据实际情况调整阈值 if 500 < area < 50000: x, y, w, h = cv2.boundingRect(cnt) # 检查文本区域是否在轮廓内部 if x < tl[0] and y < tl[1] and (x + w) > br[0] and (y + h) > br[1]: candidate_contours.append((cnt, x, y, w, h)) # 找到距离文本中心最近的轮廓 if candidate_contours: min_dist = float('inf') best_bbox = None for cnt, x, y, w, h in candidate_contours: cnt_center = (x + w//2, y + h//2) dist = np.linalg.norm(np.array(text_center) - np.array(cnt_center)) if dist < min_dist: min_dist = dist best_bbox = (x, y, w, h) print(f"EXIT按钮边框坐标:x={best_bbox[0]}, y={best_bbox[1]}, 宽度={best_bbox[2]}, 高度={best_bbox[3]}") # 可选:在图像上画出边框,验证结果 cv2.rectangle(img, (best_bbox[0], best_bbox[1]), (best_bbox[0]+best_bbox[2], best_bbox[1]+best_bbox[3]), (0,255,0), 2) cv2.imshow('Result', img) cv2.waitKey(0) cv2.destroyAllWindows() else: print("未找到EXIT对应的按钮边框")
注意事项
- 预处理的阈值(比如二值化阈值、轮廓面积范围)需要根据实际截图的样式调整,确保能准确提取按钮轮廓。
- 如果按钮边框是圆角的,
cv2.boundingRect()会返回外接矩形,若需要精确的圆角轮廓,可改用cv2.approxPolyDP()做多边形逼近。 - 若存在多个包含EXIT文本的轮廓,通过计算中心距离的方式能有效筛选出最近的按钮边框。
内容的提问来源于stack exchange,提问作者mvCode
相关产品推荐
相关产品推荐

