• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

使用python自动化对比视频图片是否相同

武飞扬头像
江云的博客
帮助7

背景
谁掌握了视频,谁就掌握了流量,谁掌握了流量,谁就掌握了金钱。在我们IT行业的很多部门都有涉及到视频,包括视频的制作,图片转视频,视频转图片等等。而我就有一部分工作就是测试合成视频这款工具的功能,其中有50多款视频合成模板,版本测试期间这款工具都是正常的,但是难免之后会出故障,所以平时也需要进行回归测试,如果手动进行回归,将是一个很大的工作量,所以自动化回归视频测试判断就孕育而生了。

简介
主思想是:从视频中抽取部分帧进行对比,如果每一帧都一样,那么我们就可以认为这两个视频是一样的。在我的业务中就是合成的视频和标准的视频一样,那么就是我们的工具没有问题。

核心技术
视频抽帧
图片对比(有两种方式)

一、视频抽帧 

下面的为每隔200帧则写一帧到我们的本地文件中,当所有视频帧都读取完成后success则变成False,然后读帧结束,帧的图片名为四位数,如:1000.jpg、1001.jpg,1002.jpg

  1.  
    '''视频抽帧'''
  2.  
    cap = cv2.VideoCapture('c:/1/1.mp4')
  3.  
    # 第几帧
  4.  
    frame_count = 1
  5.  
    # 隔着多少帧取一张
  6.  
    frame_rate = 200
  7.  
    success = True
  8.  
    # 计数
  9.  
    num = 0
  10.  
    while (success):
  11.  
    #cap.read()进行读,cv2.imwrite()进行写,当读结束时,success变成False
  12.  
    success, frame = cap.read()
  13.  
    if success == True:
  14.  
    if frame_count % frame_rate == 0:
  15.  
    cv2.imwrite('c:/2/' "d.jpg" % num, frame)
  16.  
    num = 1
  17.  
    frame_count = frame_count 1

二、图片对比 

方式一、使用math.sqrt就可对比两张图片,返回值是0.0则是图片一样,否则就是图片不一样
方式二、使用np.any(cv2.subtract(image1,imge2))就可对比两张图片,返回值是True则图片一样、
返回False就表示图片不一样

  1.  
    '''图片对比'''
  2.  
    #方式一
  3.  
    #使用对比两张图片的差值判断图片是否相同,值为0则相同,值越大则差异越大
  4.  
    image1 = Image.open(c:\2\1.jpg)
  5.  
    image2 = Image.open(c:\2\2.jpg)
  6.  
    histogram1 = image1.histogram()
  7.  
    histogram2 = image2.histogram()
  8.  
     
  9.  
    differ = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2,histogram1, histogram2)))/len(histogram1))
  10.  
    if differ>0 or differ<0:
  11.  
    print('两张图片不一样')
  12.  
    if differ==0:
  13.  
    print('两张图片一样')
  14.  
     
  15.  
    #方式二
  16.  
    #判断两张图片是否有差异,有差异则把差异的部分合成一张图片,用于观察差异的部分
  17.  
    image1 = cv2.imread(c:\2\1.jpg)
  18.  
    image2 = cv2.imread(c:\2\1.jpg)
  19.  
    difference = cv2.subtract(image1, image2)
  20.  
    result = not np.any(difference) # if difference is all zeros it will return False
  21.  
     
  22.  
    if result is True:
  23.  
    print('图片一样')
  24.  
    else:
  25.  
    cv2.imwrite("c:\difference\result.jpg", difference)
  26.  
    return False

三、具体代码

以下是我自己封装的代码,适合于自动对比和识别dect文件夹里和source文件夹里的视频的一致性,(注:dect文件夹里的视频和source文件夹的视频名字格式需要一样)

  1.  
    # coding=utf-8
  2.  
    import os
  3.  
    import shutil
  4.  
    import cv2
  5.  
    import cv2
  6.  
    import numpy as np
  7.  
    from PIL import Image
  8.  
    import math
  9.  
    import operator
  10.  
    from functools import reduce
  11.  
    '''此方法用于视频切割为图片,入参为切割的视频地址和输出的图片地址'''
  12.  
    def videoImage(dir_vieo,dir_image):
  13.  
    # mp4存放的路径
  14.  
    videos_src_path = dir_vieo
  15.  
    # 保存的路径,会在路径下创建mp4文件名的文件夹保存图片
  16.  
    videos_save_path = dir_image
  17.  
    #获取目标文件夹得视频列表,方便下面遍历
  18.  
    videos = os.listdir(videos_src_path)
  19.  
     
  20.  
    for each_video in videos:
  21.  
    print('Video Name :', each_video)
  22.  
    # get the name of each video, and make the directory to save frames
  23.  
    each_video_name, _ = each_video.split('.')
  24.  
    url = videos_save_path '/' each_video_name
  25.  
    if os.path.exists(url):
  26.  
    # image的文件夹作为临时存储容器,清空用于保持文件夹得简洁性
  27.  
    shutil.rmtree(url)
  28.  
    os.mkdir(url)
  29.  
    each_video_save_full_path = os.path.join(videos_save_path, each_video_name) '/'
  30.  
    # get the full path of each video, which will open the video tp extract frames
  31.  
    each_video_full_path = os.path.join(videos_src_path, each_video)
  32.  
    #cv2.VideoCapture()是用于从视频文件、图片序列、摄像头捕获视频并返回为cap对象
  33.  
    cap = cv2.VideoCapture(each_video_full_path)
  34.  
    # 第几帧
  35.  
    frame_count = 1
  36.  
    # 隔着多少帧取一张
  37.  
    frame_rate = 200
  38.  
    success = True
  39.  
    # 计数
  40.  
    num = 0
  41.  
    while (success):
  42.  
    #cap.read()进行读,cv2.imwrite()进行写,当读结束时,success变成False
  43.  
    success, frame = cap.read()
  44.  
    if success == True:
  45.  
    if frame_count % frame_rate == 0:
  46.  
    cv2.imwrite(each_video_save_full_path each_video_name "d.jpg" % num, frame)
  47.  
    num = 1
  48.  
    frame_count = frame_count 1
  49.  
    print('image numbers:', num)
  50.  
     
  51.  
    '''使用对比两张图片的差值判断图片是否相同,值为0则相同,值越大则差异越大'''
  52.  
    def compare(pic1,pic2):
  53.  
    '''
  54.  
    :param pic1: 图片1路径
  55.  
    :param pic2: 图片2路径
  56.  
    :return: 返回对比的结果
  57.  
    '''
  58.  
    if os.path.exists(pic1):
  59.  
    pass
  60.  
    else:
  61.  
    raise IOError(f'图片不存在,请您仔细观察路径是否填写错误{pic1}')
  62.  
    if os.path.exists(pic2):
  63.  
    pass
  64.  
    else:
  65.  
    raise IOError(f'图片不存在,请您仔细观察路径是否填写错误{pic2}')
  66.  
    image1 = Image.open(pic1)
  67.  
    image2 = Image.open(pic2)
  68.  
    histogram1 = image1.histogram()
  69.  
    histogram2 = image2.histogram()
  70.  
     
  71.  
    differ = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2,histogram1, histogram2)))/len(histogram1))
  72.  
    if differ>0 or differ<0:
  73.  
    return False
  74.  
    if differ==0:
  75.  
    return True
  76.  
    '''判断两张图片是否有差异,有差异则把差异的部分合成一张图片,用于观察差异的部分'''
  77.  
    def equalImage(file1,file2):
  78.  
    if os.path.exists(file1):
  79.  
    pass
  80.  
    else:
  81.  
    raise IOError(f'图片不存在,请您仔细观察路径是否填写错误{file1}')
  82.  
    if os.path.exists(file2):
  83.  
    pass
  84.  
    else:
  85.  
    raise IOError(f'图片不存在,请您仔细观察路径是否填写错误{file2}')
  86.  
    image1 = cv2.imread(file1)
  87.  
    image2 = cv2.imread(file2)
  88.  
    difference = cv2.subtract(image1, image2)
  89.  
    result = not np.any(difference) # if difference is all zeros it will return False
  90.  
     
  91.  
    if result is True:
  92.  
    return True
  93.  
    else:
  94.  
    cv2.imwrite("./difference/result.jpg", difference)
  95.  
    return False

下面是总方法,用于调用上面的方法 

  1.  
    '''此方法用于对比两个视频是否相同,为了清晰地说明技术,所以两个对比的视频名字需要一样'''
  2.  
    def equalsVideoVideo():
  3.  
    dir_vs = './video/source'
  4.  
    dir_is = './image/source'
  5.  
    dir_vd = './video/dect'
  6.  
    dir_id = './image/dect'
  7.  
    #使用自定义的方法对视频进行切割成多个图片
  8.  
    videoImage(dir_vs,dir_is)
  9.  
    videoImage(dir_vd,dir_id)
  10.  
    #遍历视频,对每个视频产生的图片进行对比
  11.  
    for video in os.listdir(dir_vs):
  12.  
    video_name,_ = video.split('.')
  13.  
    source_list = os.listdir(f'{dir_is}/{video_name}')
  14.  
    dect_list = os.listdir(f'{dir_id}/{video_name}')
  15.  
    result = True
  16.  
    for file1,file2 in zip(source_list,dect_list):
  17.  
    result = compare(dir_is '/' video_name '/' file1,dir_id '/' video_name '/' file2)
  18.  
    if result == False:
  19.  
    result = False
  20.  
    if result:
  21.  
    print(f'两个视频:{video_name}.mp4一样')
  22.  
    else:
  23.  
    print(f'两个视频:{video_name}.mp4不一样')
  24.  
     
  25.  
    if __name__ == '__main__':
  26.  
    equalsVideoVideo()

测试人员使用python批量对比两个视频是否一致篇结束,欢迎到我的主页观看其他技术类博客~

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfcbejf
系列文章
更多 icon
同类精品
更多 icon
继续加载