You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位特定识别文本周边的按钮边框坐标?

问题:定位含特定文本的按钮边框坐标

我有一批截图,需要定位含“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")

不同截图里的按钮样式不固定:边距、位置、背景色等都可能不同。之前用模板匹配定位按钮,精度不够,每个项目还要手动调整,准备多套模板和函数,效率很低。

请问识别到目标文本后,怎么获取其周边最近边框的坐标?

示例截图:含EXIT的按钮

解决方案

核心思路是利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:30:52