DHASH感知算法计算视频相邻帧的相似度

一个朋友想用python来读取视频帧,根据帧和帧之间相似度判断剪辑痕迹;但是最后发现并没什么用……

原理就是遍历地读取图像相邻帧,将图像相邻帧前处理后,缩小什么的,计算d_hash,然后计算其汉明距离,然后把汉明距离变成相似度,比较相似度,如果相似度低于阈值,就标记时间什么的

不过我一想,欸!好像可以用来解GIF隐写

我就把代码放这里了

1.处理视频版本的

import cv2
import numpy as np
from PIL import Image# Constants
VIDEO_FILE = "faker.mp4"
FRAME_PREFIX = "frame"
FAIL_THRESHOLD = 0.77def d_hash(image):"""Calculate the difference hash for the given image."""hash_bits = []for i in range(8):for j in range(8):hash_bits.append(1 if image[i, j] > image[i, j + 1] else 0)return hash_bitsdef hamming_distance(hash1, hash2):"""Calculate the Hamming distance between two hashes."""return sum(1 for x, y in zip(hash1, hash2) if x != y)def process_frame(frame):"""Process frame to convert it to a format suitable for hash computation."""return np.array(Image.fromarray(frame).resize((9, 8), Image.LANCZOS).convert('L'), 'f')def main():video = cv2.VideoCapture(VIDEO_FILE)edit_detected = Falsewhile True:# Read two consecutive frames from the videosuccess, frame0 = video.read()success1, frame1 = video.read()if not success or not success1:break# Process framesframe0_processed = process_frame(frame0)frame1_processed = process_frame(frame1)# Calculate hashes and distancehash0 = d_hash(frame0_processed)hash1 = d_hash(frame1_processed)distance = hamming_distance(hash0, hash1)similarity = 1.0 - distance / 64.0# Check similarity against the thresholdif similarity < FAIL_THRESHOLD:msec = video.get(cv2.CAP_PROP_POS_MSEC)minute, second = divmod(msec // 1000, 60)print(f"{int(minute)} minute {int(second)} second detected with similarity {similarity}")edit_detected = Trueif not edit_detected:print("No edit detected.")if __name__ == "__main__":main()

2.处理GIF版本的

处理GIF的时候如果遇到相似度过低的帧,就标记出来,而不是时间

from PIL import Image, ImageSequence
import numpy as np# Constants
GIF_FILE = "aaa.gif"
FRAME_PREFIX = "frame"
FAIL_THRESHOLD = 0.77def d_hash(image):"""Calculate the difference hash for the given image."""hash_bits = []for i in range(8):for j in range(8):hash_bits.append(1 if image[i, j] > image[i, j + 1] else 0)return hash_bitsdef hamming_distance(hash1, hash2):"""Calculate the Hamming distance between two hashes."""return sum(1 for x, y in zip(hash1, hash2) if x != y)def process_frame(frame):"""Process frame to convert it to a format suitable for hash computation."""return np.array(frame.resize((9, 8), Image.LANCZOS).convert('L'), 'f')def main():gif = Image.open(GIF_FILE)frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]edit_detected = Falseprevious_hash = Nonefor index, frame in enumerate(frames):# Process frameframe_processed = process_frame(frame)# Calculate hashcurrent_hash = d_hash(frame_processed)if previous_hash is not None:# Calculate distance and similaritydistance = hamming_distance(previous_hash, current_hash)similarity = 1.0 - distance / 64.0# Check similarity against the thresholdif similarity < FAIL_THRESHOLD:print(f"Frame {index} detected with similarity {similarity}")edit_detected = Trueprevious_hash = current_hashif not edit_detected:print("No edit detected.")if __name__ == "__main__":main()

FAIL_THRESHOLD那里可以调节灵敏度,越高越容易筛选帧对

不过话说回来,好像还是很鸡肋……算了……写都写了

兴许以后有用呢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webstorm的缩进设置(过度缩进解释)

在编写前端代码时 缩进规范一般被认为是2个空格 而非默认的4个空格 当我们通过webstorm去编写前端代码时 我们可以通过setting->Code Style->html/css/js指定的界面中去设置tab/indent/continuation indent 具体的话 我们将html/css/js操作界面中的tab/indent设置为2个空…

LEED绿色建筑认证

LEED&#xff08;Leadership in Energy and Environmental Design&#xff09;绿色建筑评估体系是由美国绿色建筑协会&#xff08;USGBC&#xff09;建立并推行的一项权威评估标准。 一、LEED体系概述 LEED体系是目前在世界各国的各类建筑环保评估、绿色建筑评估以及建筑可持…

Redis 5 种基本数据类型的前两个详解

Redis 共有 5 种基本数据类型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 这 5 种数据类型是直接提供给用户使用的&…

提交gitlab

1.gitlab上新建项目 2.git clone url把新项目拉下来 3.git add ./* 把需要提交的文件全部新增 4.git config --global user.email “yetuo.zhuqxsk.local” 身份认证一下 5.git commit -m “asr语音识别-对外服务” 提交 6.git push origin 推送进去 git init git add . git c…

SAP ABAP 代码搜索工具 CODE_SCANNER

SAP ABAP 代码搜索工具 CODE_SCANNER 作为一个熟练的 ABAP 经常要查一下某个function有没有被别的程序调用&#xff0c;或者查看某个function在参考别的程序的调用方法。这就会经常用到 CODE_SCANNER 这个TCODE。 例子一&#xff1a;例如查询 某个smartform 被哪个程序调用了&…

网页打不开、找不到服务器IP地址

现象&#xff1a;网络连接ok&#xff0c;软件能正常使用&#xff0c;当网页打不开。 原因&#xff1a;DNS 配置错误导致网站域名无法正确解析造成。 影响DNS设置的&#xff1a;VPN软件、浏览器DNS服务选择、IPv4属性被修改。 1、VPN代理未关闭 2、浏览器DNS解析选择 3、以太…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【285-296】

文章目录 285. 为什么需要继承286. 继承原理图287. 继承快速入门288. 289. 290. 291. 292. 继承使用细节1,2,3,4,5288.1 继承给编程带来的便利288.2 继承的深入讨论/细节问题 293. 继承本质详解294. 继承课堂练习1295. 继承课堂练习2296. 继承课堂练习3 285. 为什么需要继承 28…

同城O2O系统源码与跑腿配送平台的架构设计与开发方案详解

今天&#xff0c;笔者将与您一同深入探讨同城O2O系统的源码及跑腿配送平台的架构设计与开发方案&#xff0c;助力开发者和企业在这一领域的实践与探索。 一、O2O系统概述 在同城O2O模式中&#xff0c;用户可以通过手机应用或网页平台下单&#xff0c;而配送员则根据订单信息迅…

[图形学]smallpt代码详解(1)

一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍&#xff0c;和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…

鸿蒙NEXT开始公测,哪些机型可以升级?鸿蒙版微信界面简洁

华为 Harmony OS NEXT 于10月8日正式开启公测&#xff0c;对鸿蒙 NEXT 系统感兴趣&#xff0c;想要第一时间尝鲜鸿蒙系统的话&#xff0c;千万不要错过本篇文章&#xff01; 哪些手机可以参与鸿蒙 NEXT 公测&#xff1f; 首批参与鸿蒙 NEXT 公测的机型有华为 Mate 60 系列、华…

Electron构建桌面应用程序,服务于项目的自主学习记录(持续更新...

无所畏惧地面对未知&#xff0c;并将其视为成长的机会 大纲官网快速入门1.安装node.js -- 这里推荐用nvm管理2.脚手架创建3.electron 包安装到应用的开发依赖4.创建主进程(main.js)并启动项目1.创建页面2.配置main.js3.启动项目 -- 效果 进阶 -- 基于项目场景功能使用场景一&am…

Java8新特性, 函数式编程及Stream流用法大全

用了多少年的java8了&#xff0c;Lambda表达式和stream流也经常用&#xff0c;但是也仅限于某些用法比较熟练&#xff0c;看见了 Function、Consumer 等函数式接口还是一脸懵逼&#xff0c;现在来全面总结一下java8这些新特性&#xff0c;也为自己后续查找做个备忘。如果你只是…

【C++】模板(初识):函数模板、类模板

本篇主要介绍C中的模板初阶的一些知识。模板分为函数模板和类模板&#xff0c;我们一个一个来看。 1.函数模板 1.1函数模板概念 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实际的参数类型产生函数特定版本。…

Golang

Golang&#xff0c;通常被称为Go&#xff0c;是由Google开发的一种开源编程语言。它最早由Robert Griesemer、Rob Pike和Ken Thompson在2007年设计并于2009年发布。Golang的设计目标是提高编写简单、高效和并发程序的能力&#xff0c;因此非常适合用于构建高并发的网络服务、分…

滚雪球学MySQL[4.4讲]:数据库的性能调优详解

全文目录&#xff1a; 前言1. 数据库性能调优的重要性2. 数据库性能调优策略2.1 索引优化2.1.1 创建合适的索引示例&#xff1a;创建单列索引和联合索引 2.1.2 避免过度索引2.1.3 使用覆盖索引示例&#xff1a;覆盖索引 2.2 查询优化2.2.1 使用EXPLAIN分析查询示例&#xff1a;…

C++:图的最短路径问题

一、简介 在非网图中&#xff0c;最短路径是指两顶点之间经历的边数最少的路径。在网图中&#xff0c;最短路径是指两顶点之间经历的边上权值之和最少的路径。 路径上的第一个顶点称为源点&#xff0c;最后一个顶点称为终点。 最短路径问题是图的一个比较典型的应用问题。例如&…

QT 通过鼠标事件实现图片的拖动和缩放

通过鼠标拖动来移动图片&#xff0c;并使用鼠标滚轮来缩放图片。 1、实现步骤&#xff1a; 1、移动图片&#xff1a; 使用QPoint记录图片的偏移量&#xff0c;当鼠标拖动时更新这个偏移量&#xff0c;在paintEvent()中根据偏移量绘制图片。2、缩放图片&#xff1a; 使用滚轮…

人工智能平台 PAI-DSW内置通义灵码实操

人工智能平台 PAI&#xff08;Platform for AI&#xff0c;原机器学习平台PAI&#xff09;是 AI Native 的大模型与 AIGC 工程平台&#xff0c;提供包含数据集管理、算力管理、模型工具链、模型开发、模型训练、模型部署、AI资产管理在内的功能模块&#xff0c;内置100种大模型…

02_23 种设计模式之《抽象工厂模式》

文章目录 一、抽象工厂模式抽象工厂模式的结构应用场景 示例代码&#xff08;C&#xff09;注意事项 一、抽象工厂模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;隶属于设计模式中的创建型模式&#xff0c;用于产品族的构建。抽象工厂是指当有多个抽象角…

JVS·智能BI数据可视化图表:普通列表与分组列表配置全解析

使用场景 在可视化配置中&#xff0c;很多场景中需要图形和详细信息的融合展示&#xff0c;那么在图表中可以新增普通列表与分组列表的配置。如下图所示&#xff1a; 配置说明 1、新增组件&#xff1a;配置入口如下图所示&#xff0c;新增组件时&#xff0c;选择普通列表与分…