使用 OpenCV 從 Python 視頻中提取圖像
在這篇博客中,我們將使用Python從一段小視頻中提取圖像。為此,我們將使用開源的OpenCV庫。
什么是OpenCV?
OpenCV(開源計算機視覺庫:http://opencv.org)是一個包含數(shù)百種計算機視覺算法的開源庫。OpenCV具有模塊化結(jié)構,這意味著該包包含幾個共享或靜態(tài)庫。以下是可用的模塊:
- 核心功能(core) - 一個定義基本數(shù)據(jù)結(jié)構的緊湊模塊,包括密集的多維數(shù)組Mat和所有其他模塊使用的基本功能。
- 圖像處理(imgproc) - 一個圖像處理模塊,包括線性和非線性圖像濾波、幾何圖像變換(縮放、仿射和透視變形、通用表格重映射)、顏色空間轉(zhuǎn)換、直方圖等。
- 視頻分析(video) - 一個視頻分析模塊,包括運動估計、背景減除和目標跟蹤算法。
- 相機校準和3D重建(calib3d) - 基本的多視圖幾何算法、單目和立體相機校準、目標姿態(tài)估計、立體對應算法和3D重建元素。
- 2D特征框架(features2d) - 顯著特征檢測器、描述符和描述符匹配器。
- 目標檢測(objdetect) - 檢測預定義類別的對象和實例(例如,面部、眼睛、杯子、人、汽車等)。
- 高級GUI(highgui) - 一個簡單易用的簡單UI功能接口。
- 視頻I/O(videoio) - 一個簡單易用的視頻捕獲和視頻編解碼器接口。
- ...一些其他輔助模塊,如FLANN和Google測試包裝器、Python綁定等。
文檔的后續(xù)章節(jié)描述了每個模塊的功能。但首先,請確保熟悉在庫中廣泛使用的常見API概念。
使用pip安裝:
pip install opencv-python
導入包:
import cv2
檢查VideoCapture類的幫助:
help(cv2.VideoCapture())
聲明視頻的路徑:
video_path = "input/extract-images-from-a-video-in-python/sample-video.mp4"
video_path
輸出:‘input/extract-images-from-a-video-in-python/sample-video.mp4’
從路徑讀取視頻:
cam = cv2.VideoCapture(video_path)
cam
輸出:< cv2.VideoCapture 00000209D0E99FB0>
創(chuàng)建一個文件夾來保存圖像
我們將創(chuàng)建一個名為‘image_data’的文件夾,如果它不存在。為了創(chuàng)建新目錄,我們將使用OS包。
import os
try:
if not os.path.exists('image_data'):
os.makedirs('image_data')
except OSError:
print ('Error: Creating directory of image data')
讀取視頻幀并創(chuàng)建圖像:
help(cam.read)
輸出:
help(cv2.imwrite)
currentframe = 0
while(True):
# 從幀中讀取
retval, image = cam.read()
if retval:
# 創(chuàng)建圖像
name = './image_data/image' + str(currentframe) + '.jpg'
print ('Creating...' + name)
# 寫入提取的圖像
cv2.imwrite(name, image)
currentframe += 1
else:
break
# 釋放空間
cam.release()
# 銷毀所有窗口
cv2.destroyAllWindows()
輸出:
我們可以看到,從視頻中捕獲了85張圖像。
列出捕獲的圖像:
import os
path = "image_data"
images_list = os.listdir(path)
print("Files and directories in '", path, "' :")
print(images_list)
輸出:
查看前20張圖像:
import matplotlib.pyplot as plt
import PIL
plt.figure(figsize = (12,8))
for num, item in enumerate(images_list[:20]):
img = PIL.Image.open("image_data/" + item)
plt.subplot(4, 5, num + 1)
plt.axis('off')
plt.imshow(img, aspect='auto')
pass
輸出: