UI自动化的断言方式-图片比对

import numpy as np
import cv2 as cv
from decimal import Decimal, getcontext

def image_comparison(local_img_path, screenshot_img_path):
    # 真实截图
    screenshot_img = cv.imread(screenshot_img_path)
    # 读取本地图片,作为预期图片
    local_img = cv.imread(local_img_path)

    # 确保两张图片的尺寸和颜色空间一致
    if local_img.shape != screenshot_img.shape:
        raise ValueError("两张图片尺寸或颜色空间不一致,无法比较")

    # 将图片转换为灰度图进行比较
    local_img_gray = cv.cvtColor(local_img, cv.COLOR_BGR2GRAY)
    screenshot_img_gray = cv.cvtColor(screenshot_img, cv.COLOR_BGR2GRAY)

    # 缩放图片以计算相似度 原尺寸是1280*720 缩小尺寸可以减少计算量提高处理速度
    resized_local_img = cv.resize(local_img_gray, (250, 250))
    resized_screenshot_img = cv.resize(screenshot_img_gray, (250, 250))

    # 计算两张图片的相似度
    similarity = cv.matchTemplate(resized_local_img, resized_screenshot_img, cv.TM_CCOEFF_NORMED)
    value = np.max(similarity)
    # 设置小数点后的精度 全局设置
    getcontext().prec = 7  # 包括整数部分在内的总位数,即保留6位小数
    # 转换为 Decimal,并进行运算
    value = Decimal(float(value))  # 先转换为float类型,否则会报错
    value = value.quantize(Decimal('0.000001'))
    print(value)

    # 计算原始尺寸图片的差异
    difference = cv.absdiff(local_img_gray, screenshot_img_gray)
    _, threshold = cv.threshold(difference, 30, 255, cv.THRESH_BINARY)
    # 使用膨胀操作扩大差异区域
    kernel = np.ones((5, 5), np.uint8)
    dilated = cv.dilate(threshold, kernel, iterations=1)

    # 在原图上标记差异
    contours, _ = cv.findContours(dilated, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        (x, y, w, h) = cv.boundingRect(contour)
        cv.rectangle(local_img, (x, y), (x + w, y + h), (0, 0, 255), 2)

    cv.imshow('Diff', local_img)
    cv.waitKey(0)
    cv.destroyAllWindows()

OpenCV常用的函数 

import cv2
import numpy as np
from PIL import Image
from io import BytesIO
from decimal import Decimal, getcontext

def image_opencv(image1_path):
    #读取图片
    img = cv2.imread(image1_path)
    # 获取模板图像的宽度和高度
    w, h = img.shape[1], img.shape[0]
    #缩放
    resized_image = cv2.resize(img, (250, 250))
    #旋转
    flipped = cv2.flip(img, -1)  # 1表示水平翻转 0表示垂直翻转 -1表示水平垂直翻转
    # 计算两张图片的相似度
    similarity = cv2.matchTemplate(img, img, cv2.TM_CCOEFF_NORMED)
    value = np.max(similarity)

    # 将 OpenCV 图像转换为字节流--再将字节流转换为图片
    _, buffer = cv2.imencode('.png', img)
    image_bytes = np.array(buffer).tobytes()
    img = np.array(Image.open(BytesIO(image_bytes)))
    #颜色空间转换
    #将图像从 BGR 转换为 RGB 颜色空间
    rgb_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    #灰度图 忽略颜色信息 减少计算量
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    #给图片上绘制矩形
    cv2.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
    #给图片中添加文本
    cv2.putText(img, 'Hello', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
    #模糊
    blurred = cv2.blur(img, (5, 5))
    #边缘检测
    edges = cv2.Canny(gray, 50, 150)

    cv2.imshow('Image', img)
    # cv2.imshow('Image', rgb_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    #将修改后的图片保存到本地
    cv2.imwrite('output.jpg', img)

背景:在进行ui自动化测试时,因为所有的操作是在canvals画布内的操作,页面内没有dom元素可以进行断言,只能通过预期图片和实际操作图片比对的方式进行断言;所以在本地执行时先将预期图片保存下来,正式执行时将执行完成后的结果和预期图片进行比对,比对有差异的地方被标记出来,并计算相似度相似度最大1.0 ,如下相似度是0.949626的对比图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值