从 Gemini 的回答中可以看出,你关注的 “CV + 键鼠仿真实现 RPA” 是一个非常有价值的技术方向,我会基于这个回答,为你梳理出可落地的实操方案和核心要点,帮你把这个思路转化为实际可用的代码。
一、快速上手:Ubuntu 环境下的 CV-RPA 最小实现
下面是一个完整的示例脚本,实现 “识别屏幕上的‘保存’按钮并点击” 的核心功能,你可以直接复制使用。
1. 前置依赖安装
首先在 Ubuntu 终端执行以下命令安装所需库:
bash
运行
# 安装系统级工具(用于键鼠操作)
sudo apt-get install -y xdotool scrot
# 安装Python依赖
pip install pyautogui opencv-python rapidocr-onnxruntime pillow
xdotool:Ubuntu 下模拟键鼠操作的底层工具scrot:截图工具(PyAutoGUI 依赖)rapidocr-onnxruntime:轻量级中文 OCR 库(比 Tesseract 更易安装)pyautogui:跨平台键鼠控制 + 图像匹配
2. 完整代码实现
python
运行
import pyautogui
import cv2
import numpy as np
from rapidocr_onnxruntime import RapidOCR
# -------------------------- 核心配置 --------------------------
# 截图模板路径(你需要自己截取目标按钮的小图,比如save_button.png)
TEMPLATE_PATH = "save_button.png"
# 图像匹配置信度阈值(0-1,越高越严格)
MATCH_THRESHOLD = 0.8
# 等待时间(防止操作过快)
DELAY_TIME = 1
# -------------------------- 初始化工具 --------------------------
# 初始化OCR引擎(用于识别文字)
ocr = RapidOCR()
# 设置PyAutoGUI的暂停时间(防止操作太快)
pyautogui.PAUSE = DELAY_TIME
# 开启失败保护(鼠标移到屏幕左上角会终止脚本)
pyautogui.FAILSAFE = True
# -------------------------- 核心函数 --------------------------
def find_element_by_image(template_path, threshold):
"""
通过图像匹配定位屏幕上的元素
:param template_path: 模板图片路径
:param threshold: 匹配阈值
:return: 元素中心坐标 (x, y) 或 None
"""
# 读取模板图片
template = cv2.imread(template_path, 0)
if template is None:
print(f"错误:无法读取模板图片 {template_path}")
return None
# 获取模板尺寸
h, w = template.shape
# 截取当前屏幕并转为灰度图
screenshot = pyautogui.screenshot()
screenshot_gray = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2GRAY)
# 模板匹配
result = cv2.matchTemplate(screenshot_gray, template, cv2.TM_CCOEFF_NORMED)
loc = np.where(result >= threshold)
# 提取第一个匹配的中心坐标
if len(loc[0]) > 0:
x = loc[1][0] + w // 2
y = loc[0][0] + h // 2
return (x, y)
else:
print("未找到匹配的元素")
return None
def recognize_text_in_region(region=None):
"""
识别屏幕指定区域的文字(region格式:(x1, y1, width, height))
:param region: 识别区域,None则识别全屏
:return: 识别到的文字列表
"""
# 截取指定区域屏幕
if region:
screenshot = pyautogui.screenshot(region=region)
else:
screenshot = pyautogui.screenshot()
# OCR识别
result, _ = ocr(np.array(screenshot))
if result:
# 提取文字部分
text_list = [item[1] for item in result]
return text_list
else:
return []
def click_element(x, y):
"""模拟鼠标点击指定坐标"""
pyautogui.moveTo(x, y, duration=0.2) # 平滑移动鼠标
pyautogui.click(x, y)
print(f"已点击坐标:({x}, {y})")
# -------------------------- 主逻辑 --------------------------
if __name__ == "__main__":
# 1. 尝试通过图像匹配定位“保存”按钮
target_pos = find_element_by_image(TEMPLATE_PATH, MATCH_THRESHOLD)
if target_pos:
click_element(*target_pos)
else:
# 2. 备用方案:识别屏幕上的“保存”文字并点击(示例)
print("尝试通过文字识别定位...")
text_list = recognize_text_in_region()
if "保存" in text_list:
# 这里可以扩展:根据文字位置定位并点击
print("识别到“保存”文字,可扩展点击逻辑")
else:
print("未识别到目标文字")
二、关键代码解释
- 图像匹配核心(find_element_by_image)
- 先读取你预先截取的目标按钮模板(比如
save_button.png) - 截取当前屏幕并转为灰度图(减少颜色干扰)
- 使用 OpenCV 的
matchTemplate进行模板匹配,通过阈值过滤低相似度结果 - 返回第一个匹配元素的中心坐标(避免点击到边缘)
- 先读取你预先截取的目标按钮模板(比如
- OCR 文字识别(recognize_text_in_region)
- 基于 RapidOCR 实现中文识别,无需复杂配置
- 支持指定识别区域(减少识别范围,提高速度和准确率)
- 返回识别到的所有文字列表,方便判断是否存在目标文字(如 “另存为”)
- 键鼠操作(click_element)
- 使用
pyautogui.moveTo平滑移动鼠标(更接近人类操作) - 开启
FAILSAFE保护:鼠标移到屏幕左上角可终止脚本,防止无限循环
- 使用
三、实操注意事项(解决 Gemini 提到的工程挑战)
- 分辨率 / 缩放问题
- 截取模板图片时,务必在实际运行环境中截取(和目标屏幕分辨率 / 缩放一致)
- 可在代码中添加分辨率适配:先获取屏幕分辨率,再缩放模板图片
- 动态渲染 / 遮挡问题
- 操作前添加
pyautogui.sleep(1),等待 UI 加载完成 - 匹配失败时,可多次尝试(比如循环 3 次),避免单次遮挡导致失败
- 操作前添加
- 提高匹配准确率
- 截取模板时,只截取目标元素的核心区域(比如按钮的图标部分),不要包含过多背景
- 调整
MATCH_THRESHOLD:固定场景下可设为 0.7-0.8,复杂场景可降到 0.6
总结
- 核心技术栈:Ubuntu 下用 Python + PyAutoGUI(图像匹配 / 键鼠操作) + RapidOCR(文字识别)即可快速实现 CV-RPA,无需从零写 OpenCV 底层;
- 核心挑战:实际落地需解决分辨率、动态 UI、遮挡问题,核心方案是 “固定运行环境 + 多次重试 + 合理阈值”;
- 优先级选择:固定场景下,CV-RPA 完全够用;通用场景优先考虑控件识别(如 Windows 的 UIA、网页的 DOM),CV 作为兜底方案。
你可以先从这个最小示例入手,替换成你需要操作的目标元素(比如 Word 的 “另存为” 按钮),测试后再逐步扩展逻辑(比如增加多元素识别、流程判断等)。