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

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

相关文章

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("