視頻關鍵幀提取

🎞? 視頻關鍵幀提取與特征分析指南


📌 抽幀數量建議

視頻時長推薦抽幀數原因
短視頻(≤15秒)3~5 幀覆蓋不同場景即可
中長視頻(1~3分鐘)5~10 幀內容跨度大
長視頻(>5分鐘)SceneDetect + 聚類挑幀避免重復冗余

📸 視頻關鍵幀提取方式

主要使用兩種工具,分別從編碼結構和視覺內容兩個角度提取關鍵幀:

  • FFmpeg:提取編碼層的關鍵幀(I-frames)
  • SceneDetect:提取視覺語義變化顯著的幀

🧠 FFmpeg 提取關鍵幀原理

🔍 什么是關鍵幀(I-frame)?

幀類型全稱說明是否關鍵幀
I-frameIntra-coded完整圖像幀,不依賴其他幀? 是
P-framePredicted預測前幀的變化數據? 否
B-frameBidirectional前后幀間雙向預測? 否

🔧 FFmpeg 原理流程

  1. 解復用:解析容器格式(如 MP4)中的視頻流
  2. 解析幀頭信息:從幀頭或 NAL Unit 中讀取 pict_type
  3. 判斷是否為 I 幀:識別 pict_type == Ikey_frame == 1
  4. 篩選幀:丟棄非 I 幀,僅保留關鍵幀
  5. 保存為圖像:輸出為 JPG/PNG 格式圖像文件

💡 FFmpeg 抽幀命令示例

ffmpeg -i input.mp4 -vf "select='eq(pict_type\,I)',format=yuv420p" -vsync vfr output_%03d.jpg

🧠 SceneDetect 提取語義關鍵幀原理

🔍 原理簡介

SceneDetect 通過比較相鄰幀的圖像內容變化(亮度、直方圖等)檢測場景切換,并將變化處幀視為語義關鍵幀。

🔧 核心工作流程(以 ContentDetector 為例)

  1. 逐幀解碼視頻(OpenCV / PyAV):

    cap = cv2.VideoCapture('video.mp4')
    
  2. 計算相鄰幀內容差異(默認使用灰度直方圖):

    diff = abs(hist(frame_t) - hist(frame_t+1)).sum()
    
  3. 與設定閾值比較

    if diff > threshold:標記為場景切換
    
  4. 保存場景切換幀為圖像

    scenedetect -i video.mp4 detect-content save-images -o output/
    

?? 可選檢測器對比

檢測器原理適用場景
ContentDetector相鄰幀圖像內容差異(默認)推薦系統特征提取
ThresholdDetector像素亮度差異閾值固定背景變化檢測
AdaptiveDetector自適應閾值策略(均值跟蹤)動畫/劇烈閃爍場景

🧾 FFmpeg 與 SceneDetect 提取原理對比

對比項FFmpegSceneDetect
原理編碼結構(I/P/B幀)圖像內容變化(直方圖/亮度)
是否解碼圖像幀? 不需要? 需要完整解碼幀內容
靈敏度控制? 受限于 GOP 固定結構? 可調閾值(如 --threshold 30.0
是否與語義相關? 編碼角度? 視覺語義相關

📦 Shell 實戰腳本(自動提取關鍵幀)

#!/bin/bashif [ $# -ne 3 ]; thenecho "用法: $0 <video_path> <output_dir> <method: ffmpeg | scenedetect | both>"exit 1
fiVIDEO=$1
OUTDIR=$2
METHOD=$3mkdir -p "$OUTDIR"run_ffmpeg() {echo "使用 FFmpeg 提取關鍵幀到 $OUTDIR/ffmpeg"mkdir -p "$OUTDIR/ffmpeg"ffmpeg -i "$VIDEO" -vf "select='eq(pict_type\,I)',format=yuv420p" -vsync vfr "$OUTDIR/ffmpeg/frame_%03d.jpg"
}run_scenedetect() {echo "使用 SceneDetect 提取語義幀到 $OUTDIR/scenedetect"mkdir -p "$OUTDIR/scenedetect"scenedetect -i "$VIDEO" detect-content save-images -o "$OUTDIR/scenedetect"
}if [ "$METHOD" = "ffmpeg" ]; thenrun_ffmpeg
elif [ "$METHOD" = "scenedetect" ]; thenrun_scenedetect
elif [ "$METHOD" = "both" ]; thenrun_ffmpegrun_scenedetect
elseecho "不支持的方法: $METHOD(僅支持 ffmpeg / scenedetect / both)"exit 1
fiecho "? 提幀完成。"

🧪 使用示例

bash extract_frames.sh cars.mp4 ./frames both

生成的結構如下:

./frames/├── ffmpeg/         # 編碼關鍵幀└── scenedetect/    # 語義關鍵幀

做個實驗:
視頻如下:

ads

提取結果
ffmeg 提取的是這個
在這里插入圖片描述
scenedetect可以提取這個
請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86868.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

協作機器人優化自動化工作流程,提升工作效率

無損檢測(NDT)是一種檢查方法&#xff0c;用于識別材料中的裂紋或缺陷&#xff0c;或者在不損壞材料的情況下確定材料的元素組成。Olympus擁有多種NDT設備&#xff0c;這些設備具有多種多樣的測量功能&#xff0c;允許最終用戶對各種行業中使用的金屬、塑料、陶瓷和復合材料進行…

復用對象Aspose.Words 中 DocumentBuilder 的狀態管理解析

doc manager.LoadDocument(filePath) builder.Document doc 是不是builder就自動清空重建了,不需要清理builder Aspose.Words 中 DocumentBuilder 的狀態管理解析 在您的代碼中&#xff0c;builder.Document doc 這行代碼不會自動清空或重建DocumentBuilder的狀態。Docume…

(LeetCode 面試經典 150 題 ) 134. 加油站 (貪心)

題目&#xff1a;134. 加油站 思路&#xff1a;貪心&#xff0c;時間復雜度0(n)。 當前點i來到下一個點i1,那么油的變化量是gas[i]-cost[i]。 先統計遍歷完所有點后&#xff0c;油的變化量sum。如果sum<0&#xff0c;說明不可能繞行一周&#xff1b;sum>0&#xff0c;說…

Java 線程池總結

一、寫在前面 參考阿里開發規約,創建線程池一般用ThreadPoolExecutor 在高并發程序中&#xff0c;頻繁創建與銷毀線程是一種極其低效且不可控的行為。為了解決這個問題&#xff0c;Java 提供了線程池&#xff08;ThreadPoolExecutor&#xff09;這一強大的并發框架。它不僅提…

【3.3】Pod詳解——容器探針部署第一個pod

文章目錄 容器探針小知識-控制平面Pod實戰聲明式模型&命令模式 部署第一個pod編寫pod清單文件kubectl命令將清單文件post到api-server驗證pod刪除pod 容器探針 上面已經講到容器狀態,那么這些容器的狀態是怎么檢測到的呢?實際上在pod中有三種探針&#xff0c;存活探針(li…

Insar 相位展開真實的數據集的生成與下載(隨機矩陣放大,zernike 仿真包裹相位)

1.真實的數據集下載: Delta-X: UAVSAR L1B Interferometric Products, MRD, Louisiana, 2021 | NASA Earthdata 注意下載的時候需要注冊登錄一下哦 2. 適用于 深度學習訓練的數據集 通過網盤分享的文件:InSAR-DLPU.rar 鏈接: https://pan.baidu.com/s/1CRWAuNYwCHP_iqCeIhf…

C++ 多線程深度解析:掌握并行編程的藝術與實踐

在現代軟件開發中&#xff0c;多線程&#xff08;multithreading&#xff09;已不再是可選項&#xff0c;而是提升應用程序性能、響應速度和資源利用率的核心技術。隨著多核處理器的普及&#xff0c;如何讓代碼有效地利用這些硬件資源&#xff0c;成為每個 C 開發者必須掌握的技…

(線性代數)矩陣的奇異值Singular Value

矩陣的奇異值是矩陣分析中一個非常重要的概念&#xff0c;尤其是在數值線性代數、數據降維&#xff08;如PCA&#xff09;、圖像處理等領域有著廣泛應用。奇異值分解&#xff08;SVD, Singular Value Decomposition&#xff09;是一種強大的工具&#xff0c;可以將任意形狀的矩…

數據結構復習4

第四章 串 一些面試題 12. 介紹一下KMP算法。★★★ KMP算法是一種高效的字符串匹配算法&#xff0c;用于在一個文本串中查找一個模式串的出現位置。KMP算法通過利用模式串自身的信息&#xff0c;在匹配過程中避免不必要的回溯&#xff0c;從而提高匹配效率。 KMP算法的核心思…

【八股消消樂】消息隊列優化—消息有序

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一個正在變禿、變強的文藝傾年。 &#x1f514;本專欄《八股消消樂》旨在記錄個人所背的八股文&#xff0c;包括Java/Go開發、Vue開發、系統架構、大模型開發、具身智能、機器學習、深度學習、力扣算法等相關知識點&#xff…

2D寫實交互數字人如何重塑服務體驗?

在數字化浪潮席卷全球的當下&#xff0c;人機交互模式正經歷著前所未有的變革。從早期的文本命令行界面&#xff0c;到圖形用戶界面&#xff08;GUI&#xff09;的普及&#xff0c;再到如今語音交互、手勢識別等多模態交互技術的興起&#xff0c;我們與機器之間的溝通方式愈發自…

CI/CD GitHub Actions配置流程

騰訊云服務器寶塔FinalShellgithup 1.在云服務器上創建SSH秘鑰對&#xff0c;下載秘鑰到本地 2.在服務器中綁定秘鑰對&#xff08;綁定后&#xff0c;服務器不能將不允許密碼登錄&#xff09;綁定前先關機服務器&#xff0c;綁定后再開啟服務器 3.FinalShell改為公鑰登錄&am…

液態交互效果網頁開發--源自鴻蒙5以及iOS26的靈感

首先先來看看最終展示效果 當鼠標靠近“開始探索”的按鈕的時候&#xff0c;按鈕放大并有微弱光效 鼠標靠近之前會給視窗添加一層接近背景的朦朧感&#xff0c;當鼠標放在視窗上朦朧感消失 技術不復雜&#xff0c;這個網頁主要是使用了以下關鍵技術&#xff1a; HTML5 語義化標…

PYTHON從入門到實踐9-類和實例

# 【1】面向對象編程 class Student(object):# 可以幫屬性值綁定到對象上&#xff0c;self相當于JAVA的thisdef __init__(self, name, age):self.name nameself.age agedef speak(self):print(self.name, 說&#xff1a;老師好)if __name__ __main__:new_student1 Student(…

matplotlib 繪制極坐標圖

1、功能介紹&#xff1a; 使用了 matplotlib 庫來創建一個極坐標圖 2、代碼部分&#xff1a; import matplotlib.pyplot as plt import numpy as np# 設置中文字體 plt.rcParams[font.sans-serif] [SimHei] # 選擇黑體字體&#xff0c;支持中文 plt.rcParams[axes.unicode…

Dask心得與筆記【2】

文章目錄 計算參考文獻 計算 數組切片如下 import numpy as np import dask.array as dadata np.arange(1000).reshape(10, 100) a da.from_array(data, chunks(5, 20)) print(a[:,0:3])切片結果是前3列 dask.array<getitem, shape(10, 3), dtypeint64, chunksize(5, 3…

數據采集合規安全是品牌控價基石

在品牌控價與數據分析工作中&#xff0c;數據采集是不可或缺的前置環節。當前主流的數據采集方式為爬蟲采集&#xff0c;這種依托機器自動化操作的模式&#xff0c;取代了傳統人工逐一瀏覽、復制數據的繁瑣流程&#xff0c;大幅提升了效率。采集后的原始數據&#xff0c;會由系…

llm推理賦能action policy的探索

兄弟&#xff0c;你這個問題非常到位&#xff0c;咱分兩個問題詳細講透&#xff1a; &#x1f680; (1) HybridVLA怎么引入更好的推理能力賦能Diffusion Action&#xff1f; HybridVLA 目前設計的亮點&#xff1a; Diffusion Token 與 LLM 自回歸結合 但推理能力沒有被顯式結…

spring04-管理bean(創建、注入):基于注解

一、什么是注解&#xff1f; &#xff08;1&#xff09;注解的定義 注解&#xff08;Annotation&#xff09;是 Java 代碼中的一種特殊標記&#xff0c;用于在程序運行或編譯時提供元信息。 格式&#xff1a; 注解名(屬性名屬性值, 屬性名屬性值...)&#xff08;2&#xff…

docker安裝elasticsearch和kibana

elasticsearch版本和kibana版本需保持一致。這里我使用的都是8.18.2 安裝elasticsearch docker-compose.yml networks:es-net: external: true services:elasticsearch:container_name: es01deploy:resources:limits:cpus: 0memory: 0environment:- discovery.typesingle-no…