Python视频相似度比较

本文介绍了使用Python实现的视频相似度检测方法,通过计算图片哈希值并利用DCT变换,结合汉明距离,判断两视频流帧间的相似性。核心函数包括pHash、hanming_dist和compare,示例展示了如何通过compareVideo函数对比两个视频文件的相似程度。

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)

【资源说明】 基于Vue+Flask+python实现的短视频相似度检测系统源码(使用多种哈希算法+孪生神经网络)+项目说明.zip 文本相似度检测算法使用Jaccrad,余弦相似度及Dice,最终结果为三者取平均值 视频相似度检测即为遍历关键帧对比,使用均值哈希,差值哈希,感知哈希,三直方图及SSIM指标,若这五个指标中有四个及以上大于阈值0.55,则调用神经网络进行进一步对比,最终分数为0.1*(前五个算法之和) + 神经网络/100 前端 node.js版本v14.17.1 frontend目录下npm i && npm run serve 生产环境搭建命令为npm run build,文件在dist目录下 ### 后端 Python版本(Anaconda)3.7 backend目录下pip install -r requirements 数据库建议清空,测试用户名ivy,密码ivy 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值