使用 OpenCV 從 Python 視頻中提取圖像
在這篇博客中,我們將使用Python從一段小視頻中提取圖像。為此,我們將使用開源的OpenCV庫。
什么是OpenCV?
OpenCV(開源計(jì)算機(jī)視覺庫:http://opencv.org)是一個(gè)包含數(shù)百種計(jì)算機(jī)視覺算法的開源庫。OpenCV具有模塊化結(jié)構(gòu),這意味著該包包含幾個(gè)共享或靜態(tài)庫。以下是可用的模塊:
- 核心功能(core) - 一個(gè)定義基本數(shù)據(jù)結(jié)構(gòu)的緊湊模塊,包括密集的多維數(shù)組Mat和所有其他模塊使用的基本功能。
- 圖像處理(imgproc) - 一個(gè)圖像處理模塊,包括線性和非線性圖像濾波、幾何圖像變換(縮放、仿射和透視變形、通用表格重映射)、顏色空間轉(zhuǎn)換、直方圖等。
- 視頻分析(video) - 一個(gè)視頻分析模塊,包括運(yùn)動(dòng)估計(jì)、背景減除和目標(biāo)跟蹤算法。
- 相機(jī)校準(zhǔn)和3D重建(calib3d) - 基本的多視圖幾何算法、單目和立體相機(jī)校準(zhǔn)、目標(biāo)姿態(tài)估計(jì)、立體對(duì)應(yīng)算法和3D重建元素。
- 2D特征框架(features2d) - 顯著特征檢測器、描述符和描述符匹配器。
- 目標(biāo)檢測(objdetect) - 檢測預(yù)定義類別的對(duì)象和實(shí)例(例如,面部、眼睛、杯子、人、汽車等)。
- 高級(jí)GUI(highgui) - 一個(gè)簡單易用的簡單UI功能接口。
- 視頻I/O(videoio) - 一個(gè)簡單易用的視頻捕獲和視頻編解碼器接口。
- ...一些其他輔助模塊,如FLANN和Google測試包裝器、Python綁定等。
文檔的后續(xù)章節(jié)描述了每個(gè)模塊的功能。但首先,請確保熟悉在庫中廣泛使用的常見API概念。
使用pip安裝:
pip install opencv-python
導(dǎo)入包:
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)建一個(gè)文件夾來保存圖像
我們將創(chuàng)建一個(gè)名為‘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
輸出: