托纳姆物语编程系列(2)——如何确定自己有多少蓝?
修改于2024/05/25535 浏览整活专区
软件包
pip install uiautodev
终端输入 uiauto.dev弹出如下网页就ok了

点击目标设备连接,成功后就可以看到手机画面了,这个软件包用来捕捉手机帮助我们取色点

选中画板然后用鼠标点击你想取色点的位置就可以了

准备一张包含蓝量的图片,我们将对这张图片进行处理

这里用的HSV和我们常用的RGB三元色一样都是用来描述颜色,给定范围进行二值化(需要的变成白色,不要的全黑)

lowerColor和upperColor用的是HSV(和H S B一个意思),具体如下

可以看到通过轮廓处理,我们已经能吧蓝色准确框选出来了

绿色同理,我们就可以计算出蓝量了

但如果只是这样可能会出现一些问题,比如

可以看到绿色是未满一格的但是他会把他认为是一格所以得到了12,我们可以通过计算轮廓面积来解决这个问题

再稍微整理一下,做出一个函数在循环里一直调用输出,效果如下
代码贴在后面,写的比较乱主要是起到一个抛砖引玉的作用


#导入软件包
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')))


测试一下发现还是有很多问题,可以限制一下识别范围,蓝条就在固定的位置,然后把阀值范围拉大,应该可以识别的更加准确