Python實現(xiàn)視頻轉圖片的兩種方案
更新時間:2026年02月28日 09:15:00 作者:liwulin0506
文章介紹了兩種Python視頻轉圖片的方案,方案1按幀提取,方案2按時間間隔提取,核心功能包括關鍵函數(shù)與參數(shù)的說明、實用優(yōu)化點和使用注意事項,標注工具推薦包括LabelImg、LabelMe和CVAT,需要的朋友可以參考下
一、前期準備:安裝依賴庫
核心使用 opencv-python(OpenCV)庫處理視頻和圖像,這是Python視覺處理的主流庫,先通過pip安裝:
二、方案1:基礎版 - 按幀提?。ㄌ崛∷袔?每隔N幀提取)
適合大多數(shù)標注場景,可靈活設置提取間隔,避免圖片過多冗余。
完整代碼
import cv2
import os
def video_to_images_basic(
video_path, # 輸入視頻文件路徑(如:test.mp4)
output_dir, # 輸出圖片文件夾路徑
frame_interval=30, # 提取間隔:每30幀提取1張(默認30幀,對應1秒/幀,可調整)
img_format="jpg", # 輸出圖片格式(jpg/png,推薦jpg,占用空間?。?
img_prefix="frame" # 圖片文件名前綴(如:frame_0001.jpg)
):
# 1. 創(chuà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},預計提取圖片數(shù)={total_frames//frame_interval + 1}")
# 4. 循環(huán)提取幀并保存
frame_count = 0 # 當前幀計數(shù)器
saved_count = 0 # 已保存圖片計數(shù)器
while True:
# 讀取一幀視頻
ret, frame = cap.read()
# 若讀取失?。ㄒ训揭曨l末尾),退出循環(huán)
if not ret:
break
# 按間隔提取幀
if frame_count % frame_interval == 0:
# 構造圖片文件名(補零對齊,方便排序)
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轉換完成!共保存 {saved_count} 張圖片,存儲路徑:{output_dir}")
# ------------------- 調用示例 -------------------
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í)行轉換
video_to_images_basic(
video_path=VIDEO_PATH,
output_dir=OUTPUT_DIR,
frame_interval=FRAME_INTERVAL,
img_format="jpg"
)
三、方案2:進階版 - 按時間間隔提取(更精準可控)
適合需要按固定時間間隔(如每2秒提取1張)的場景,比按幀間隔更直觀,不受視頻幀率影響。
完整代碼
import cv2
import os
def video_to_images_by_time(
video_path, # 輸入視頻文件路徑
output_dir, # 輸出圖片文件夾路徑
time_interval=1.0, # 時間間隔:每1.0秒提取1張(可調整,如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 # 視頻總時長(秒)
frame_interval = int(fps * time_interval) # 換算為幀間隔
print(f"視頻信息:總幀數(shù)={total_frames},幀率={fps:.2f},總時長={video_duration:.2f}秒")
print(f"時間間隔={time_interval}秒,對應幀間隔={frame_interval}幀,預計提取圖片數(shù)={int(video_duration//time_interval) + 1}")
# 4. 循環(huán)提取幀并保存
frame_count = 0
saved_count = 0
last_saved_time = 0.0 # 上一次保存圖片的時間
while True:
ret, frame = cap.read()
if not ret:
break
# 獲取當前幀對應的時間(秒)
current_time = frame_count / fps
# 按時間間隔保存
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"時間{current_time:.2f}秒:已保存 {img_path}")
saved_count += 1
last_saved_time = current_time
frame_count += 1
# 5. 釋放資源
cap.release()
print(f"\n轉換完成!共保存 {saved_count} 張圖片,存儲路徑:{output_dir}")
# ------------------- 調用示例 -------------------
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. 關鍵函數(shù)與參數(shù)
cv2.VideoCapture(video_path):打開視頻文件,返回視頻捕獲對象;cap.read():讀取一幀視頻,返回(ret, frame),ret為布爾值(是否讀取成功),frame為當前幀圖像(numpy數(shù)組);cap.get(cv2.CAP_PROP_FRAME_COUNT):獲取視頻總幀數(shù);cap.get(cv2.CAP_PROP_FPS):獲取視頻幀率(每秒播放的幀數(shù));cv2.imwrite(img_path, frame):將幀圖像保存為圖片文件;- 核心參數(shù)調整:
frame_interval(方案1):幀間隔,數(shù)值越大提取圖片越少,推薦30(對應1秒1張);time_interval(方案2):時間間隔,按需設置(如0.5=每0.5秒1張,5.0=每5秒1張)。
2. 實用優(yōu)化點
- 文件夾自動創(chuàng)建:無需手動創(chuàng)建輸出文件夾,代碼會自動判斷并創(chuàng)建;
- 文件名補零對齊:圖片名格式為
frame_0001.jpg,方便后續(xù)標注軟件按順序加載; - 格式靈活選擇:支持
jpg(占用空間?。┖?code>png(無損壓縮,適合高精度標注); - 進度打印:實時打印保存路徑,方便查看轉換進度;
- 資源釋放:使用
cap.release()釋放視頻資源,避免內存泄漏。
五、使用注意事項
- 視頻路徑問題:
- 若使用相對路徑,需將視頻文件放在Python腳本同一目錄下;
- 絕對路徑示例(Windows):
"D:/videos/test.mp4",(Linux/Mac):"/home/user/videos/test.mp4";
- 圖片冗余控制:
- 標注時無需提取所有幀,建議按1~3秒間隔提取,避免圖片過多增加標注工作量;
- 若視頻畫面變化緩慢(如監(jiān)控視頻),可增大間隔(如5~10秒);
- 編碼問題處理:
- 若出現(xiàn)“無法打開視頻”或“保存圖片失敗”,大概率是視頻編碼不兼容,可先用FFmpeg轉換為MP4格式(
ffmpeg -i input.avi -c:v libx264 output.mp4);
- 若出現(xiàn)“無法打開視頻”或“保存圖片失敗”,大概率是視頻編碼不兼容,可先用FFmpeg轉換為MP4格式(
- 內存占用:
- 處理超長視頻時,無需擔心內存溢出,代碼逐幀讀取并保存,不會緩存全部幀。
六、標注工具推薦
轉換后的圖片可使用以下主流標注工具進行標注:
- LabelImg:輕量級圖形化標注工具,支持VOC/YOLO格式,適合目標檢測標注;
- LabelMe:支持多邊形、關鍵點等復雜標注,適合語義分割、實例分割標注;
- CVAT:工業(yè)級標注平臺,支持批量標注、多人協(xié)作,適合大規(guī)模數(shù)據(jù)集標注。
以上就是Python實現(xiàn)視頻轉圖片的兩種方案的詳細內容,更多關于Python視頻轉圖片的資料請關注腳本之家其它相關文章!
相關文章
python解析中國天氣網(wǎng)的天氣數(shù)據(jù)
最近學習python 感覺這門腳本語言十分靈活 而且功能十分強大 尤其是他re庫用于正則匹配十分強大,寫了個例子解析中國天氣網(wǎng)2014-03-03
Python文件操作中進行字符串替換的方法(保存到新文件/當前文件)
這篇文章主要介紹了Python文件操作中進行字符串替換的方法(保存到新文件/當前文件) ,本文給大家介紹兩種方法,每種方法給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06
Python實現(xiàn)的基數(shù)排序算法原理與用法實例分析
這篇文章主要介紹了Python實現(xiàn)的基數(shù)排序算法,簡單說明了基數(shù)排序的原理并結合實例形式分析了Python實現(xiàn)與使用基數(shù)排序的具體操作技巧,需要的朋友可以參考下2017-11-11
Python批量寫入數(shù)據(jù)到PostgreSQL三種主流方案對比詳解
本文對比了Python結合PostgreSQL三種主流方案(executemany()、COPY命令、pandas.to_sql())在百萬級和千萬級數(shù)據(jù)寫入場景下的性能,并提出了優(yōu)化建議,包括預處理語句、多線程并行寫入等,需要的朋友可以參考下2026-01-01

