开源 python 应用 开发(二)基于pyautogui、open cv 视觉识别的工具自动化

最近有个项目需要做视觉自动化处理的工具,最后选用的软件为python,刚好这个机会进行系统学习。短时间学习,需要快速开发,所以记录要点步骤,防止忘记。

链接:

开源 python 应用 开发(一)python、pip、pyAutogui、python opencv安装-CSDN博客

开源 python 应用 开发(二)基于pyautogui、open cv 视觉识别的工具自动化-CSDN博客

推荐链接:

开源 Arkts 鸿蒙应用 开发(一)工程文件分析-CSDN博客

开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-CSDN博客

开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-CSDN博客

开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-CSDN博客

开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件-CSDN博客

推荐链接:

开源 java android app 开发(一)开发环境的搭建-CSDN博客

开源 java android app 开发(二)工程文件结构-CSDN博客

开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客

开源 java android app 开发(四)GUI界面重要组件-CSDN博客

开源 java android app 开发(五)文件和数据库存储-CSDN博客

开源 java android app 开发(六)多媒体使用-CSDN博客

开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客

开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客

开源 java android app 开发(九)后台之线程和服务-CSDN博客

开源 java android app 开发(十)广播机制-CSDN博客

开源 java android app 开发(十一)调试、发布-CSDN博客

开源 java android app 开发(十二)封库.aar-CSDN博客

推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客

本章节内容如下:芯片的固件经常需要生成加密文件,进行次数的限制,人工操作比较复杂。通过使用pyAutogui和 open cv的库,通过截取图片,实现的软件的打开,选择文件,配置芯片参数,生成加密下载软件的功能。

  1. 软件的流程和截图

  2. 程序代码

一、软件的流程和截图

工具的自动化实际就是软件模拟人工,查看屏幕进行手动鼠标和键盘的操作。屏幕是个输入信号,通过截取图片获取。鼠标和键盘是个输出信号,通过小图片在大图片中的比对,获得位置,输出点击等动作,实现人工的模拟。

1.1 比如程序启动,会先截取全屏。

1.2 然后通过cms.png这个图片,与全屏截图进行比对,获取cms图片在全屏图片中的位置。

1.3 最后控制鼠标移动到,cms writer.exe的位置 点击该位置,打开软件。

二、程序代码

2.1 截取全屏代码

复制代码
# 1. 打开CMS Writer并加载hex文件
    screenshot = pyautogui.screenshot()
    screenshot.save("screenshot.png")

2.2 定位图片和鼠标双击函数代码

复制代码
def locate_and_dbclick(image, confidence=0.8, region=None, description=""):
    """查找图片并双击"""
    image = os.path.join("D:/python/3510C_Writer", image)

    try:
        location = pyautogui.locateOnScreen(image, confidence=confidence, region=region)
        if location:
            print(f"找到{description}按钮位置:", location)
            center = pyautogui.center(location)
            pyautogui.moveTo(center.x, center.y, duration=0.3)
            pyautogui.doubleClick()
            print(f"双击{description}成功!")
            return True
        else:
            print(f"未找到{image},请检查图片是否可见")
            return False
    except Exception as e:
        print(f"操作{description}发生错误:", e)
        return False        

2.3 定位图片和单机图片代码

复制代码
def locate_and_click(image, confidence=0.8, region=None, description=""):
    """查找图片并单击"""
    image = os.path.join("D:/python/3510C_Writer", image)
    try:
        location = pyautogui.locateOnScreen(image, confidence=confidence, region=region)
        if location:
            print(f"找到{description}按钮位置:", location)
            center = pyautogui.center(location)
            pyautogui.moveTo(center.x, center.y, duration=0.3)
            pyautogui.click()
            print(f"点击{description}成功!")
            return True
        else:
            print(f"未找到{image},请检查图片是否可见")
            return False
    except Exception as e:
        print(f"操作{description}发生错误:", e)
        return False

2.4 程序所有代码

最终代码:

复制代码
import pyautogui
import time
import os
import argparse

from pathlib import Path
#python para.py --hex_file CMS6990_TESTV1 --flash_count 20 --serial_number 23452686
def parse_arguments():
    """解析命令行参数"""
    parser = argparse.ArgumentParser(description='CMS Writer自动化脚本')
    parser.add_argument('--hex_file', default='CMS6990_TESTV1', help='要加载的.hex文件路径')
    parser.add_argument('--flash_count', default='2', help='闪存次数')
    parser.add_argument('--serial_number', default='23452686', help='序列号')
    parser.add_argument('--output_name', default='flash', help='输出文件名')
    return parser.parse_args()

def delete_flash_exe():
    """删除 flash.exe 文件"""
    file_path = os.path.join("D:/python/3510C_Writer", "flash.exe")   
    # file_path = r"flash.exe"
    try:
        if os.path.exists(file_path):
            os.remove(file_path)
            print("成功删除 flash.exe 文件")
        else:
            print("未找到 flash.exe 文件")
    except Exception as e:
        print(f"删除文件失败: {e}")

def close_writer():
    """关闭 CMS Writer"""
    try:
        os.system("taskkill /f /im \"cms writer.exe\"")
        print("已关闭 CMS Writer")
    except Exception as e:
        print(f"关闭 CMS Writer 失败: {e}")

def locate_and_dbclick(image, confidence=0.8, region=None, description=""):
    """查找图片并双击"""
    image = os.path.join("D:/python/3510C_Writer", image)

    try:
        location = pyautogui.locateOnScreen(image, confidence=confidence, region=region)
        if location:
            print(f"找到{description}按钮位置:", location)
            center = pyautogui.center(location)
            pyautogui.moveTo(center.x, center.y, duration=0.3)
            pyautogui.doubleClick()
            print(f"双击{description}成功!")
            return True
        else:
            print(f"未找到{image},请检查图片是否可见")
            return False
    except Exception as e:
        print(f"操作{description}发生错误:", e)
        return False        

def locate_and_click(image, confidence=0.8, region=None, description=""):
    """查找图片并单击"""
    image = os.path.join("D:/python/3510C_Writer", image)
    try:
        location = pyautogui.locateOnScreen(image, confidence=confidence, region=region)
        if location:
            print(f"找到{description}按钮位置:", location)
            center = pyautogui.center(location)
            pyautogui.moveTo(center.x, center.y, duration=0.3)
            pyautogui.click()
            print(f"点击{description}成功!")
            return True
        else:
            print(f"未找到{image},请检查图片是否可见")
            return False
    except Exception as e:
        print(f"操作{description}发生错误:", e)
        return False

def main():
    args = parse_arguments()
    
    # 删除flash.exe文件
    delete_flash_exe()
    time.sleep(1)

    # 1. 打开CMS Writer并加载hex文件
    screenshot = pyautogui.screenshot()
    screenshot.save("screenshot.png")

    if not locate_and_dbclick('cms.png', description="CMS Writer"):
        close_writer()
        return False
    time.sleep(1)
    
    if not locate_and_click('start.png', description="打开"):
        close_writer()
        return False
    time.sleep(1)
    
    if not locate_and_click('open.png', description="打开"):
        close_writer()
        return False
    time.sleep(1)
    
    pyautogui.write(args.hex_file)
    print(f"写入文件名 {args.hex_file} 成功!")
    time.sleep(1)
    
    if not locate_and_click('openfile.png', description="打开文件"):
        close_writer()
        return False

    # 2. 选择芯片型号
    time.sleep(1)
    if not locate_and_click('chip.png', description="芯片"):
        close_writer()
        return False
    time.sleep(1)
    
    if not locate_and_click('chipselect.png', description="芯片选择"):
        close_writer()
        return False
    time.sleep(1)
    
    pyautogui.write('3510C')
    print("写入芯片名成功!")
    time.sleep(1)
    
    if not locate_and_click('3510c.png', description="3510C"):
        close_writer()
        return False
    time.sleep(1)
    
    if not locate_and_click('protectrom.png', description="保护ROM"):
        close_writer()
        return False
    time.sleep(1)
    
    if not locate_and_click('protectromenable.png', description="启用保护"):
        close_writer()
        return False

    # 3. 设置HSI频率
    max_scrolls = 10
    scroll_amount = -150
    print("开始滚动查找HSI_FS...")

    pyautogui.scroll(scroll_amount)
    time.sleep(0.5)
    
    if not locate_and_click('HSI_FS.png', confidence=0.9, description="HSI_FS"):
        close_writer()
        return False
    time.sleep(1)
    
    if not locate_and_click('Fhsi_2.png', confidence=0.99, description="Fhsi_2"):
        close_writer()
        return False
    time.sleep(1)
    
    if not locate_and_click('chip_confirm.png', description="芯片确认"):
        close_writer()
        return False
    time.sleep(0.1)

    # 4. 文件加密设置
    time.sleep(1)
    if not locate_and_click('menu_file.png', description="文件菜单"):
        close_writer()
        return False
    time.sleep(1)
    
    if not locate_and_click('menu_encript.png', description="加密菜单"):
        close_writer()
        return False
    time.sleep(1)
    
    pyautogui.write(args.output_name)
    print(f"写入文件名 {args.output_name} 成功!")
    time.sleep(1)
    
    if not locate_and_click('dlg_fileencript_save.png', description="保存加密"):
        close_writer()
        return False
    time.sleep(1)
    
    pyautogui.write(str(args.flash_count))
    print(f"写入次数 {args.flash_count} 成功!")
    time.sleep(1)
    
    if not locate_and_click('dlg_flashnum.png', description="序列号"):
        close_writer()
        return False
    time.sleep(1)
    
    pyautogui.write(args.serial_number)
    print(f"写入序列号 {args.serial_number} 成功!")
    time.sleep(1)
    
    if not locate_and_click('chip_confirm.png', description="最终确认"):
        close_writer()
        return False
    time.sleep(0.1)

    # 所有步骤成功完成
    close_writer()
    return True

if __name__ == "__main__":
    if main():
        print("程序执行成功!")
    else:
        print("程序执行失败!")
相关推荐
SaleCoder11 分钟前
用Python构建机器学习模型预测股票趋势:从数据到部署的实战指南
开发语言·python·机器学习·python股票预测·lstm股票模型·机器学习股票趋势
批量小王子7 小时前
2025-07-15通过边缘线检测图像里的主体有没有出血
人工智能·opencv·计算机视觉
技术猿188702783517 小时前
实现“micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据(一个方法)
开发语言·网络·python·深度学习·测试工具
烛阴7 小时前
为什么你的Python项目总是混乱?层级包构建全解析
前端·python
三金C_C7 小时前
asyncio 与 uvloop
python·异步·asyncio
放飞自我的Coder7 小时前
【colab 使用uv创建一个新的python版本运行】
开发语言·python·uv
黎茗Dawn7 小时前
连接new服务器注意事项
linux·python
LJianK18 小时前
Java和JavaScript的&&和||
java·javascript·python
天天爱吃肉82189 小时前
效率提升新范式:基于数字孪生的汽车标定技术革命
python·嵌入式硬件·汽车
大师兄666810 小时前
「源力觉醒 创作者计划」_文心开源模型(ERNIE-4.5-VL-28B-A3B-PT)使用心得
百度·开源·文心大模型·gitcode·文心开源模型·ernie-4.5·开源模型部署