屏幕状态自动检测+鼠标自动操作

目录

一、写在前面

1.1适用场景

1.2涉及到的库

二、函数库

2.1pyautogui-屏幕截图&鼠标操作

2.1.1屏幕截图screenshot函数

2.1.2鼠标移动及单击

2.2Opencv-模板匹配

2.2.1matchTemplate函数

2.2.2minMaxLoc函数

2.2.3相关代码

2.3base64-图片转base64

2.3.1在线转换网站

2.3.2转换代码

三、 实例

3.1需求

3.2解决思路

3.3代码


一、写在前面

1.1适用场景

部分需要检测相关软件处于特定状态后执行相应操作

1.2涉及到的库

屏幕状态自动检测:Opencv库->模板匹配

鼠标自动操作:pyautogui库->执行屏幕截图、鼠标移动及单击等

图片转Base64:base64库->避免使用本地图片封装程序

二、函数库

2.1pyautogui-屏幕截图&鼠标操作

2.1.1屏幕截图screenshot函数

该函数可用于对屏幕截图并对相关状态进行监测,默认为对全屏进行截图

img = pyautogui.screenshot()
img.save("test.jpg")

2.1.2鼠标移动及单击

可根据相关事件触发自动对鼠标执行相应操作

①pyautogui.moveTo(x, y, duration=0.0):将鼠标移动到指定的坐标(x, y)处。duration参数可选,用于指定移动的时间,如果设置为非零值,则会产生平滑移动的效果。

②pyautoguiclick(x=None, y=None, clicks=1, interval=0.0, button=left):模拟鼠标点击操作。通过指定坐标(x, y)来点击特定位置,clicks参数用于指定点击次数,interval参数用于指定每次点击的间隔时间,button参数可选,默认为左键。

pyautogui.moveTo(1500,100, duration=0.5)
pyautogui.click()

2.2Opencv-模板匹配

2.2.1matchTemplate函数

  • image:源图像,待匹配图像,8bit整数型、32bit浮点型,可以是单通道或多通道;

  • templ:模板图像,类型同源图像,尺寸必须小于源图像;
  • method:匹配方法;

参考资料:OpenCV-Python快速入门(十四):模板匹配_python 模板匹配-CSDN博客

2.2.2minMaxLoc函数

minMaxLoc()函数返回图像中的元素值的最小值和最大值,以及最小值和最大值的坐标。

  • src:输入图像,必须为单通道图像;
  • mask:掩码;
  • minval, maxval, minloc, maxloc:依次为最小值,最大值,最小值的坐标,最大值的坐标;

2.2.3相关代码

#模板匹配输出位置
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
templateImg = cv2.cvtColor(templateImg, cv2.COLOR_BGR2RGB)
res = cv2.matchTemplate(img,templateImg,cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
left_top = max_loc

2.3base64-图片转base64

2.3.1在线转换网站

在线转换网站:图片在线转换Base64 | 图片编码base64 (sojson.com)

转换过程如下图:

2.3.2转换代码

将base64编码转换为opencv库的图像格式:

def readb64(uri):
    encoded_data = uri.split(',')[1]
    nparr = np.fromstring(base64.b64decode(encoded_data), np.uint8)
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    return img


#图片-base64编码
templateImg = readb64("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAcCAYAAABh2p9gAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAASZSURBVEhLzVVdaBxVFB5tUmJqiw0twagEGkWtfZBWQS2KbxYliOCLj4q+iVh8EXwRURRU/IForSBCrJFqohYjpFofqpQWVmi7QRPbpuZndjc7uzt/O7uzM3fu53fuTETExz54lpM7c+bc73z3O/feWBUvRJUuY8Xn8z+85YYInRBBLYRH9+189BwfXstBy3Ow7tuohzZa0RqidBWWQmGanhWe0vkh5hDQe3R5R0KXoAQkpxicpkLQ6Jp3yyD9VzKBJewXYWMbeUVBzWdXKooJERoBaVHhIV0AOXbDmKU0MqWgQwYyIsQdfidKNyeRcZD0duFiFjSh5U0AOaZt4ZOhy8UGqWdAczpMSAWYhVQKnTJOpkJMiMt0MctEpIxL5xenW4WHBtZwkaB5moDGILtCl65uM1UoFiFB/HvJokeLTlCJV9DEZSxjWn2N/aUHMHx6FLuW7sDulX3Ys3gnnnKexnGcYMYKC5KxzJe6BUXLVJAGsYJP1AXCTeNbPOY+ii3nB7EV25i0iT4AK7BwXfUGvIAXcYq/BuychWgvTjNLVmmGsBehxoR5lHDX+Vsx8tsAxvR29PmWAZJfH7ZgyB3BLeXdmAqnmL+Wo2zsDhq73EGaKnQ7EYt4OOx+jJvs67HT6cfWyMKgtrAZ22HFfbiK6ZvjTRi+MISDK89gXp/h4kiRq9QqF9HKqFqmKHso3QRu++VuXBMNYad7LfrI7Gqb7u+CVd0BS9jSh2qDGDndj1n1GepFqzs9EZOAPTbBc2X75vp+lE7gB3yH4dUbMYkjmE6m8ZWao65z+D6bwZvJy3g8HMeX6ghW2ZqcBkmKljQC9qDIsM3GLOASt+Iq9k6N4cFz4ziHJZaLWEhhsTJvJpT8UxidGcOsf9L0021cQNaNkWxsG9GyyT8eN7JLkTU1vX9iv/lYYyzb2H5Cv2EOKj5dmsG79aMkUONaWUi1zUYRo4bchpxgo0o+ZRyYOGA+BGTWJvsuM1OCZgLI554fs7DGE6WDeCs6zOAf9Cr8LD/UPHqcoGIybOKR2XG88+sHhOJMaqJ7iqAtCt/GOqMOGXW0oAOHwi/Q/9M2Zv5JmCX46cUc0PSGgN94R7Hj5O1UcZFYrCZatBXntvjW5C/gtsoLZfxWIfyeE3vxyuXXqUSdeXJ2CWhuiWQFb6y9hpfaE1SxzEAHSUtuFnkUUTxCMVMeJUbQgDC/8xgMTN7MYhLOLzlL9CgFZ3DP5/vwvvs2Pwr10IgvE82FmOR7TMDkcsqnSreAkeP34eHlZ/kmlQhY5+T3nEl8Uj5EsDLf1ukdeoQoZpJ0WBCIKYPgG6i6tLzO8gFGj91L/p5EYTW5/ofmnsSP1WN8bcNOmkaNlvINgJGkIGhzzTa55wwl2KTmy3j+5+fw4dlXTdSKmHKJXXJlk0UiEtM8zdVqxjr55AKwyRzPcKQgPBoJr+z1bJmLaFL7sybHSswNuGASdaGZYpMzTgp1sV3Nxs7MRCX85VgwJpe2JmiWOZzGq4zG24ZHjzpkpgM0GUxH/m0SFOFJVx4FTMLGEv7yJuX/pK6EFehXDFDrHPH/Dgj8BbLsDrYrBlhtAAAAAElFTkSuQmCC")

cv2.imshow('imageShow', templateImg)
cv2.waitKey(0)
cv2.destroyAllWindows()

转换结果如图:

三、 实例

3.1需求

手动流程:样品测试完毕后,打开防辐射盖,信号颜色由绿转红,放去样品,闭合防辐射盖,信号灯由红转绿,此时鼠标移动到软件相应位置点击并输入参数执行。

①识别下图红色框中信号状态(绿色表示正在设备防辐射盖闭合,红色表示防辐射盖开启)

②对屏幕进行定时截图,并确定鼠标需要移动位置在截图中的像素点

3.2解决思路

由于相关操作是在信号状态由红转绿后操作,故仅需对自动截屏图像进行模板匹配,识别当前状态是否为绿色,若为绿色,则执行相应鼠标操作。

整体为2个While死循环,配合图像模板匹配结果在适当位置执行break语句跳出子死循环

3.3代码

#红色状态切出去
#红色状态运行程序
import base64
import cv2
import numpy as np
import time
import pyautogui


def readb64(uri):
    encoded_data = uri.split(',')[1]
    nparr = np.fromstring(base64.b64decode(encoded_data), np.uint8)
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    return img


#图片-base64编码
templateImg = readb64("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAcCAYAAABh2p9gAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAASZSURBVEhLzVVdaBxVFB5tUmJqiw0twagEGkWtfZBWQS2KbxYliOCLj4q+iVh8EXwRURRU/IForSBCrJFqohYjpFofqpQWVmi7QRPbpuZndjc7uzt/O7uzM3fu53fuTETExz54lpM7c+bc73z3O/feWBUvRJUuY8Xn8z+85YYInRBBLYRH9+189BwfXstBy3Ow7tuohzZa0RqidBWWQmGanhWe0vkh5hDQe3R5R0KXoAQkpxicpkLQ6Jp3yyD9VzKBJewXYWMbeUVBzWdXKooJERoBaVHhIV0AOXbDmKU0MqWgQwYyIsQdfidKNyeRcZD0duFiFjSh5U0AOaZt4ZOhy8UGqWdAczpMSAWYhVQKnTJOpkJMiMt0MctEpIxL5xenW4WHBtZwkaB5moDGILtCl65uM1UoFiFB/HvJokeLTlCJV9DEZSxjWn2N/aUHMHx6FLuW7sDulX3Ys3gnnnKexnGcYMYKC5KxzJe6BUXLVJAGsYJP1AXCTeNbPOY+ii3nB7EV25i0iT4AK7BwXfUGvIAXcYq/BuychWgvTjNLVmmGsBehxoR5lHDX+Vsx8tsAxvR29PmWAZJfH7ZgyB3BLeXdmAqnmL+Wo2zsDhq73EGaKnQ7EYt4OOx+jJvs67HT6cfWyMKgtrAZ22HFfbiK6ZvjTRi+MISDK89gXp/h4kiRq9QqF9HKqFqmKHso3QRu++VuXBMNYad7LfrI7Gqb7u+CVd0BS9jSh2qDGDndj1n1GepFqzs9EZOAPTbBc2X75vp+lE7gB3yH4dUbMYkjmE6m8ZWao65z+D6bwZvJy3g8HMeX6ghW2ZqcBkmKljQC9qDIsM3GLOASt+Iq9k6N4cFz4ziHJZaLWEhhsTJvJpT8UxidGcOsf9L0021cQNaNkWxsG9GyyT8eN7JLkTU1vX9iv/lYYyzb2H5Cv2EOKj5dmsG79aMkUONaWUi1zUYRo4bchpxgo0o+ZRyYOGA+BGTWJvsuM1OCZgLI554fs7DGE6WDeCs6zOAf9Cr8LD/UPHqcoGIybOKR2XG88+sHhOJMaqJ7iqAtCt/GOqMOGXW0oAOHwi/Q/9M2Zv5JmCX46cUc0PSGgN94R7Hj5O1UcZFYrCZatBXntvjW5C/gtsoLZfxWIfyeE3vxyuXXqUSdeXJ2CWhuiWQFb6y9hpfaE1SxzEAHSUtuFnkUUTxCMVMeJUbQgDC/8xgMTN7MYhLOLzlL9CgFZ3DP5/vwvvs2Pwr10IgvE82FmOR7TMDkcsqnSreAkeP34eHlZ/kmlQhY5+T3nEl8Uj5EsDLf1ukdeoQoZpJ0WBCIKYPgG6i6tLzO8gFGj91L/p5EYTW5/ofmnsSP1WN8bcNOmkaNlvINgJGkIGhzzTa55wwl2KTmy3j+5+fw4dlXTdSKmHKJXXJlk0UiEtM8zdVqxjr55AKwyRzPcKQgPBoJr+z1bJmLaFL7sybHSswNuGASdaGZYpMzTgp1sV3Nxs7MRCX85VgwJpe2JmiWOZzGq4zG24ZHjzpkpgM0GUxH/m0SFOFJVx4FTMLGEv7yJuX/pK6EFehXDFDrHPH/Dgj8BbLsDrYrBlhtAAAAAElFTkSuQmCC")


#红色状态运行程序
while(True):
    #识别屏幕
    img = pyautogui.screenshot()
    img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2RGBA)
    
    #模板匹配输出位置
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    templateImg = cv2.cvtColor(templateImg, cv2.COLOR_BGR2RGB)
    res = cv2.matchTemplate(img,templateImg,cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    left_top = max_loc
    print(left_top)    
    
#     time.sleep(2)
#     h, w = templateImg.shape[:2]
#     top_left = max_loc
#     bottom_right = (top_left[0] + w, top_left[1] + h)
#     cv2.rectangle(img, top_left, bottom_right, (255, 0, 0), 5)
#     img = cv2.resize(img,(0,0),fx=0.8, fy=0.8)
#     cv2.imshow('11111', img)
#     cv2.waitKey(0)
#     cv2.destroyAllWindows()
    
#     print(left_top[0] > 1600,left_top[0] < 1620,left_top[1] < 300)
    #识别到绿色状态
    if left_top[0] > 1600 and left_top[0] < 1620 and left_top[1] < 300:
        print("绿色状态")

        pyautogui.moveTo(1500,100, duration=0.5)
        pyautogui.click()
        pyautogui.moveTo(1740,405, duration=0.5)
        pyautogui.click()
        time.sleep(3)
        
        while(True):
            #识别屏幕
            img = pyautogui.screenshot()
            img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2RGBA)
            #模板匹配输出位置
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            templateImg = cv2.cvtColor(templateImg, cv2.COLOR_BGR2RGB)
            res = cv2.matchTemplate(img,templateImg,cv2.TM_CCOEFF_NORMED)
            min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
            left_top = max_loc

            if left_top[0] > 1600 and left_top[0] < 1620 and left_top[1] < 300:
                pass
#                 print("绿色状态again")
            else:#等待检测到红色状态
#                 print("绿色跳转->红色")
                break        
     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/570428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【行为型模式】模板方法模式

一、模板方法模式概述 模板方法模式定义&#xff1a;在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。(类对象型模式) 模板方法中的基本方法是实现算法的各个步骤&#xff0c;是模板方法的…

谷歌搜索SEO优化需要做什么?

最基本的要求&#xff0c;网站基础要优化好&#xff0c;让你的网站更加友好地服务于用户和搜索引擎&#xff0c;首先你要保证你的网站也适配手机端&#xff0c;现在手机端&#xff0c;如果你的网站在手机上打开慢&#xff0c;或者没有适配手机端&#xff0c;让用户用手机看着电…

Echarts X轴类目名太长时隐藏显示全部

echarts图表X轴 在柱状图中,X轴类目名如果数据太长; echarts会默认进行隐藏部分字段; 如果我们想让每一个类目名都显示出来,需要进行额外的处理X轴类目名太长时,默认只显示一部分类目名 <!DOCTYPE html> <html lang="en"> <head><meta ch…

硬实力!神工坊团队在首届开放原子开源大赛中斩获一二等奖

日前&#xff0c;首届开放原子开源大赛苏州站在苏州工业园区顺利开赛&#xff0c;神工坊团队在“大规模非对称不定带宽线性代数方程组求解算法赛”中表现非凡&#xff0c;斩获一二等奖&#xff01; “大规模非对称不定带宽线性代数方程组求解算法赛”是“开放原子开源大赛”工业…

画机柜布置图就这么简单,你学会了吗?

你还在使用excel画机柜布置图&#xff1f; 你还在使用CAD画机柜布置图&#xff1f; 你还在使用Visio画机柜布置图&#xff1f; 我们今天都在使用nVisual画机柜布置图&#xff01; 第一步&#xff1a;登录注册cloud.nVisual.com云平台&#xff0c;免费使用Visual&#xff1b; 第…

C语言趣味代码(三)

这一篇主要围绕写一个程序---寻找数字 来写&#xff0c;在这篇我会详细和大家介绍基本实现以及它的改良版&#xff0c;还有相关知识的拓展&#xff0c;干货绝对满满。 1. 寻找数字 在这一主题下&#xff0c;我们会编写一些代码&#xff0c;来锻炼玩家的反应力&#xff0c;同时…

第6章 Mybatis高级查询(详解篇)

@[TOC](第6章 Mybatis高级查询(详解篇)) 1. 一对一映射 1.1 自动映射(关联的嵌套结果映射) <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd…

【总结】hbase master重启恢复失败问题修复

问题现象 最近hbase master 莫名其妙宕机了&#xff0c;查看最后输出日志&#xff0c;也没有发现有效信息。 于是想着先重启一把&#xff0c;在hbase master 选主成active状态的过程中&#xff0c;发现重启多次都很漫长&#xff0c;且最终因重启时间过长&#xff0c;被hbase-…

【NMPA-国家药品监督管理局】

NMPA-国家药品监督管理局 ■ NMPA简介■ (1) 监管逻辑■ 1.1&#xff09;注册检验■ 1.2&#xff09;临床试验■ 1.3&#xff09;体系考核■ 1.4&#xff09;专家评审■ 1.5&#xff09;飞行检查 ■ (2) 上市流程■ 2.1&#xff09;注册申请&#xff1a;■ 2.2&#xff09;注册…

水滴式粉碎机:高效、精细破碎利器

水滴式粉碎机是一种适用于多种物料的粉碎设备。它能够处理硬质物料如石头、陶瓷、玻璃等&#xff0c;也能粉碎食品和饲料原料如大米、小麦、玉米等。此外&#xff0c;水滴式粉碎机还适用于秸秆、木材等物料的粉碎。部分水滴式粉碎机还具备粗粉碎和细粉碎两种功能&#xff0c;可…

重发布实验:

要求&#xff1a; 配置&#xff1a; 配置IP地址&#xff1a; Ar1&#xff1a; [a1]int g 0/0/0 [a1-GigabitEthernet0/0/0]ip add 100.1.1.1 24 [a1-GigabitEthernet0/0/0]int l 0 [a1-LoopBack0]ip add 192.168.0.1 32 [a1-LoopBack0]int l1 [a1-LoopBack1]ip add 192…

k8s 报错:x509: certificate has expired or is not yet valid

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 获取方式: 关注公众号并回复 666 领取,更多内容持续奉…

Java正则表达式 提取文本中所有的匹配数据

前言 在Java编程中&#xff0c;有时我们需要从字符串中找出符合某种规则的字符串。这时候&#xff0c;我们可以使用正则表达式来进行模式匹配。正则表达式是一种强大的文本匹配工具&#xff0c;它可以用来匹配复杂的字符串模式。 正则表达式的基础 正则表达式是一种通过字符…

Skill Check: OCI Generative AI Service Deep Dive

Skill Check: OCI Generative AI Service Deep Dive

dial tcp 192.168.0.190:443: connect: connection refused

1、场景 用nerdctl登录镜像仓库192.168.0.190&#xff08;Harbor&#xff09;&#xff0c;报错 ERRO[0006] failed to call tryLoginWithRegHost error"failed to call rh.Client.Do: Get \"https://192.168.0.190/v2/\": dial tcp 192.168.0.190:…

fakak详解(2)

Kafka和Flume整合 Kafka与flume整合流程 Kafka整合flume流程图 flume主要是做日志数据(离线或实时)地采集。 图-21 数据处理 图-21显示的是flume采集完毕数据之后&#xff0c;进行的离线处理和实时处理两条业务线&#xff0c;现在再来学习flume和kafka的整合处理。 配置fl…

04.JAVAEE之线程2

1.线程的状态 1.1 观察线程的所有状态 线程的状态是一个枚举类型 Thread.State public class ThreadState {public static void main(String[] args) {for (Thread.State state : Thread.State.values()) {System.out.println(state);}} } NEW:Thread 对象已经有了.start 方…

AI大模型日报#0424:全球首个AI基因编辑器、出门问问上市、微软开源Phi-3 Mini、昆仑万维年收49亿

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 爱诗科技完成A2轮超亿元融资&#xff0c;蚂蚁集团领投摘要: 爱诗科技完成A2轮超亿元融资&#xff0c;成为视频大模型领域融资规模最…

MySQL中的死锁预防和解决

MySQL中的死锁预防和解决 死锁是数据库管理系统中常见的问题&#xff0c;特别是在高并发的应用场景下。MySQL数据库中的死锁会导致事务处理速度减慢&#xff0c;甚至完全停止&#xff0c;因此理解并预防死锁至关重要。本文将详细介绍如何预防MySQL中的死锁&#xff0c;包括常用…

山海鲸电力看板:运维数据一目了然

在信息化高速发展的今天&#xff0c;电力行业的运维管理也迎来了前所未有的变革。山海鲸可视化智慧电力运维可视化看板&#xff0c;以其独特的数据整合能力和直观的可视化效果&#xff0c;成为了电力行业运维管理的得力助手&#xff0c;为电力的稳定运行提供了强大的技术支撑。…
最新文章