UiAutomator [求助帖] UI 自动化图像识别,opencv 模板匹配对图片格式有什么要求?

luobs · 2020年06月05日 · 最后由 luobs 回复于 2020年06月08日 · 3128 次阅读

问题是这样的,在 opencv 的发方法中用 matchTemplate 做模板匹配,发现一个奇怪的问题,在网上下在的图片和电脑本身截图的图片是可以精准匹配的,但使用 uiautomator 截屏 devices.screenshot 生成的图片却无法匹配出来,这两者有啥区别?
按理说前者是 jpg,screenshot 保存的是 png,但改了后缀名也没用。有没有遇到的,求解☺

#原图
src_image = "../saveimages/msi.jpg"
#模板
template_image = "../tmp/z11.png"
src = cv2.imread(src_image)  # Load the src image
template = cv2.imread(template_image)  # Load the src image
# 获取模板图片的高和宽
h, w = template.shape[:2]
# 获取大图片的高和宽
srch, srcw = src.shape[:2]
result = cv2.matchTemplate(src, template, cv2.TM_SQDIFF_NORMED)  # comparision
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
print('val', min_val, max_val)
if min_val <= 0.3:
    left_top = min_loc  # 左上角
    # print(left_top)
    bottom = (int(left_top[0] + w), int(left_top[1] + h))
    cv2.rectangle(src, left_top, bottom, (0, 0, 225), 3)  # 画出矩形位置
    # 显示结果,并将匹配值显示在标题栏上
    plt.subplot(1, 1, 1), plt.imshow(src), plt.title('Input'), plt.xticks([]), plt.yticks([])
    plt.show()
    cv2.imwrite("singefile.png", src)
    cv2.waitKey()
    cv2.destroyAllWindows()
    # #找中心位置
    right_bottom = (int(left_top[0] + w / 2),int(left_top[1] + h / 2))
    print(right_bottom)
共收到 1 条回复 时间 点赞

找到问题了,需要对原图做下压缩处理,需要注意的是原图格式需要限制为 RGB 三通道,而且压缩至太少不行,压太多会损坏图片。

"""
该表图片分辨率大小压缩图片,无限定图片格式
:param : image_path压缩源文件
:param outfile: 压缩文件保存地址
:param mb: 压缩目标,KB
:param step: 每次调整的压缩比率
"""
image_size = get_size(image_path)
dirname , suffix = os.path.splitext(image_path)
out_image = dirname + '-zip.png'
if image_size <= mb:
    return image_path
im = Image.open(image_path)
image_w, image_h = im.size
piexl_size = image_w, image_h
while image_size > mb:
    image_w, image_h = int(image_w *step),int(image_h*step)
    piexl_size = image_w, image_h
    im.thumbnail(piexl_size, Image.ANTIALIAS)
    im.save(out_image,'jpeg')
    image_size = get_size(out_image)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册