python+opencv判断开关或按钮的状态

Source

python+opencv判断开关或按钮的状态

前言:
前期我们说过移动端定位问题(使用adb 坐标,使用uiautomator2,opencv获取坐标的方法)今天我们讲一下关于判断一个开关或者按键的状态。做个移动端的都会多少遇到开关或者按键无法判断状态的情况。

opencv真的是一个非常强大的模块,大家可以多学一下,大佬请忽略

1 . 第一步安装opencv,大家自行安装
2. 第二步导入opencv
improt cv2
3.学习过opencv的同学应该知道其中有一个获取像素值的方法,今天我们就用到这个方法来判断某个地点的状态
4.既然使用像素值来判断某个点像素的状态,那么我们就应该提前知道该点的坐标,x,y和像素值,我们写一个人机交互来获取 x,y和像素值。
5.opencv的鼠标交互操作主要通过两个函数实现:

  • 第一个是cv2.setMouseCallback(windowName, onmouse [param]),第一个参数windowName是窗口名
  • 第二个是cv2.setMouseCallback()的第二个参数,称为鼠标回调函数onmouse(event, x, y, flags, param)

cv2.setMouseCallback(windowName, onMouse [param])

参数说明:

windowName:必需。opencv具体操作哪个窗口以窗口名作为识别标识,不要使用中文命名,会出乱码。
onMouse:必需。鼠标回调函数。鼠标回调函数的定义是onMouse(event, x, y, flags, param),鼠标操作就在这个函数中
param:可选。请注意到onMouse里面也有一个param参数,它与是setMouseCallback里的param是同一个,更直白一点说,这个param是onMouse和setMouseCallback之间的参数通信接口。

鼠标回调函数:onMouse(event, x, y, flags, param)

这个参数列表不要改变它,除了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)

运行结果如下:
在这里插入图片描述
同学们都看到这里了,给关注白,后续更新不迷路!