機器視覺 OpenCV—python 影象資料集獲取工具(視訊取幀)
阿新 • • 發佈:2019-02-03
一、前言
之前在做影象分類的時候,人臉識別(開原始碼)的練手,資料集獲取麻煩(沒人願意將自己照片給人家做資料集),於是就用自己造資料集,但是拍照拍幾百張訓練效果不好,也嫌麻煩,乾脆就是視訊取幀的方式,在這之前使用專門的軟體。不過opencv自帶了視訊處理的API,詳細程式碼如下:
二、視訊取幀程式碼
import cv2
import os
import sys
input_path = sys.argv[1] # 第一個輸入引數是包含視訊片段的路徑
frame_interval = int(sys.argv[2]) # 第二個輸入引數是設定每隔多少幀擷取一幀
filenames = os.listdir(input_path) # 列出資料夾下所有的視訊檔案
video_prefix = input_path.split(os.sep)[-1] # 獲取資料夾名稱
frame_path = '{}_frames'.format(input_path) # 新建資料夾,名稱為原名加上_frames
if not os.path.exists(frame_path):
os.mkdir(frame_path)
cap = cv2.VideoCapture() # 初始化一個VideoCapture物件
for filename in filenames:
filepath = os.sep.join([input_path, filename])
cap.open(filepath) # VideoCapture::open函式可以從檔案獲取視訊
n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 獲取視訊幀數
for i in range(42): # 為了避免視訊頭幾幀質量低下,黑屏或者無關等
cap. read()
for i in range(n_frames):
ret, frame = cap.read()
# 每隔frame_interval幀進行一次截圖操作
if i % frame_interval == 0:
imagename = '{}_{}_{:0>6d}.jpg'.format(video_prefix, filename.split('.')[0], i)
imagepath = os.sep.join([frame_path, imagename])
print('exported {}!'.format(imagepath))
cv2.imwrite(imagepath, frame)
cap.release() # 執行結束釋放資源