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

Python實(shí)現(xiàn)視頻轉(zhuǎn)圖片的兩種方案

 更新時(shí)間:2026年02月28日 09:15:00   作者:liwulin0506  
文章介紹了兩種Python視頻轉(zhuǎn)圖片的方案,方案1按幀提取,方案2按時(shí)間間隔提取,核心功能包括關(guān)鍵函數(shù)與參數(shù)的說明、實(shí)用優(yōu)化點(diǎn)和使用注意事項(xiàng),標(biāo)注工具推薦包括LabelImg、LabelMe和CVAT,需要的朋友可以參考下

一、前期準(zhǔn)備:安裝依賴庫(kù)

核心使用 opencv-python(OpenCV)庫(kù)處理視頻和圖像,這是Python視覺處理的主流庫(kù),先通過pip安裝:

二、方案1:基礎(chǔ)版 - 按幀提取(提取所有幀/每隔N幀提?。?/h2>

適合大多數(shù)標(biāo)注場(chǎng)景,可靈活設(shè)置提取間隔,避免圖片過多冗余。

完整代碼

import cv2
import os

def video_to_images_basic(
    video_path,          # 輸入視頻文件路徑(如:test.mp4)
    output_dir,          # 輸出圖片文件夾路徑
    frame_interval=30,   # 提取間隔:每30幀提取1張(默認(rèn)30幀,對(duì)應(yīng)1秒/幀,可調(diào)整)
    img_format="jpg",    # 輸出圖片格式(jpg/png,推薦jpg,占用空間小)
    img_prefix="frame"   # 圖片文件名前綴(如:frame_0001.jpg)
):
    # 1. 創(chuàng)建輸出文件夾(若不存在則自動(dòng)創(chuàng)建)
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"創(chuàng)建輸出文件夾:{output_dir}")

    # 2. 打開視頻文件
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        raise ValueError(f"無法打開視頻文件:{video_path}")

    # 3. 獲取視頻基本信息
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 視頻總幀數(shù)
    fps = cap.get(cv2.CAP_PROP_FPS)                        # 視頻幀率(每秒幀數(shù))
    print(f"視頻信息:總幀數(shù)={total_frames},幀率={fps:.2f},預(yù)計(jì)提取圖片數(shù)={total_frames//frame_interval + 1}")

    # 4. 循環(huán)提取幀并保存
    frame_count = 0  # 當(dāng)前幀計(jì)數(shù)器
    saved_count = 0  # 已保存圖片計(jì)數(shù)器

    while True:
        # 讀取一幀視頻
        ret, frame = cap.read()

        # 若讀取失?。ㄒ训揭曨l末尾),退出循環(huán)
        if not ret:
            break

        # 按間隔提取幀
        if frame_count % frame_interval == 0:
            # 構(gòu)造圖片文件名(補(bǔ)零對(duì)齊,方便排序)
            img_name = f"{img_prefix}_{saved_count:04d}.{img_format}"
            img_path = os.path.join(output_dir, img_name)

            # 保存圖片
            cv2.imwrite(img_path, frame)
            print(f"已保存:{img_path}")

            saved_count += 1

        frame_count += 1

    # 5. 釋放資源
    cap.release()
    print(f"\n轉(zhuǎn)換完成!共保存 {saved_count} 張圖片,存儲(chǔ)路徑:{output_dir}")

# ------------------- 調(diào)用示例 -------------------
if __name__ == "__main__":
    # 配置參數(shù)
    VIDEO_PATH = "input_video.mp4"  # 你的視頻文件路徑
    OUTPUT_DIR = "extracted_images" # 圖片輸出文件夾
    FRAME_INTERVAL = 30             # 每30幀提取1張(1秒1張,若視頻幀率25,則每1.2秒1張)

    # 執(zhí)行轉(zhuǎn)換
    video_to_images_basic(
        video_path=VIDEO_PATH,
        output_dir=OUTPUT_DIR,
        frame_interval=FRAME_INTERVAL,
        img_format="jpg"
    )

三、方案2:進(jìn)階版 - 按時(shí)間間隔提?。ǜ珳?zhǔn)可控)

適合需要按固定時(shí)間間隔(如每2秒提取1張)的場(chǎng)景,比按幀間隔更直觀,不受視頻幀率影響。

完整代碼

import cv2
import os

def video_to_images_by_time(
    video_path,          # 輸入視頻文件路徑
    output_dir,          # 輸出圖片文件夾路徑
    time_interval=1.0,   # 時(shí)間間隔:每1.0秒提取1張(可調(diào)整,如2.0=每2秒1張)
    img_format="jpg",    # 輸出圖片格式
    img_prefix="frame"   # 圖片文件名前綴
):
    # 1. 創(chuàng)建輸出文件夾
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"創(chuàng)建輸出文件夾:{output_dir}")

    # 2. 打開視頻文件
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        raise ValueError(f"無法打開視頻文件:{video_path}")

    # 3. 獲取視頻基本信息
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    fps = cap.get(cv2.CAP_PROP_FPS)
    video_duration = total_frames / fps  # 視頻總時(shí)長(zhǎng)(秒)
    frame_interval = int(fps * time_interval)  # 換算為幀間隔

    print(f"視頻信息:總幀數(shù)={total_frames},幀率={fps:.2f},總時(shí)長(zhǎng)={video_duration:.2f}秒")
    print(f"時(shí)間間隔={time_interval}秒,對(duì)應(yīng)幀間隔={frame_interval}幀,預(yù)計(jì)提取圖片數(shù)={int(video_duration//time_interval) + 1}")

    # 4. 循環(huán)提取幀并保存
    frame_count = 0
    saved_count = 0
    last_saved_time = 0.0  # 上一次保存圖片的時(shí)間

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

        # 獲取當(dāng)前幀對(duì)應(yīng)的時(shí)間(秒)
        current_time = frame_count / fps

        # 按時(shí)間間隔保存
        if current_time - last_saved_time >= time_interval:
            img_name = f"{img_prefix}_{saved_count:04d}.{img_format}"
            img_path = os.path.join(output_dir, img_name)
            cv2.imwrite(img_path, frame)
            print(f"時(shí)間{current_time:.2f}秒:已保存 {img_path}")

            saved_count += 1
            last_saved_time = current_time

        frame_count += 1

    # 5. 釋放資源
    cap.release()
    print(f"\n轉(zhuǎn)換完成!共保存 {saved_count} 張圖片,存儲(chǔ)路徑:{output_dir}")

# ------------------- 調(diào)用示例 -------------------
if __name__ == "__main__":
    VIDEO_PATH = "input_video.mp4"
    OUTPUT_DIR = "extracted_images_by_time"
    TIME_INTERVAL = 2.0  # 每2秒提取1張圖片

    video_to_images_by_time(
        video_path=VIDEO_PATH,
        output_dir=OUTPUT_DIR,
        time_interval=TIME_INTERVAL,
        img_format="jpg"
    )

四、核心功能說明

1. 關(guān)鍵函數(shù)與參數(shù)

  • cv2.VideoCapture(video_path):打開視頻文件,返回視頻捕獲對(duì)象;
  • cap.read():讀取一幀視頻,返回(ret, frame),ret為布爾值(是否讀取成功),frame為當(dāng)前幀圖像(numpy數(shù)組);
  • cap.get(cv2.CAP_PROP_FRAME_COUNT):獲取視頻總幀數(shù);
  • cap.get(cv2.CAP_PROP_FPS):獲取視頻幀率(每秒播放的幀數(shù));
  • cv2.imwrite(img_path, frame):將幀圖像保存為圖片文件;
  • 核心參數(shù)調(diào)整:
    • frame_interval(方案1):幀間隔,數(shù)值越大提取圖片越少,推薦30(對(duì)應(yīng)1秒1張);
    • time_interval(方案2):時(shí)間間隔,按需設(shè)置(如0.5=每0.5秒1張,5.0=每5秒1張)。

2. 實(shí)用優(yōu)化點(diǎn)

  • 文件夾自動(dòng)創(chuàng)建:無需手動(dòng)創(chuàng)建輸出文件夾,代碼會(huì)自動(dòng)判斷并創(chuàng)建;
  • 文件名補(bǔ)零對(duì)齊:圖片名格式為frame_0001.jpg,方便后續(xù)標(biāo)注軟件按順序加載;
  • 格式靈活選擇:支持jpg(占用空間?。┖?code>png(無損壓縮,適合高精度標(biāo)注);
  • 進(jìn)度打印:實(shí)時(shí)打印保存路徑,方便查看轉(zhuǎn)換進(jìn)度;
  • 資源釋放:使用cap.release()釋放視頻資源,避免內(nèi)存泄漏。

五、使用注意事項(xiàng)

  1. 視頻路徑問題
    • 若使用相對(duì)路徑,需將視頻文件放在Python腳本同一目錄下;
    • 絕對(duì)路徑示例(Windows):"D:/videos/test.mp4",(Linux/Mac):"/home/user/videos/test.mp4";
  2. 圖片冗余控制
    • 標(biāo)注時(shí)無需提取所有幀,建議按1~3秒間隔提取,避免圖片過多增加標(biāo)注工作量;
    • 若視頻畫面變化緩慢(如監(jiān)控視頻),可增大間隔(如5~10秒);
  3. 編碼問題處理
    • 若出現(xiàn)“無法打開視頻”或“保存圖片失敗”,大概率是視頻編碼不兼容,可先用FFmpeg轉(zhuǎn)換為MP4格式(ffmpeg -i input.avi -c:v libx264 output.mp4);
  4. 內(nèi)存占用
    • 處理超長(zhǎng)視頻時(shí),無需擔(dān)心內(nèi)存溢出,代碼逐幀讀取并保存,不會(huì)緩存全部幀。

六、標(biāo)注工具推薦

轉(zhuǎn)換后的圖片可使用以下主流標(biāo)注工具進(jìn)行標(biāo)注:

  1. LabelImg:輕量級(jí)圖形化標(biāo)注工具,支持VOC/YOLO格式,適合目標(biāo)檢測(cè)標(biāo)注;
  2. LabelMe:支持多邊形、關(guān)鍵點(diǎn)等復(fù)雜標(biāo)注,適合語(yǔ)義分割、實(shí)例分割標(biāo)注;
  3. CVAT:工業(yè)級(jí)標(biāo)注平臺(tái),支持批量標(biāo)注、多人協(xié)作,適合大規(guī)模數(shù)據(jù)集標(biāo)注。

以上就是Python實(shí)現(xiàn)視頻轉(zhuǎn)圖片的兩種方案的詳細(xì)內(nèi)容,更多關(guān)于Python視頻轉(zhuǎn)圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python解析中國(guó)天氣網(wǎng)的天氣數(shù)據(jù)

    python解析中國(guó)天氣網(wǎng)的天氣數(shù)據(jù)

    最近學(xué)習(xí)python 感覺這門腳本語(yǔ)言十分靈活 而且功能十分強(qiáng)大 尤其是他re庫(kù)用于正則匹配十分強(qiáng)大,寫了個(gè)例子解析中國(guó)天氣網(wǎng)
    2014-03-03
  • Python文件操作中進(jìn)行字符串替換的方法(保存到新文件/當(dāng)前文件)

    Python文件操作中進(jìn)行字符串替換的方法(保存到新文件/當(dāng)前文件)

    這篇文章主要介紹了Python文件操作中進(jìn)行字符串替換的方法(保存到新文件/當(dāng)前文件) ,本文給大家介紹兩種方法,每種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Windows下多版本Python共享Poetry測(cè)試安裝

    Windows下多版本Python共享Poetry測(cè)試安裝

    這篇文章主要為大家介紹了Windows下多版本Python共享Poetry的測(cè)試安裝配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Python實(shí)現(xiàn)的基數(shù)排序算法原理與用法實(shí)例分析

    Python實(shí)現(xiàn)的基數(shù)排序算法原理與用法實(shí)例分析

    這篇文章主要介紹了Python實(shí)現(xiàn)的基數(shù)排序算法,簡(jiǎn)單說明了基數(shù)排序的原理并結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)與使用基數(shù)排序的具體操作技巧,需要的朋友可以參考下
    2017-11-11
  • python中argparse模塊用法詳解(小白入門)

    python中argparse模塊用法詳解(小白入門)

    argparse是Python標(biāo)準(zhǔn)庫(kù)中用于解析命令行參數(shù)的模塊,提供了一種簡(jiǎn)單而靈活的方式來處理命令行輸入,并幫助用戶構(gòu)建具有參數(shù)選項(xiàng)和幫助信息的命令行界面,這篇文章主要介紹了python中argparse模塊用法的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • python機(jī)器學(xué)習(xí)高數(shù)篇之泰勒公式

    python機(jī)器學(xué)習(xí)高數(shù)篇之泰勒公式

    這篇文章主要介紹了python機(jī)器學(xué)習(xí)高數(shù)篇之函數(shù)極限和導(dǎo)數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • PyQt5事件處理之定時(shí)在控件上顯示信息的代碼

    PyQt5事件處理之定時(shí)在控件上顯示信息的代碼

    這篇文章主要介紹了PyQt5事件處理之定時(shí)在控件上顯示信息的代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python實(shí)用技巧之利用元組代替字典并為元組元素命名

    Python實(shí)用技巧之利用元組代替字典并為元組元素命名

    這篇文章主要給大家介紹了關(guān)于Python實(shí)用技巧之利用元組代替字典并為元組元素命名的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-07-07
  • Python批量寫入數(shù)據(jù)到PostgreSQL三種主流方案對(duì)比詳解

    Python批量寫入數(shù)據(jù)到PostgreSQL三種主流方案對(duì)比詳解

    本文對(duì)比了Python結(jié)合PostgreSQL三種主流方案(executemany()、COPY命令、pandas.to_sql())在百萬(wàn)級(jí)和千萬(wàn)級(jí)數(shù)據(jù)寫入場(chǎng)景下的性能,并提出了優(yōu)化建議,包括預(yù)處理語(yǔ)句、多線程并行寫入等,需要的朋友可以參考下
    2026-01-01
  • Python繪制全球疫情變化地圖的實(shí)例代碼

    Python繪制全球疫情變化地圖的實(shí)例代碼

    這篇文章主要介紹了使用Python繪制全球疫情變化地圖的實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

藁城市| 休宁县| 麻城市| 凤阳县| 临潭县| 堆龙德庆县| 景泰县| 扬中市| 江山市| 石狮市| 乐山市| 巴林右旗| 墨竹工卡县| 稷山县| 新蔡县| 霍林郭勒市| 疏附县| 资溪县| 萨嘎县| 开原市| 临城县| 城步| 井研县| 大竹县| 金川县| 新昌县| 阳西县| 泽州县| 蕉岭县| 兴安县| 绩溪县| 安远县| 南平市| 潼南县| 和龙市| 绥化市| 波密县| 惠来县| 安顺市| 清徐县| 剑阁县|