往期的博客我们简单的讲了什么是视频数据、会用什么方式加载视频数据并介绍了加载视频数据会用到的工具,这期博客我们开始实际的对视频数据做处理,文章内容:获取视频的信息、加载视频数据做处理、保存视频数据。
获取视频帧数与帧率
上期博客中讲了图像分辨率和帧率的重要性,也是说明对一些高帧率视频需要做降采样,我们接下来就举个例子说明一下。假设我们有一部视频时长为1小时的影片,我们可以通过属性去观看数据的信息,但这对大规模数据来说并不是一个好的方法,那么我们使用opencv来实现这个功能。
import cv2
if __name__ == "__main__":
video_path = "视频路径"
cap = cv2.VideoCapture(video_path)
# 视频总的帧数
frame_num = cap.get(7)
# 图片帧率
fps = cap.get(5)
while True:
ret, frame = cap.read()
print(f"视频帧率{fps} 视频总帧数{frame_num } 视频分辨率{frame.shape}")
通过上面的代码我们就可以获取到视频的帧率、帧数、分辨率。其中的帧率、帧数和影片时长是相关的,相关计算公式如下:视频时长 = 视频帧数 / 视频帧率。如果我们的影片帧率较高,假设有60fps,但我们只想要采样20fps,这时候就需要对数据做处理了,相关计算公式如下:跳帧数 = 当前视频帧率 / 目标视频帧率 = 60 / 20 = 3(每间隔三张图片数据做一次采样)
加载视频数据并保存成npy格式
我们在上面列举了目标采样率的计算方式,接下来我们把它应用上,将数据转换成npy格式进行存储(npy格式加载速度更快)。
import cv2
import numpy as np
if __name__ == "__main__":
video_path = "视频路径"
cap = cv2.VideoCapture(video_path)
# 获取帧率
fps = int(cap.get(5))
frame_lists = []
while True:
ret, frame = cap.read()
if not(ret):
break
# 对图片数据做缩小,缩小为224*224
frame = cv2.resize(frame, (224, 224))
# 将三维数据转换为一维
frame_array = frame.reshape(-1)
frame_lists.append(frame_array)
# 根据视频帧率和目标帧率计算采样周期
interval = int(fps / 20)
frame_lists = np.array(frame_lists)[::interval]
# 保存数据
np.save("npy文件保存地址", frame_lists)
结尾
感谢您的观看,觉得写的还可以请帮忙点个赞和收藏!