基于录制回放的白板效果自动化对比技术

背景

白板是教育产品里的常见功能,类似于电子化的黑板,基础的业务逻辑是教师端(windows)老师在白板上写字或者画图,学生端(android)可以同步接收到该内容。

现在有两套基于不同技术的白板功能方案,需要对比他们的效果差异,由于底层代码无法放开,无法通过修改代码埋点的形式进行,因此需要通过ui层面进行对比。

基础测试流程

  1. 在pc教师端运行一次画图脚本,在Android学生端确认正确后,选取该图案作为基准图片
  2. 在pc教师端进行ui操作,在白板上再次画出该图案
  3. 在android学生端上,截取白板画面
  4. 对比截取的白板画面和基准图片,计算相似度,大于阈值(95%)则视为该次准确,否则认为该次失败,计入失败次数,并记录该失败图案供分析
  5. 清空pc教师端白板图案,再次重复2~4操作

自动化技术

airtest(pywinauto)& pynput完成对pc端ui操作

在pc端ui自动化中,首先选用的是比较经典的ui操作库pywinauto,airtest对其进行了封装,为减少二次开发量,这里直接选用了airtest。

基础的ui操作如元素定位、点击、滑动等,airtest都有较为成熟的api,但模拟老师在白板上画图,只靠自己定义滑动坐标使用鼠标事件执行的话,太过生硬不符合实际情形,因此,最后决定采用实际录制操作坐标再回放的形式进行,这样基本可以模拟真实的笔迹。

airtest不具备录制鼠标轨迹功能,在调研后,选用pynput进行鼠标事件的录制。

pynput也是一个提供windows操作api的库,但其提供了对鼠标和键盘事件的监听功能;通过添加监听线程pynput.mouse.Listener,每发生一个鼠标事件,就使用预先定义的格式进行本地化存储,这样就完成了鼠标操作的事件收集;再通过解析存储的事件文本,就可以完成鼠标事件的回放。

需要说明的是,pynput本身也有操作windows鼠标事件的api,但实测下来,虽然通过pynput进行回放整体轨迹是对的,但在白板上的笔画平滑度和粗细每次都不太一致,因此不适合选用其作为回放手段,最终测试,还是通过airtest的mouse_move、mouse_up、mouse_down组合进行回放,效率较pynput低,但胜在一致性高,基本每次回放的轨迹都一致。

opencv2进行图像识别判断

在进行教师端的操作后,需要在学生端截图并进行对比,这里对比技术采用了opencv2的api,代码如下:

def img_similarity(img1_path,img2_path):
    """
    :param img1_path: 图片1路径
    :param img2_path: 图片2路径
    :return: 图片相似度
    """
    try:
        # 读取图片
        img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
        img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)

        # 初始化ORB检测器
        orb = cv2.ORB_create()
        kp1, des1 = orb.detectAndCompute(img1, None)
        kp2, des2 = orb.detectAndCompute(img2, None)

        # 提取并计算特征点
        bf = cv2.BFMatcher(cv2.NORM_HAMMING)

        # knn筛选结果
        matches = bf.knnMatch(des1, trainDescriptors=des2, k=2)

        # 查看最大匹配点数目
        good = [m for (m, n) in matches if m.distance < 0.75 * n.distance]
        #print(len(good))
        #print(len(matches))
        similary = len(good) / len(matches)
        #print("两张图片相似度为:%s" % similary)
        return similary

    except:
        print('无法计算两张图片相似度')
        return 0

由于其中一个方案学生端界面上会有动态的时间显示,影响对比结果,因此,需要对该截图进行裁剪,只保留白板的内容部分,裁剪代码如下:

        screen_path =  "D:\PycharmProjects\omoboard\{filename}".format(filename=screen)
        img = cv2.imread(screen_path)
        cropped = img[100:1050, 0:1500]
        cv2.imwrite(screen_path, cropped)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容