前言:
前期我们说过移动端定位问题(使用adb 坐标,使用uiautomator2,opencv获取坐标的方法)今天我们讲一下关于判断一个开关或者按键的状态。做个移动端的都会多少遇到开关或者按键无法判断状态的情况。
opencv真的是一个非常强大的模块,大家可以多学一下,大佬请忽略
1 . 第一步安装opencv,大家自行安装
2. 第二步导入opencv
improt cv2
3.学习过opencv的同学应该知道其中有一个获取像素值的方法,今天我们就用到这个方法来判断某个地点的状态
4.既然使用像素值来判断某个点像素的状态,那么我们就应该提前知道该点的坐标,x,y和像素值,我们写一个人机交互来获取 x,y和像素值。
5.opencv的鼠标交互操作主要通过两个函数实现:
参数说明:
windowName:必需。opencv具体操作哪个窗口以窗口名作为识别标识,不要使用中文命名,会出乱码。
onMouse:必需。鼠标回调函数。鼠标回调函数的定义是onMouse(event, x, y, flags, param),鼠标操作就在这个函数中
param:可选。请注意到onMouse里面也有一个param参数,它与是setMouseCallback里的param是同一个,更直白一点说,这个param是onMouse和setMouseCallback之间的参数通信接口。
这个参数列表不要改变它,除了param外其他都是由回调函数自动获取值。
参数说明:
event:由回调函数根据鼠标对图像的操作自动获得,内容包含左键点击,左键弹起,右键点击…等等等非常多的操作。
x,y:由回调函数自动获得,记录了鼠标当前位置的坐标,坐标以图像左上角为原点(0, 0),x方向向右为正,y方向向下为正。
flags:记录了一些专门的操作
param:从setMouseCallback()里传递过来的参数。该参数在setMouseCallback()处是可选参数,所以可以不设置。
import cv2
img = "C:\\Users\\Desktop\\tools\\79.png"
def onmouse(event, x, y, flags, param): # 标准鼠标交互函数
if event == cv2.EVENT_MOUSEMOVE: # 当鼠标移动时
imgs = cv2.imread(img, 0)
print(x, y, imgs[y, x]) # 显示鼠标所在像素坐标和数值,注意像素表示方法和坐标位置的不同
def win_name(img):
cv2.namedWindow("img", 0) # 构建窗口
cv2.resizeWindow("img", 640, 480)
cv2.setMouseCallback("img", onmouse) # 回调绑定窗口
imgs = cv2.imread(img, 0)
while True: # 无限循环
cv2.imshow("img", imgs) # 显示图像
if cv2.waitKey() == ord('q'):
break # 按下‘q'键,退出
cv2.destroyAllWindows() # 关闭窗口
if __name__ == '__main__':
win_name(img = "C:\\Users\\Desktop\\tools\\9.png")
我们运行此段代码,会在电脑上打开一个窗口显示我们要使用的图片,通过移动鼠标我们即可获取某个点的坐标和像素值了
我们得到某点的坐标和像素值,那么我们就可以根据像素值来判断这个按钮或者其他的状态了
在opencv中0是黑色/无颜色,255表示白色,计算机视觉中图片也是一堆数字组成的。我们就是利用这些数字来做判断。
import cv2
def check_button(path, picture, bounds,pixel_value):
"""
用来检查某个选项
:param path: image 待检查界面
:param picture: image 待检查界面
:param bounds: bounds 需要检查的坐标
:param pixel_value 需要检查的像素值
:return: str 返回检查结果 OPEN 或 CLOSE
"""
result = "error"
try:
image = cv2.imread(path + '/' + picture) # 读取图片
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转为灰度图
if image[int(bounds[1]), int(bounds[0])] > pixel_value: # img[y,x]与坐标[x,y]相反,注意
print(bounds[1], bounds[0], "open")
result = "opened"
else:
print(bounds[1], bounds[0], "close")
result = "closed"
except Exception as e:
print(e)
finally:
return result
if __name__ == '__main__':
check_button(path="C:\\Users\\zhenhua.zhang1.o\\Desktop\\tools", picture="79.png", bounds=[89, 45],pixel_value =80)