最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python?+?OpenCV提取和保存視頻幀

 更新時間:2025年08月20日 10:55:49   作者:ChanYanny  
Python中的OpenCV庫在視頻處理方面功能強大,可方便地從視頻中截取每一幀并保存為圖片,這篇文章主要介紹了使用Python?+?OpenCV提取和保存視頻幀的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

引言

在計算機視覺、機器學(xué)習(xí)和圖像處理應(yīng)用中,從視頻中處理圖像幀是一個常見的任務(wù)。Python提供了一些強大的庫和工具,使我們能夠輕松地從視頻中提取幀并對其進行處理。

百度百科: OpenCV是一個基于Apache2.0許可(開源)發(fā)行的跨平臺計算機視覺和機器學(xué)習(xí)軟件庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法。

環(huán)境準備

使用 OpenCV 庫從視頻中提取特定幀并保存為圖像文件,首先需要確保安裝了必要的庫。

注意??:OpenCV庫為 opencv-python ,導(dǎo)入OpenCV語法為 import cv2

pip install opencv-python numpy matplotlib

代碼實現(xiàn)

注意??:運行代碼需通過命令行的方式

import cv2
import os
import argparse
from datetime import timedelta
from pathlib import Path

def extract_frames(video_path, output_dir, frame_interval=None, time_interval=None, prefix="frame"):
    """
    從視頻中提取幀并保存到指定目錄

    參數(shù):
        video_path: 視頻文件路徑
        output_dir: 輸出目錄
        frame_interval: 幀間隔(每多少幀提取一幀)
        time_interval: 時間間隔(秒)
        prefix: 輸出文件名前綴
    """

    # 檢查視頻文件
    if not os.path.isfile(video_path):
        print(f"錯誤: 視頻文件 '{video_path}' 不存在")
        return

    # 創(chuàng)建輸出目錄 確保輸出目錄存在
    os.makedirs(output_dir, exist_ok=True)

    # 打開視頻文件
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        print(f"錯誤: 無法打開視頻文件 {video_path}")
        return

    # 獲取視頻文件名(不含擴展名)作為默認前綴
    if prefix is None:
        video_name = Path(video_path).stem  # 例如: "input" from "input.mp4"
        prefix = video_name

    # 獲取視頻屬性
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    duration = frame_count / fps

    print(f"視頻信息:")
    print(f"  視頻路徑: {video_path}")
    print(f"  幀率: {fps:.2f} fps")
    print(f"  總幀數(shù): {frame_count}")
    print(f"  分辨率: {width}x{height}")
    print(f"  時長: {timedelta(seconds=duration)}")

    # 確定提取間隔
    if frame_interval is not None:
        interval = frame_interval
        use_frame_interval = True
        print(f"將每 {interval} 幀提取一幀")
    elif time_interval is not None:
        interval = max(1, int(time_interval * fps))  # 確保至少1幀
        use_frame_interval = True
        print(f"將每 {time_interval} 秒({interval}幀)提取一幀")
    else:
        interval = 1
        use_frame_interval = True
        print("將提取所有幀")

    # 開始提取幀
    frame_number = 0
    saved_count = 0

    print("\n開始提取幀...")

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 檢查是否應(yīng)該保存當前幀
        if use_frame_interval and frame_number % interval == 0:
            save_path = os.path.join(output_dir, f"{prefix}_{frame_number:06d}.jpg")
            cv2.imwrite(save_path, frame)
            saved_count += 1

        frame_number += 1

    cap.release()
    print(f"完成提取: 共處理 {frame_number} 幀,保存 {saved_count} 張到 {output_dir}")


def main():
    parser = argparse.ArgumentParser(description='從視頻中提取幀并保存')
    parser.add_argument('--video_dir', help='視頻所在目錄(處理目錄下所有視頻)')
    parser.add_argument('--video_path', help='單個視頻文件路徑(與video_dir互斥)')
    parser.add_argument('--output_dir', help='輸出目錄')
    group = parser.add_mutually_exclusive_group()
    group.add_argument('--frame_interval', type=int, help='幀間隔(每多少幀提取一幀)')
    group.add_argument('--time_interval', type=float, help='時間間隔(秒)')
    parser.add_argument('--prefix', help='輸出文件名前綴(默認為視頻文件名)')
    parser.add_argument('--extensions', default='mp4,mkv,avi,mov', help='允許的視頻擴展名,逗號分隔')

    args = parser.parse_args()

    # 驗證輸入?yún)?shù)
    if not args.video_dir and not args.video_path:
        parser.error("請指定 --video_dir 或 --video_path")

    # 獲取視頻文件列表
    video_files = []
    if args.video_dir:
        if not os.path.exists(args.video_dir):
            print(f"錯誤: 視頻目錄 {args.video_dir} 不存在")
            return

        allowed_extensions = set(args.extensions.lower().split(','))
        for entry in os.scandir(args.video_dir):
            if entry.is_file() and entry.name.lower().split('.')[-1] in allowed_extensions:
                video_files.append(entry.path)

        if not video_files:
            print(f"錯誤: 在目錄 {args.video_dir} 中未找到支持的視頻文件")
            return
    else:
        if not os.path.exists(args.video_path):
            print(f"錯誤: 視頻文件 {args.video_path} 不存在")
            return
        video_files = [args.video_path]

    print(f"找到 {len(video_files)} 個視頻文件需要處理")

    # 處理每個視頻
    for video_path in video_files:
        video_name = Path(video_path).stem

        # 使用視頻名作為默認前綴(除非用戶指定了全局前綴)
        prefix = args.prefix if args.prefix else video_name

        extract_frames(
            video_path,
            args.output_dir,  # 直接使用用戶指定的輸出目錄,不再創(chuàng)建子目錄
            args.frame_interval,
            args.time_interval,
            prefix
        )

if __name__ == "__main__":
    main()


運行 命令行工具

你可以通過以下命令行方式運行這個視頻幀提取程序。

程序支持兩種模式:①單視頻處理②批量處理目錄中的所有視頻

1 處理單個視頻文件

bash 命令

python [代碼名] --video_path 視頻路徑 --output_dir 輸出目錄 [其他參數(shù)]

示例:

提取 input.mp4 的幀,每秒提取一幀,保存到 frames/ 目錄:

python frame.py --video_path input.mp4 --output_dir frames/ --time_interval 1.0

2 批量處理目錄中的所有視頻

bash 命令

python frame.py --video_dir 視頻目錄 --output_dir 輸出目錄 [其他參數(shù)]

示例:

處理 videos/ 目錄下的所有視頻(默認支持 mp4、mkv、avi、mov 格式),每 30 幀提取一幀,保存到 frames/ 目錄:

python frame.py --video_dir videos/ --output_dir frames/ --frame_interval 30

完整幫助信息

查看所有可用參數(shù):

python frame.py --help

結(jié)語

使用Python和OpenCV提取視頻幀是一項強大而靈活的技術(shù),適用于各種計算機視覺和多媒體處理任務(wù)。本文介紹的方法從基礎(chǔ)到高級,覆蓋了大多數(shù)實際應(yīng)用場景。通過調(diào)整參數(shù)和結(jié)合其他Python庫,您可以構(gòu)建更復(fù)雜的視頻處理流程。

到此這篇關(guān)于使用Python + OpenCV提取和保存視頻幀的文章就介紹到這了,更多相關(guān)OpenCV提取和保存視頻幀內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python openpyxl讀取單元格字體顏色過程解析

    Python openpyxl讀取單元格字體顏色過程解析

    這篇文章主要介紹了Python openpyxl讀取單元格字體顏色過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • python 利用已有Ner模型進行數(shù)據(jù)清洗合并代碼

    python 利用已有Ner模型進行數(shù)據(jù)清洗合并代碼

    今天小編就為大家分享一篇python 利用已有Ner模型進行數(shù)據(jù)清洗合并代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python采用requests庫模擬登錄和抓取數(shù)據(jù)的簡單示例

    python采用requests庫模擬登錄和抓取數(shù)據(jù)的簡單示例

    這篇文章主要介紹了python采用requests庫模擬登錄和抓取數(shù)據(jù)的簡單示例,代碼簡單卻功能強大!需要的朋友可以參考下
    2014-07-07
  • Python使用Traceback進行錯誤追蹤的方法詳解

    Python使用Traceback進行錯誤追蹤的方法詳解

    本文介紹了Python中的Traceback及其用模塊的核心功能,通過解析和利用Traceback信息提升調(diào)試效率,Traceback包含了異常類型、錯誤位置和調(diào)用鏈等關(guān)鍵信息的相關(guān)資料,需要的朋友可以參考下
    2026-04-04
  • Python tabulate結(jié)合loguru打印出美觀方便的日志記錄

    Python tabulate結(jié)合loguru打印出美觀方便的日志記錄

    在開發(fā)過程中經(jīng)常碰到在本地環(huán)境無法完成聯(lián)調(diào)測試的情況,必須到統(tǒng)一的聯(lián)機環(huán)境對接其他系統(tǒng)測試。往往是出現(xiàn)了BUG難以查找數(shù)據(jù)記錄及時定位到錯誤出現(xiàn)的位置。本文將利用tabulate結(jié)合loguru實現(xiàn)打印出美觀方便的日志記錄,需要的可以參考一下
    2022-10-10
  • 關(guān)于VSCode?配置使用?PyLint?語法檢查器的問題

    關(guān)于VSCode?配置使用?PyLint?語法檢查器的問題

    這篇文章主要介紹了VSCode?配置使用?PyLint?語法檢查器,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 使用Python實現(xiàn)BT種子和磁力鏈接的相互轉(zhuǎn)換

    使用Python實現(xiàn)BT種子和磁力鏈接的相互轉(zhuǎn)換

    這篇文章主要介紹了使用Python實現(xiàn)BT種子和磁力鏈接的相互轉(zhuǎn)換的方法,有時比如迅雷無法加載磁力鏈接或者無法上傳附件分享時可以用到,需要的朋友可以參考下
    2015-11-11
  • anaconda升級sklearn版本的實現(xiàn)方法

    anaconda升級sklearn版本的實現(xiàn)方法

    這篇文章主要介紹了anaconda升級sklearn版本的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 簡單介紹Python的第三方庫yaml

    簡單介紹Python的第三方庫yaml

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著Python的第三方庫yaml展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • python開發(fā)之thread實現(xiàn)布朗運動的方法

    python開發(fā)之thread實現(xiàn)布朗運動的方法

    這篇文章主要介紹了python開發(fā)之thread實現(xiàn)布朗運動的方法,實例分析了Python基于多線程實現(xiàn)繪圖的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11

最新評論

修水县| 开封市| 张北县| 全州县| 大安市| 寿阳县| 栖霞市| 南开区| 龙川县| 鄢陵县| 乳山市| 齐齐哈尔市| 五指山市| 比如县| 同仁县| 同仁县| 平山县| 开远市| 开原市| 广河县| 济阳县| 漳平市| 裕民县| 穆棱市| 龙游县| 泗洪县| 五华县| 江达县| 平江县| 蒙自县| 嘉义县| 廊坊市| 长沙县| 台北市| 沙田区| 正镶白旗| 北流市| 都江堰市| 承德市| 清远市| 新余市|