前言
MYScrcpy Github / Gitee
说实话,做这个插件一开始我是拒绝的😬,奈何的确是撞枪口上了!MYScrcpy主打的就是一个视频采集、手机自动化控制。本文主要讲讲思路,顺便巩固一下MYScrcpy插件开发知识。
注意
插件用于功能测试及教学目的,切勿违法违规使用!
效果
算式运算
算式运算
小猿口算 分数运算
我们开始吧
总体思路
目前大部分童鞋,主要是在比大小上发力。个别优秀的,直接抓包解析,也算是玩到家门口了。鉴于此,本文主要讲讲如何解混合运算、约分、分数计算等题型。
- 获取题目信息
- 图像OCR识别
- dump_hierarchy
- 解题
- 绘制答案
获取题目信息
截图及图像识别方式
- 截图笔者采用的是
uiautomator2.screenshot()
,相较ADB,速度能快一些。
img = self.device.u2d.screenshot()
- 图像识别有很多办法,很多童鞋也发了一些思路及教程,我这里不过多赘述。
笔者采用的是 DdddOcr 识别。
较Opencv及pytesseract,个人感觉准确率更高,且更方便。
def get_numbers(self, img_left: Image.Image, img_right: Image.Image) -> Tuple[int, int]:
"""
获取数字
:return:
"""
return self.ocr.classification(img_left), self.ocr.classification(img_right)
def get_images(self):
"""
获取图像
:return:
"""
# 截屏
img = self.device.u2d.screenshot()
img_coord = Coordinate(img.width, img.height)
# 截图
left_tl = img_coord.to_point(ScalePoint(.19, .24))
left_br = img_coord.to_point(ScalePoint(.4, .31))
right_tl = img_coord.to_point(ScalePoint(.6, .24))
right_br = img_coord.to_point(ScalePoint(.82, .3))
left = img.crop([
left_tl.x, left_tl.y,
left_br.x, left_br.y,
])
right = img.crop([
right_tl.x, right_tl.y,
right_br.x, right_br.y,
])
return self.process(left), self.process(right)
def process(image: Image.Image) -> np.ndarray:
"""
图像清晰化处理
:param image:
:return:
"""
cont = cv2.convertScaleAbs(
cv2.cvtColor(np.array(image), cv2.COLOR_RGB2GRAY),
alpha=2, beta=0
)
return cv2.threshold(
cv2.GaussianBlur(cont, (5, 5), 0),
0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU
)[1]
dump_hierarchy方式
图像识别存在一定的识别错误的情况,笔者后采用uiautomator2.dump_hierarchy()
获取题目,准确性高。
通过
uiautomator2.dump_hierarchy()
方法,获取当前页面的 ui hierarchy 信息。进行元素查找。
可以自行解析,也可以使用 uiautomator2的定位器 定位器说明
# 获取问题公式
formulas = self.get_formulas(self.device.u2d.dump_hierarchy(pretty=True).split('\n'))
@staticmethod