Python實(shí)現(xiàn)視頻轉(zhuǎn)圖片的兩種方案
一、前期準(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)
- 視頻路徑問題:
- 若使用相對(duì)路徑,需將視頻文件放在Python腳本同一目錄下;
- 絕對(duì)路徑示例(Windows):
"D:/videos/test.mp4",(Linux/Mac):"/home/user/videos/test.mp4";
- 圖片冗余控制:
- 標(biāo)注時(shí)無需提取所有幀,建議按1~3秒間隔提取,避免圖片過多增加標(biāo)注工作量;
- 若視頻畫面變化緩慢(如監(jiān)控視頻),可增大間隔(如5~10秒);
- 編碼問題處理:
- 若出現(xiàn)“無法打開視頻”或“保存圖片失敗”,大概率是視頻編碼不兼容,可先用FFmpeg轉(zhuǎn)換為MP4格式(
ffmpeg -i input.avi -c:v libx264 output.mp4);
- 若出現(xiàn)“無法打開視頻”或“保存圖片失敗”,大概率是視頻編碼不兼容,可先用FFmpeg轉(zhuǎn)換為MP4格式(
- 內(nèi)存占用:
- 處理超長(zhǎng)視頻時(shí),無需擔(dān)心內(nèi)存溢出,代碼逐幀讀取并保存,不會(huì)緩存全部幀。
六、標(biāo)注工具推薦
轉(zhuǎn)換后的圖片可使用以下主流標(biāo)注工具進(jìn)行標(biāo)注:
- LabelImg:輕量級(jí)圖形化標(biāo)注工具,支持VOC/YOLO格式,適合目標(biāo)檢測(cè)標(biāo)注;
- LabelMe:支持多邊形、關(guān)鍵點(diǎn)等復(fù)雜標(biāo)注,適合語(yǔ)義分割、實(shí)例分割標(biāo)注;
- 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ù)
最近學(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)前文件) ,本文給大家介紹兩種方法,每種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
Windows下多版本Python共享Poetry測(cè)試安裝
這篇文章主要為大家介紹了Windows下多版本Python共享Poetry的測(cè)試安裝配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
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機(jī)器學(xué)習(xí)高數(shù)篇之泰勒公式
這篇文章主要介紹了python機(jī)器學(xué)習(xí)高數(shù)篇之函數(shù)極限和導(dǎo)數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Python實(shí)用技巧之利用元組代替字典并為元組元素命名
這篇文章主要給大家介紹了關(guān)于Python實(shí)用技巧之利用元組代替字典并為元組元素命名的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-07-07
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

