开源 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("程序执行失败!")
相关推荐
冬奇Lab1 小时前
每日一个开源项目(第149篇):RAG-Anything - 把图片、表格、公式当成一等公民的多模态 RAG 框架
人工智能·开源
用户8356290780514 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户8356290780514 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
太阳之子11 小时前
给你的 AI Agent 装一双"能上网冲浪"的眼睛
开源
你好潘先生12 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师12 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码12 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf13 小时前
FastAPI 如何连接 MySQL
后端·python
冬奇Lab1 天前
每日一个开源项目(第148篇):obsidian-skills - Obsidian CEO 亲写的 AI Agent 格式规范,让 Agent 不再破坏你的 Vault
人工智能·开源·资讯
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境