托纳姆物语编程系列(2)——如何确定自己有多少蓝?

修改于2024/05/25535 浏览整活专区

软件包

pip install uiautodev
终端输入 uiauto.dev弹出如下网页就ok了
TapTap
点击目标设备连接,成功后就可以看到手机画面了,这个软件包用来捕捉手机帮助我们取色点
TapTap
选中画板然后用鼠标点击你想取色点的位置就可以了
TapTap
准备一张包含蓝量的图片,我们将对这张图片进行处理
TapTap
这里用的HSV和我们常用的RGB三元色一样都是用来描述颜色,给定范围进行二值化(需要的变成白色,不要的全黑)
TapTap
lowerColor和upperColor用的是HSV(和H S B一个意思),具体如下
TapTap
可以看到通过轮廓处理,我们已经能吧蓝色准确框选出来了
TapTap
绿色同理,我们就可以计算出蓝量了
TapTap
但如果只是这样可能会出现一些问题,比如
TapTap
可以看到绿色是未满一格的但是他会把他认为是一格所以得到了12,我们可以通过计算轮廓面积来解决这个问题
TapTap
再稍微整理一下,做出一个函数在循环里一直调用输出,效果如下
代码贴在后面,写的比较乱主要是起到一个抛砖引玉的作用
horizontal linehorizontal line
#导入软件包
import cv2 as cv
import numpy as np
import uiautomator2 as u2
def getBule(img):
    HSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)  #转换图像为HSV格式
    #设置颜色阈值
    lowerColor = np.array([48, 100, 200])  #取范围最低值
    upperColor = np.array([55, 220, 255])  #取范围最高值
    #提取指定部分(指定区域变白,其他变黑)
    binary = cv.inRange(HSV, lowerColor, upperColor)
    # 运用中值滤波去除噪声
    median = cv.medianBlur(binary, 9)
    #这里使用轮廓检测cv2.findContours()的方法,并且返回contours轮廓信息,以及hierachy层级(这里用不到)。
    contours, hierachy = cv.findContours(median, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
    BlueAmount = 10 + len(contours)  # 绿色一格等于两格
    if len(contours) != 0:
        contours = sorted(contours, key=cv.contourArea)
        if cv.contourArea(contours[0], oriented=False) < 91:
            BlueAmount -= 1
    else:
        lowerColor = np.array([80, 220, 220])  # 取范围最低值
        upperColor = np.array([90, 240, 255])  # 取范围最高值
        binary = cv.inRange(HSV, lowerColor, upperColor)
        median = cv.medianBlur(binary, 9)
        contours, hierachy = cv.findContours(median, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
        BlueAmount = len(contours)
        if len(contours) != 0:
            contours = sorted(contours, key=cv.contourArea)
            if cv.contourArea(contours[0], oriented=False) < 71:
                BlueAmount -= 1
    return BlueAmount
if __name__ == "__main__":
    d = u2.connect()
    print(d.info)
    while True:
        print(getBule(d.screenshot(format='opencv')))
horizontal linehorizontal line
测试一下发现还是有很多问题,可以限制一下识别范围,蓝条就在固定的位置,然后把阀值范围拉大,应该可以识别的更加准确
16
8
16