影刀RPA进阶教程:颜色识别、图像匹配与无界面运行

之前的文章讲过图像识别(第34篇),但主要是“找图点击”这种基础场景。今天讲三个更进阶的视觉自动化能力:

  1. 颜色识别——检测页面特定位置的颜色变化

picture.image 2. 高级图像匹配——多尺度识别、旋转匹配

  1. 无界面运行——后台静默执行,不干扰前台操作

这些能力在监控场景(如价格变动检测)和后台服务场景中非常有用。

picture.image


颜色识别:检测页面状态变化

picture.image 适用场景:

  • 监控价格标签颜色变化(红色→绿色)
  • 检测状态指示灯(在线/离线)
  • 检测按钮是否可点击(灰色→彩色)

picture.image

获取指定坐标的颜色值

# ===== 获取屏幕上某一点的颜色 =====
# 方法1:通过截图获取

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/53b6baf5f5734a5f9e555e0a3eecce76~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783279928&x-signature=JCR3ZcPP4swETiFV1hgFvhmDAKo%3D)
屏幕截图(保存路径="C:/temp/screen.png")

# 用Python读取颜色
执行Python代码(
    代码="""
    
![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/a577e156fefa45f9be3b328bef944553~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783279928&x-signature=Gut7w8zFRlEYRDsdo00a%2F%2FgfuAA%3D)
from PIL import Image
import json

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

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/9d3a2cde76e6476592c9ad50088ca23e~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783279928&x-signature=TZvIQObVIqTJqYsp2lhPB5%2FjVOk%3D)
# 获取指定坐标的颜色(RGB)
x, y = 100, 200
rgb = img.getpixel((x, y))
color = {'R': rgb[0], 'G': rgb[1], 'B': rgb[2]}
""",

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/7e8e2749d1754fb38975ad9507ab5185~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783279928&x-signature=h9%2FcAcrLbfsCrnFJSYobka1JR%2FY%3D)
    输出参数: 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
    )
    
![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/3b3ef2552ca0437eaa7161b359953a11~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783279928&x-signature=GLLYsmV2LaBlFU%2Baywzv17uas%2Bo%3D)
    
    如果 is_red == True:
        输出日志("【告警】检测到红色价格,可能降价了!")
        发送企业微信消息("价格变动告警:检测到红色价格")
        跳出循环
    结束如果
    
    等待(5)
结束循环

颜色阈值参考:

颜色RGB判断条件
红色>200<100<100R>200 and G<100 and B<100
绿色<100>200<100R<100 and G>200 and B<100
蓝色<100<100>200R<100 and G<100 and B>200
黄色>200>200<100R>200 and G>200 and B<100
灰色~150~150~150abs(R-G)<20 and abs(G-B)<20

高级图像匹配

多尺度识别(解决缩放问题)

picture.image

# ===== 多尺度图像匹配 =====
# 适用场景:按钮在不同分辨率下大小不同

设置变量(匹配成功 = 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学习手册》系列文章之一,内容源于实操经验的整理与分享。

0
0
0
0
评论
未登录
暂无评论