使用Python进行视频相似度比较实例

 更新时间:2023年07月28日 11:09:43   作者:培根芝士  
这篇文章主要介绍了使用Python进行视频相似度比较实例,本文通过汉明距离算法与图片比较等方法对比两个视频流的相似度,文中提供了部分实现代码与解决思路,需要的朋友可以参考下

Python视频相似度比较

1、安装依赖库

pip3 install numpy
pip3 install opencv-python

2、获取图片哈希值

def pHash(img):
	# 缩放图片为32x32灰度图片
	img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
	img = cv2.resize(img, (32, 32), interpolation=cv2.INTER_CUBIC)
	# 创建二维列表
	h, w = img.shape[:2]
	vis0 = np.zeros((h,w), np.float32)
	vis0[:h,:w] = img
	# 二维Dct变换
	vis1 = cv2.dct(cv2.dct(vis0))
	vis1 = vis1[:8, :8]
	# 把二维list变成一维list
	img_list = vis1.flatten().tolist()
	# 计算均值, 得到哈希值
	avg = sum(img_list) * 1. / 64
	avg_list = [0 if i < avg else 1 for i in img_list]
	return avg_list

3、求汉明距离

def hanming_dist(s1, s2):
	return sum([ch1 != ch2 for ch1, ch2 in zip(s1, s2)])

4、输入比较的两个视频流,返回是否相似。

帧相似度>=0.85返回True,否则返回False

def compare(video1: cv2.VideoCapture = None, video2: cv2.VideoCapture =None) -> bool:
	# 获取较短视频的帧数
	min_frame_count = min(video1.get(cv2.CAP_PROP_FRAME_COUNT), 
							video2.get(cv2.CAP_PROP_FRAME_COUNT))
	# 获取视频FPS
	fps1 = video1.get(cv2.CAP_PROP_FPS)
	similar = 0
	frame_cnt = int(min_frame_count / fps1)
	# 截帧
	for _ in range(frame_cnt):
		for _ in range(int(fps1)): # 按视频一间隔1s
			retval1 = video1.grab()
			retval2 = video2.grab()
		if not retval1 or not retval2:
			grab_failure_cnt += 1
			if grab_failure_cnt >= 10:
				raise Exception('Grab failed too much >= {} times, could be endless loop.'.format(10))
		else:
			grab_failure_cnt = 0
		flag1, frame1 = video1.retrieve()
		flag2, frame2 = video2.retrieve()
		# 提phash特征
		if flag1 & flag2:
			phash1 = pHash(frame1)
			phash2 = pHash(frame2)
			# 比较汉明距离
			if hanming_dist(phash1, phash2) < 12:
				similar += 1
	print("similar:", similar/frame_cnt, frame_cnt)
	return similar / frame_cnt

5、调用示例

def compareVideo(srcVideo, dstVideo):
	video1 = cv2.VideoCapture(srcVideo)
	video2 = cv2.VideoCapture(dstVideo)
	return compare(video1, video2)

到此这篇关于使用Python进行视频相似度比较实例的文章就介绍到这了,更多相关Python视频相似度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python上下文管理器的用法(Context Manager)

    Python上下文管理器的用法(Context Manager)

    上下文管理器是Python中管理资源分配与释放的重要机制,通过with语句实现资源的自动管理,它适用于文件操作、数据库连接、线程锁管理等场景,可保证资源正确释放,本文总结了上下文管理器的实现方式、应用场景、最佳实践和高级用法,旨在帮助开发者更好地掌握这一强大工具
    2026-04-04
  • Python+OpenCV实现定位二维码

    Python+OpenCV实现定位二维码

    这篇文章主要为大家详细介绍了如何利用Python和OpenCV实现定位二维码功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Pycharm如何对python文件进行打包

    Pycharm如何对python文件进行打包

    这篇文章主要介绍了Pycharm如何对python文件进行打包,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python正则表达式 r'(.*) are (.*?) .*'的深入理解

    Python正则表达式 r'(.*) are (.*?) .*'的深入理解

    日常的开发工作中经常会有处理字符串的需求,简单的字符串处理,我们使用python内置的字符串处理函数就可以了,但是复杂的字符串匹配就需要借助正则表达式了,这篇文章主要给大家介绍了关于Python正则表达式 r‘(.*) are (.*?) .*‘的相关资料,需要的朋友可以参考下
    2022-07-07
  • python 基础教程之Map使用方法

    python 基础教程之Map使用方法

    这篇文章主要介绍了python 基础教程之Map使用方法的相关资料,这里附有简单使用实例,需要的朋友可以参考下
    2017-01-01
  • Python项目报错ModuleNotFoundError的终极解决方案

    Python项目报错ModuleNotFoundError的终极解决方案

    在 Python 项目开发中,很多同学都会遇到ModuleNotFoundError的问题报错,下面小编就和大家详细介绍一下具体的实现方法,希望对大家有所帮助
    2026-01-01
  • 使用python执行shell脚本 并动态传参 及subprocess的使用详解

    使用python执行shell脚本 并动态传参 及subprocess的使用详解

    这篇文章主要介绍了使用python执行shell脚本 并动态传参 及subprocess的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python获取图片中两个点的具体坐标并将图无损裁剪下来

    python获取图片中两个点的具体坐标并将图无损裁剪下来

    这篇文章主要为大家详细介绍了python如何获取图片中两个点的具体坐标并将图无损裁剪下来,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-11-11
  • python基础之循环语句

    python基础之循环语句

    这篇文章主要介绍了python的循环语句,实例分析了Python中返回一个返回值与多个返回值的方法,需要的朋友可以参考下
    2021-10-10
  • windows 下python+numpy安装实用教程

    windows 下python+numpy安装实用教程

    这篇文章主要介绍了windows 下python+numpy安装实用教程,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论