Python+selenium图像识别:特征匹配方式

博客介绍了通过图像识别比对两张信用卡图片差异并标记的思路。将此思路应用于UI自动化测试,在测试流程中加入录制基础图片环节,对比不同版本图片,若一致则测试通过,有差异可能是bug或需求改动,能让检测结果更准确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

两张信用卡的图片,左图有芯片和几个字母,右图没有。通过图像识别,两张图做比对,找出了差异,并把差异都标记了出来,这样看图片差异,是不是就一目了然了

根据上面的思路,需要两张图,一个是用来做对比的基础图片(Base),一个是拿来跟基础图片比较的图片(Compare)

所以,在UI自动化测试的流程中,加入一个录制基础图片的过程,比如上周的版本,我们跑自动化测试用例,录制了基础图片,这周发版本,我们跑自动化测试用例后,把这个版本的图片跟上个版本的图片做比对,如果完全一致,那说明测试通过,如果有差异,要么是bug,要么是需求改动了UI。这样做的好处是:一般自动化测试工程师不能像功能测试工程那样,完全关心到每个版本的需求变动,这样检测出来的结果最为正确。

import imutils
from skimage.measure import compare_ssim
import cv2
import numpy as np


class MarkDiffImg:
    @staticmethod
    def cv_imread(file_path):
        """
        读取图片(解决路径中含有中文无法读取的问题),一般是直接cv2.imread(filea_path)
        :param file_path:图片的路径
        :return:
        """
        cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), -1)
        return cv_img

    def mark_diff_img(self, result, basesnapshot_png, runningsnapshot_png, DiffSnapshot_Dir, casename, name):
        """
        对比图片并标出差异,保存差异图片
        :param basesnapshot_png:
        :param runningsnapshot_png:
        :param DiffSnapshot_Dir:
        :param casename:
        :param name:
        :return:
        """
        # 加载两张图片并将他们转换为灰度:
        image_a = self.cv_imread(basesnapshot_png)
        image_b = self.cv_imread(runningsnapshot_png)
        gray_a = cv2.cvtColor(image_a, cv2.COLOR_BGR2GRAY)
        gray_b = cv2.cvtColor(image_b, cv2.COLOR_BGR2GRAY)

        # 计算两个灰度图像之间的结构相似度指数:
        (score, diff) = compare_ssim(gray_a, gray_b, full=True)
        diff = (diff * 255).astype("uint8")
        print("SSIM:{}".format(score))

        # 找到不同点的轮廓以致于我们可以在被标识为“不同”的区域周围放置矩形:
        thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
        cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cnts = imutils.grab_contours(cnts)

        # 找到一系列区域,在区域周围放置矩形:
        for c in cnts:
            x, y, w, h = cv2.boundingRect(c)
            cv2.rectangle(image_a, (x, y), (x + w, y + h), (255, 0, 0), 2)
            cv2.rectangle(image_b, (x, y), (x + w, y + h), (255, 0, 0), 2)

        # 基础快照标出与运行时快照的差异 图片
        diffsnapshot_png_a = DiffSnapshot_Dir + casename + '/' + name + '_base.png'
        # 运行时快照标出与基础快照的差异 图片
        diffsnapshot_png_b = DiffSnapshot_Dir + casename + '/' + name + '_running.png'
        # 保存差异图片
        cv2.imencode('.jpg', image_a)[1].tofile(diffsnapshot_png_a)
        cv2.imencode('.jpg', image_b)[1].tofile(diffsnapshot_png_b)
        result["对比快照-基础快照路径"] = diffsnapshot_png_a
        result["对比快照-运行时快照路径"] = diffsnapshot_png_b

        return result

转载自fengzx120

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值