1. 程式人生 > >機器視覺 OpenCV—python 影象資料集獲取工具(視訊取幀)

機器視覺 OpenCV—python 影象資料集獲取工具(視訊取幀)

一、前言

之前在做影象分類的時候,人臉識別(開原始碼)的練手,資料集獲取麻煩(沒人願意將自己照片給人家做資料集),於是就用自己造資料集,但是拍照拍幾百張訓練效果不好,也嫌麻煩,乾脆就是視訊取幀的方式,在這之前使用專門的軟體。不過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() # 執行結束釋放資源