在这篇博客中,我们将使用Python从一段小视频中提取图像。为此,我们将使用开源的OpenCV库。
什么是OpenCV?
OpenCV(开源计算机视觉库:http://opencv.org)是一个包含数百种计算机视觉算法的开源库。OpenCV具有模块化结构,这意味着该包包含几个共享或静态库。以下是可用的模块:
- 核心功能(core) - 一个定义基本数据结构的紧凑模块,包括密集的多维数组Mat和所有其他模块使用的基本功能。
- 图像处理(imgproc) - 一个图像处理模块,包括线性和非线性图像滤波、几何图像变换(缩放、仿射和透视变形、通用表格重映射)、颜色空间转换、直方图等。
- 视频分析(video) - 一个视频分析模块,包括运动估计、背景减除和目标跟踪算法。
- 相机校准和3D重建(calib3d) - 基本的多视图几何算法、单目和立体相机校准、目标姿态估计、立体对应算法和3D重建元素。
- 2D特征框架(features2d) - 显著特征检测器、描述符和描述符匹配器。
- 目标检测(objdetect) - 检测预定义类别的对象和实例(例如,面部、眼睛、杯子、人、汽车等)。
- 高级GUI(highgui) - 一个简单易用的简单UI功能接口。
- 视频I/O(videoio) - 一个简单易用的视频捕获和视频编解码器接口。
- ...一些其他辅助模块,如FLANN和Google测试包装器、Python绑定等。
文档的后续章节描述了每个模块的功能。但首先,请确保熟悉在库中广泛使用的常见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>
创建一个文件夹来保存图像
我们将创建一个名为‘image_data’的文件夹,如果它不存在。为了创建新目录,我们将使用OS包。
import os
try:
if not os.path.exists('image_data'):
os.makedirs('image_data')
except OSError:
print ('Error: Creating directory of image data')
读取视频帧并创建图像:
help(cam.read)
输出:
help(cv2.imwrite)
currentframe = 0
while(True):
# 从帧中读取
retval, image = cam.read()
if retval:
# 创建图像
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
输出: