之前的文章讲过图像识别(第34篇),但主要是“找图点击”这种基础场景。今天讲三个更进阶的视觉自动化能力:
- 颜色识别——检测页面特定位置的颜色变化
2. 高级图像匹配——多尺度识别、旋转匹配
- 无界面运行——后台静默执行,不干扰前台操作
这些能力在监控场景(如价格变动检测)和后台服务场景中非常有用。
颜色识别:检测页面状态变化
适用场景:
- 监控价格标签颜色变化(红色→绿色)
- 检测状态指示灯(在线/离线)
- 检测按钮是否可点击(灰色→彩色)
获取指定坐标的颜色值
# ===== 获取屏幕上某一点的颜色 =====
# 方法1:通过截图获取

屏幕截图(保存路径="C:/temp/screen.png")
# 用Python读取颜色
执行Python代码(
代码="""

from PIL import Image
import json
# 打开截图
img = Image.open('C:/temp/screen.png')

# 获取指定坐标的颜色(RGB)
x, y = 100, 200
rgb = img.getpixel((x, y))
color = {'R': rgb[0], 'G': rgb[1], 'B': rgb[2]}
""",

输出参数: color_info=color
)
输出日志("坐标(100,200)的颜色:" + color_info)
检测颜色变化
# ===== 监控价格颜色变化 =====
设置变量(上次颜色 = "")
按次数循环(10): # 监测10次,每次间隔5秒
# 截图
屏幕截图(保存路径="C:/temp/price_screen.png")
# 提取价格区域的颜色(假设价格在坐标(500,300)附近)
执行Python代码(
代码="""
from PIL import Image
img = Image.open('C:/temp/price_screen.png')
rgb = img.getpixel((500, 300))
# 判断颜色是否为红色(R>200, G<100, B<100)
is_red = rgb[0] > 200 and rgb[1] < 100 and rgb[2] < 100
""",
输出参数: is_red=is_red
)

如果 is_red == True:
输出日志("【告警】检测到红色价格,可能降价了!")
发送企业微信消息("价格变动告警:检测到红色价格")
跳出循环
结束如果
等待(5)
结束循环
颜色阈值参考:
| 颜色 | R | G | B | 判断条件 |
|---|---|---|---|---|
| 红色 | >200 | <100 | <100 | R>200 and G<100 and B<100 |
| 绿色 | <100 | >200 | <100 | R<100 and G>200 and B<100 |
| 蓝色 | <100 | <100 | >200 | R<100 and G<100 and B>200 |
| 黄色 | >200 | >200 | <100 | R>200 and G>200 and B<100 |
| 灰色 | ~150 | ~150 | ~150 | abs(R-G)<20 and abs(G-B)<20 |
高级图像匹配
多尺度识别(解决缩放问题)
# ===== 多尺度图像匹配 =====
# 适用场景:按钮在不同分辨率下大小不同
设置变量(匹配成功 = False)
设置变量(缩放比例列表 = [0.8, 0.9, 1.0, 1.1, 1.2])
按列表循环(缩放比例列表, 循环项=scale):
输出日志("尝试缩放比例:" + scale)
Try:
# 影刀图像识别指令可以设置缩放
图像识别点击(
图片路径="resources/btn_submit.png",
相似度=0.8,
缩放=scale # 影刀指令中的缩放参数
)
匹配成功 = True
输出日志("匹配成功,缩放比例:" + scale)
跳出循环
Catch:
输出日志("缩放 " + scale + " 匹配失败")
继续循环
EndTry
结束循环
如果 匹配成功 == False:
输出日志("【错误】在所有缩放比例下均未匹配到")
结束如果
多角度匹配(旋转)
# ===== 多角度图像匹配 =====
# 适用场景:图标可能被旋转(如某些验证码场景)
# 在Python中生成旋转后的图片,再进行匹配
执行Python代码(
代码="""
from PIL import Image
import os
# 读取原始图片
img = Image.open('resources/icon_target.png')
# 生成0°、90°、180°、270°四个版本
angles = [0, 90, 180, 270]
for angle in angles:
rotated = img.rotate(angle, expand=True)
rotated.save(f'resources/icon_target_{angle}.png')
""",
输出: 生成成功
)
# 然后依次尝试匹配
按列表循环([0, 90, 180, 270], 循环项=角度):
Try:
图像识别点击(
图片路径="resources/icon_target_" + 角度 + ".png",
相似度=0.85
)
输出日志("匹配成功,角度:" + 角度)
跳出循环
Catch:
继续循环
EndTry
结束循环
无界面运行(Headless模式)
适用场景:
- 服务器后台运行,不需要弹浏览器窗口
- 批量采集任务,减少资源消耗
- 不希望用户看到操作过程
开启无界面模式
影刀实操路径: 浏览器环境属性 → 勾选“无界面运行(Headless)”
# 在浏览器环境中设置
# 1. 右键浏览器环境 → 属性
# 2. 勾选“无界面运行(Headless)”
# 3. 保存
# 使用该浏览器环境的流程,将不会弹出浏览器窗口
打开浏览器环境(环境名称="Headless_淘宝")
# 所有操作在后台执行
无界面模式的注意事项
| 注意事项 | 原因 | 解决方法 |
|---|---|---|
| 截图可能为空 | 无界面模式不渲染画面 | 改用网页截图指令 |
| 某些元素定位不到 | 页面依赖渲染事件 | 改用DOM操作 |
| 调试困难 | 看不到执行过程 | 开发时关闭无界面,上线时开启 |
| 验证码无法人工处理 | 看不到验证码 | 接入打码平台API |
无界面模式下的截图
# ===== 无界面模式下的截图 =====
# 普通截图可能失效,用网页截图指令代替
网页截图(
保存路径="C:/logs/headless_screen.png",
截图类型="完整页面"
)
# 或使用浏览器的开发者工具截图
执行JavaScript("""
// 使用html2canvas等库,或直接输出页面内容
""")
实战:无界面价格监控系统
场景: 每天定时在后台监控竞品价格,价格变化时自动告警。
# ============================================
# 无界面价格监控(定时任务)
# ============================================
# 1. 配置无界面浏览器环境(在浏览器环境属性中设置)
打开浏览器环境(环境名称="Headless_监控")
# 2. 打开目标页面(无界面,不弹窗)
打开网页("https://product.xxx.com/12345")
# 3. 等待页面加载(无界面下使用DOM等待)
等待元素加载("//span[@class='price']", 超时时间=10秒)
# 4. 获取当前价格
当前价格 = 获取元素文本("//span[@class='price']")
当前价格数字 = 提取数字(当前价格)
输出日志("当前价格:" + 当前价格数字)
# 5. 读取历史价格(从配置表)
读取Excel文件("配置/价格历史.xlsx", 输出变量=历史数据)
上次价格 = 历史数据[1][0] # 最后一行的价格
# 6. 计算变化
变化率 = (当前价格数字 - 上次价格) / 上次价格 * 100
输出日志("价格变化率:" + 变化率 + "%")
# 7. 如果变化超过阈值,告警
如果 绝对值(变化率) > 5:
# 保存当前页面截图(无界面下用网页截图)
网页截图("日志/price_change_" + 获取当前时间戳() + ".png")
# 发送告警
发送企业微信消息(
"价格变动告警\n" +
"商品ID:12345\n" +
"上次价格:" + 上次价格 + "\n" +
"当前价格:" + 当前价格数字 + "\n" +
"变化率:" + 变化率 + "%"
)
结束如果
# 8. 更新历史价格
追加行数据到表格("配置/价格历史.xlsx", [当前价格数字, 获取当前时间()])
# 9. 关闭浏览器环境
关闭浏览器环境()
常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 无界面模式下元素定位不到 | 页面依赖渲染事件 | 用DOM等待,不用视觉等待 |
| 截图空白 | 无界面不渲染画面 | 用网页截图指令 |
| 图像识别无界面下失效 | 图像识别依赖屏幕 | 改用XPath或DOM操作 |
| 颜色识别不准确 | 截图压缩 | 提高截图质量参数 |
| 图像匹配太慢 | 图片太大 | 缩小截图区域,提高匹配速度 |
推荐资源
- PIL/Pillow文档——Python图像处理
- OpenCV Python教程——高级图像匹配(影刀可调用)
- 本系列第34篇《桌面应用自动化与图像识别》
#影刀RPA #RPA自动化 #颜色识别 #图像匹配 #无界面运行
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
