You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python定位图像中心形点赞按钮的像素位置

这问题我之前做界面自动化的时候碰到过!要定位不同截图里位置变化的心形点赞按钮,并用左下角为原点的坐标系输出像素坐标,用Python可以通过几种不同思路实现,我给你详细说说:

方法1:模板匹配(适合形状/颜色固定的按钮)

这是最直接的方案,适合按钮的外观(形状、颜色、大小)基本一致的场景。核心思路是拿一张单独的“心形按钮模板图”,和目标截图做匹配,找到最相似的区域。

步骤&代码示例

  1. 准备模板:先截一张单独的心形按钮图(比如heart_template.png),尽量和目标截图里的按钮尺寸一致。
  2. 用OpenCV实现匹配:
import cv2
import numpy as np

# 读取目标截图和模板
target_img = cv2.imread("screenshot.png")
template_img = cv2.imread("heart_template.png")

# 获取模板的宽高
h_template, w_template = template_img.shape[:2]

# 执行模板匹配(TM_CCOEFF_NORMED是比较常用的匹配方法)
result = cv2.matchTemplate(target_img, template_img, cv2.TM_CCOEFF_NORMED)
# 设置匹配阈值(比如0.8,值越高匹配越严格)
threshold = 0.8
locations = np.where(result >= threshold)

# 转换坐标系:OpenCV默认原点在左上角,要转成左下角为原点
img_height = target_img.shape[0]
for pt in zip(*locations[::-1]):  # pt是匹配区域的左上角坐标(x, y)
    # 计算左下角为原点的坐标:x不变,y变为图像高度减去原y值
    x_left_bottom = pt[0]
    y_left_bottom = img_height - pt[1]
    # 如果需要按钮中心坐标,再加上模板宽高的一半
    center_x = x_left_bottom + w_template // 2
    center_y = y_left_bottom - h_template // 2
    print(f"心形按钮左上角坐标(左下角为原点):({x_left_bottom}, {y_left_bottom})")
    print(f"心形按钮中心坐标(左下角为原点):({center_x}, {center_y})")

注意点

  • 如果按钮有轻微的尺寸变化,可以尝试多尺度匹配:把模板缩放到不同大小,分别匹配后取最佳结果。
  • 阈值要根据实际情况调整,避免误匹配。
方法2:特征检测(适合按钮有变形/缩放的情况)

如果你的心形按钮在不同截图里有大小变化、轻微旋转或者颜色微调,模板匹配就不太靠谱了,这时候可以用特征检测算法(比如ORB、SIFT),通过提取按钮的关键特征点来匹配定位。

代码示例(用ORB)

import cv2
import numpy as np

# 读取图像
target_img = cv2.imread("screenshot.png", cv2.IMREAD_GRAYSCALE)
template_img = cv2.imread("heart_template.png", cv2.IMREAD_GRAYSCALE)

# 初始化ORB检测器
orb = cv2.ORB_create()
# 提取特征点和描述符
kp1, des1 = orb.detectAndCompute(template_img, None)
kp2, des2 = orb.detectAndCompute(target_img, None)

# 匹配特征点
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
# 按匹配度排序
matches = sorted(matches, key=lambda x: x.distance)

# 取前N个最佳匹配点,计算目标位置
if len(matches) > 10:
    src_pts = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
    dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
    # 计算单应性矩阵
    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
    h, w = template_img.shape
    # 模板的四个角点
    pts = np.float32([[0, 0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)
    # 转换到目标图像中的角点
    dst = cv2.perspectiveTransform(pts, M)
    
    # 转换坐标系到左下角为原点
    img_height = target_img.shape[0]
    # 取第一个角点(左上角)的坐标
    x_orig = dst[0][0][0]
    y_orig = dst[0][0][1]
    x_left_bottom = x_orig
    y_left_bottom = img_height - y_orig
    print(f"心形按钮左上角坐标(左下角为原点):({x_left_bottom:.2f}, {y_left_bottom:.2f})")
方法3:深度学习目标检测(适合复杂场景)

如果你的截图背景很复杂,或者按钮有多种样式,前面的方法可能不够稳定,这时候可以用轻量级的目标检测模型(比如YOLOv5、YOLOv8的tiny版本),训练一个专属的检测模型。

简单实现思路

  1. 收集几十张包含心形按钮的截图,标注按钮的位置(用LabelImg工具)。
  2. 用YOLOv5训练一个小模型(不需要太多算力,普通电脑就能跑)。
  3. 用训练好的模型对新截图做检测,直接输出按钮的 bounding box,再转换坐标系即可。

这种方法的优势是鲁棒性极强,能应对各种复杂场景,缺点是需要一定的标注和训练成本。


内容的提问来源于stack exchange,提问作者gapansi

火山引擎 最新活动