基于图片相似度对视频进行抽帧

2023-10-08 04:44

本文主要是介绍基于图片相似度对视频进行抽帧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 需求
  • 方法
  • 代码

需求

做深度学习需要自己收集图片,其中一种是收集视频,然后将视频转换成图片。在视频转图片过程中,会存在大量的高度相似帧,对于模型训练无用,而且增加标注成本,如何选取有足够差异的图片是我们需要的。

方法

基于图片相似度来选取不同的图片进行保存,相似度计算方法主要参考https://aistudio.baidu.com/projectdetail/4185629?channelType=0&channel=0 这篇中的方法。

代码

直接上代码,内容简单,很容易看明白。代码中提供基于hash的三种方法和一种结构相似性方法,需要手动改代码来切换方法及相关阈值。

import os
import cv2
import numpy as np
import sys
import shutil
from datetime import datetime
from skimage.metrics import structural_similarity as compare_ssim# 均值哈希算法
def ahash(image):# 将图片缩放为8*8的image = cv2.resize(image, (8, 8), interpolation=cv2.INTER_CUBIC)# 将图片转化为灰度图gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)# s为像素和初始灰度值,hash_str为哈希值初始值s = 0# 遍历像素累加和for i in range(8):for j in range(8):s = s + gray[i, j]# 计算像素平均值avg = s / 64# 灰度大于平均值为1相反为0,得到图片的平均哈希值,此时得到的hash值为64位的01字符串ahash_str = ''for i in range(8):for j in range(8):if gray[i, j] > avg:ahash_str = ahash_str + '1'else:ahash_str = ahash_str + '0'result = ''for i in range(0, 64, 4):result += ''.join('%x' % int(ahash_str[i: i + 4], 2))# print("ahash值:",result)return result
# phash
def phash(img):# 加载并调整图片为32*32的灰度图片img1 = cv2.resize(img, (32, 32),cv2.COLOR_RGB2GRAY)# 创建二维列表h, w = img.shape[:2]vis0 = np.zeros((h, w), np.float32)vis0[:h, :w] = img1
​# DCT二维变换# 离散余弦变换,得到dct系数矩阵img_dct = cv2.dct(cv2.dct(vis0))img_dct.resize(8,8)# 把list变成一维listimg_list = np.array().flatten(img_dct.tolist())# 计算均值img_mean = cv2.mean(img_list)avg_list = ['0' if i<img_mean else '1' for i in img_list]return ''.join(['%x' % int(''.join(avg_list[x:x+4]),2) for x in range(0,64,4)])
#差异值哈希算法
def dhash(image):#将图片resize 到8x8image = cv2.resize(image,(9,8),interpolation=cv2.INTER_CUBIC)#转成灰度图gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)#计算dhash 二进制dhash_str =""for i in range(8):for j in range(8):if gray[i,j]>gray[i,j+1]:dhash_str = dhash_str+"1"else:dhash_str = dhash_str+"0"#二进制转十六近制result = ""for i in range(0,64,4):result += "".join("%x" %int(dhash_str[i:i+4],2))return result
# 计算两个哈希值之间的差异
def campHash(hash1, hash2):n = 0# hash长度不同返回-1,此时不能比较if len(hash1) != len(hash2):return -1# 如果hash长度相同遍历长度for i in range(len(hash1)):if hash1[i] != hash2[i]:n = n + 1return n
def extract_frames(video_path, similarity_threshold, output_dir):# 读取视频文件cap = cv2.VideoCapture(video_path)# 创建输出文件夹if os.path.exists(output_dir):shutil.rmtree(output_dir)os.makedirs(output_dir)#要保存的图片previous_image=Noneframe_count=0# 遍历视频帧while True:# 读取一帧ret, frame = cap.read()# 如果读取到最后一帧,退出循环if not ret:break# 将帧转换为图像image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)if previous_image is None:previous_image=cv2.resize(image,(128,128))# 获取当前时间  now = datetime.now()            # 格式化成指定的时间格式  formatted_time = now.strftime("%Y_%m_%d-%H_%M_%S")# 保存帧cv2.imwrite(os.path.join(output_dir,f"{formatted_time}_{frame_count}.jpg"),frame)continueelse:# 计算图像之间的相似度current_image = cv2.resize(image,(128,128))#ssim#similarity = compare_ssim(current_image, previous_image,channel_axis=2)#差异hashhash1 = ahash(previous_image)hash2 = ahash(current_image)similarity = campHash(hash1,hash2)# ssim如果相似度小于阈值,则不够相似,则抽取帧#if similarity < similarity_threshold:# dhash如果相似度大于阈值,则不够相似,则抽取帧if similarity > similarity_threshold:# 获取当前时间  now = datetime.now()            # 格式化成指定的时间格式  formatted_time = now.strftime("%Y_%m_%d-%H_%M_%S")# 保存帧cv2.imwrite(os.path.join(output_dir,f"{formatted_time}_{frame_count}.jpg"),frame)# 更新上一帧previous_image = current_imageframe_count += 1print(".",end="")sys.stdout.flush()cap.release()if __name__ == "__main__":# 视频路径video_path = "../jiabo/20230829/跳远30fps_20230829194849_CH01.avi"# ssim相似度阈值#similarity_threshold = 0.9# dhash 相似度阈值similarity_threshold = 10# 输出文件夹output_dir = "split_output_ahash"# 抽取帧extract_frames(video_path, similarity_threshold, output_dir)

这篇关于基于图片相似度对视频进行抽帧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/162770

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f