首页 > 其他分享 >视频去重原理及 Demo 示例

视频去重原理及 Demo 示例

时间:2024-12-18 19:30:17浏览次数:11  
标签:视频 video1 video2 Demo 示例 cv2 哈希 import

视频去重是一个常见的需求,主要用于视频库或平台管理中,通过判断视频是否相同(或相似)来移除冗余内容。实现视频去重可以通过多种方法,具体选择取决于业务场景和性能要求。


1. 视频去重的原理

1.1 基本原理

视频去重的核心在于计算视频的特征,然后比较这些特征以判断视频是否相同或相似。主要方法包括:

  1. 文件级去重

    • 比较视频文件的元数据(如大小、格式、时长)。
    • 通过文件的哈希值(MD5、SHA-256)判断文件是否完全相同。
  2. 帧级去重

    • 抽取视频关键帧,计算每帧的哈希值或特征值。
    • 比较视频帧的特征值相似度。
  3. 内容级去重

    • 使用视频指纹算法(如 Perceptual Hash、DCT、CNN 特征提取)提取视频的整体特征。
    • 计算视频之间的相似度。
  4. 音频去重

    • 提取视频中的音频轨道,对音频内容进行指纹化处理,判断音频相似性。

2. 视频去重的常用方法

2.1 文件级去重

方法

  • 通过计算文件的哈希值判断文件是否完全一致。

适用场景

  • 简单场景下,文件内容相同即认为是重复视频。
Demo 示例
import java.io.File;
import java.io.FileInputStream;
import java.security.MessageDigest;

public class VideoDeduplication {

    public static String calculateMD5(File file) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        FileInputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) != -1) {
            md.update(buffer, 0, bytesRead);
        }
        fis.close();

        byte[] mdBytes = md.digest();
        StringBuilder hexString = new StringBuilder();
        for (byte b : mdBytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }
        return hexString.toString();
    }

    public static void main(String[] args) throws Exception {
        File video1 = new File("video1.mp4");
        File video2 = new File("video2.mp4");

        String hash1 = calculateMD5(video1);
        String hash2 = calculateMD5(video2);

        if (hash1.equals(hash2)) {
            System.out.println("The videos are identical.");
        } else {
            System.out.println("The videos are different.");
        }
    }
}

2.2 帧级去重

方法

  • 抽取视频的关键帧,通过计算关键帧的哈希值或特征值进行比较。

适用场景

  • 视频内容完全相同或部分相同(如剪辑后的视频)。
关键步骤
  1. 使用视频处理库(如 FFmpeg)提取关键帧。
  2. 对每一帧计算感知哈希(Perceptual Hash,pHash)值。
  3. 比较两段视频的帧哈希值相似性。
Demo 示例
import cv2
import imagehash
from PIL import Image

def extract_keyframes(video_path):
    cap = cv2.VideoCapture(video_path)
    keyframes = []
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    for i in range(frame_count):
        ret, frame = cap.read()
        if not ret:
            break
        if i % 30 == 0:  # 每隔 30 帧提取一帧
            img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
            keyframes.append(img)
    cap.release()
    return keyframes

def calculate_phash(frames):
    return [str(imagehash.phash(frame)) for frame in frames]

def compare_videos(video1_path, video2_path):
    frames1 = extract_keyframes(video1_path)
    frames2 = extract_keyframes(video2_path)

    hash1 = calculate_phash(frames1)
    hash2 = calculate_phash(frames2)

    matches = sum(1 for h1, h2 in zip(hash1, hash2) if h1 == h2)
    similarity = matches / max(len(hash1), len(hash2)) * 100
    return similarity

# 比较视频
video1 = "video1.mp4"
video2 = "video2.mp4"
similarity = compare_videos(video1, video2)
print(f"Similarity: {similarity:.2f}%")

2.3 内容级去重

方法

  • 使用深度学习或经典特征提取算法(如 CNN、ORB)生成视频特征向量。
  • 比较特征向量之间的距离(如余弦相似度)。

适用场景

  • 视频内容相似但不完全一致(如不同分辨率、不同编码格式)。
Demo 示例
import cv2
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

def extract_features(video_path):
    cap = cv2.VideoCapture(video_path)
    features = []
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        # 转灰度图并压缩为固定大小
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        resized = cv2.resize(gray, (64, 64))
        features.append(resized.flatten())
    cap.release()
    return np.array(features)

def compare_features(features1, features2):
    similarities = []
    for f1, f2 in zip(features1, features2):
        sim = cosine_similarity([f1], [f2])
        similarities.append(sim[0][0])
    return np.mean(similarities)

# 比较视频
video1 = "video1.mp4"
video2 = "video2.mp4"

features1 = extract_features(video1)
features2 = extract_features(video2)

similarity = compare_features(features1, features2)
print(f"Similarity: {similarity:.2f}%")

3. 适用场景总结

方法原理适用场景优点缺点
文件级去重比较文件元数据或哈希值文件完全一致的情况简单高效无法处理内容部分一致的情况
帧级去重比较关键帧哈希值或特征值视频内容部分相同或不同分辨率的视频可处理内容部分重复对计算资源需求较高
内容级去重提取深度特征向量,比较相似性视频内容相似但不完全相同高鲁棒性,适用复杂场景实现复杂,计算开销较大
音频指纹去重提取音频轨道的指纹视频音频相同但画面不同的场景针对音频重复的视频效果好对纯视频内容无法判断

4. 实际业务中的优化建议

  1. 选择适合的算法

    • 文件级去重适用于简单场景。
    • 帧级和内容级去重适用于视频编辑场景或版权保护。
  2. 结合多种方法

    • 先通过文件哈希过滤完全相同的视频,再使用帧级或内容级方法处理相似视频。
  3. 利用现成工具

    • 使用开源工具如 Perceptual HashOpenCV
    • 对复杂场景引入深度学习模型,如 TensorFlow 或 PyTorch。

通过这些方法,您可以实现简单到复杂的视频去重任务,具体选型应根据业务场景和性能需求权衡。

标签:视频,video1,video2,Demo,示例,cv2,哈希,import
From: https://blog.csdn.net/u012561308/article/details/144515211

相关文章

  • 鸿蒙Flutter使用ohos_videocompressor实现视频压缩
    鸿蒙Flutter使用ohos_videocompressor实现视频压缩介绍videoCompressor是一款ohos高性能视频压缩器。目前实现的能力:支持视频压缩使用方法:有两种方式可以下载本工程:1.开发者如果想要使用本工程,可以使用git命令gitclonehttps://gitee.com/openharmony-sig/ohos_videocom......
  • Vue - 萤石云监控 ezuikit 视频实例销毁方案,解决使用stop方法无法销毁EZUIKit实例或销
    前言这方面教程很少,本文提供详细解决方案。在vue2|vue3项目开发中,项目集成对接萤石监控摄像头如何销毁EZUIKit实例教程,解决页面存在多个实时监控画面视频情况下,关闭某一个监控依然有声音和占用浏览器内存问题,另外如果要管理的摄像头监控播放器很多会导致分页情况下......
  • WPF 用Vlc.DotNet.Wpf实现视频播放、停止、暂停功能
    1. NuGet添加 Vlc.DotNet.Wpf 2.  到VLC官网http://www.videolan.org/下载VLC播放器。因为本机是64位的,所以下载64位,如下所示:下载的是 安装后,到安装的路径下,拷贝如下文件夹:在wpf项目的exe文件夹下,本机是 bin\Debug\net8.0-windows,新建libvlc后,再建win-x64文......
  • 视频汇聚平台:Liveweb视频流媒体平台视频监控系统解决方案
    数字化技术在安防领域的广泛应用已经成为公安等重要执法部门的重要趋势,主要得益于无线网络通信技术和计算机技术的快速进步。传统的视频监控系统存在诸多局限,例如只能进行现场监视,报警信息传输简单,无法远距离传输视频信号,这限制了对前端状况和事件的准确把握,从而降低了系统的安......
  • Liveweb视频汇聚平台支持WebRTC协议赋能H.265视频流畅传输
    随着科技的飞速发展和网络技术的不断革新,视频监控已经广泛应用于社会各个领域,成为现代安全管理的重要组成部分。在视频监控领域,视频编码技术的选择尤为重要,它不仅关系到视频的质量,还直接影响到视频的传输效率和兼容性。H.265(HEVC)作为新一代视频编码标准,以其更高的压缩效率和更......
  • 监控视频汇聚融合云平台一站式解决视频资源管理痛点
    随着5G技术的广泛应用,各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据,并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而,随着数字化建设和生产经营管理活动的长期开展,海量感知数据日积月累,这为视频资源的管理带来了巨......
  • 小咖批量剪辑助手智能化视频处理工具
    在数字化时代,视频内容的制作和传播变得尤为重要。为了满足市场对高效视频制作的需求,小咖批量剪辑助手应运而生。本文将详细介绍这款软件的特点和应用场景,帮助用户更好地理解和使用这一工具。软件概述小咖批量剪辑助手是一款专为视频内容创作者设计的软件,它通过智能化和批量......
  • 简单的基于Spring Cloud和Vue的示例项目结构及部分关键代码
    后端(SpringCloud部分)1.创建SpringCloud项目(以SpringCloudGateway和SpringCloudEureka为例)首先,使用SpringInitializr创建一个基础的SpringBoot项目,并添加相关的SpringCloud依赖,比如:spring-cloud-starter-gateway:用于实现API网关功能。spring-cloud-starter-netflix-......
  • 【重要】csv库函数简介及简单用法示例
    下面是关于Python中csv库函数的简介及简单用法示例的表格,包括序号、函数名、简介和简单用法示例:序号函数名简介简单用法示例1csv.reader创建一个读取CSV文件的对象2csv.writer创建一个写入CSV文件的对象3csv.DictReader创建一个读取CSV文件并将其行作为......
  • 【重要】re库函数简介及简单用法示例
    以下是根据您提供的列表,以表格形式整理的re库函数简介及简单用法示例:序号函数名/属性简介简单用法示例1ASCII使\w,\W,\b,\B,\d,\D,\s和\S只匹配ASCII字符,而不是Unicode字符re.compile(pattern,re.ASCII)2DEBUG显示调试信息,用于调试正则表达式......