文章可以转载,但是必须表明出处!
在之前学习了使用Intel Realsense D435深度相机,拍摄RGB颜色图及16位深度图。
实现了以深度图和RGB颜色图为图像帧的视频显示、录制与保存。
基于实践需求,需要将视频分解为连续的图像帧,程序如下:
首先是普通视频就RGB视频进行图像抽帧,将视频分解成连续的图像帧:
import cv2 #引入图像处理与系统操作的库
import os
def process_rgb_video(i_video, o_video): # 定义抽帧函数
cap = cv2.VideoCapture(i_video) # 获取视频
expand_name = '_rgb.png' # 分解后图片名称后缀
if not cap.isOpened(): # 视频路径检测
print("Please check the path.")
cnt = 0
count = 0
num = 1
while 1:
ret, frame = cap.read() # 获取图像帧
cnt += 1 # 保存每一帧,修改参数连续5帧后抽取一帧并保存该帧图片,具体由使用者设置
if cnt % num == 0:
count += 1
cv2.imwrite(os.path.join(o_video, str(count) + expand_name), frame)
if not ret:
cap.close() # 遍历完视频帧后退出
break
if __name__ == '__main__':
# 读取视频路径,需要根据本地情况进行修改
input_rgb = r'D:\Pycharm\code\realsensecamera\targetvideo_rgb.mp4'
# 输出图像帧路径,可根据需求进行修改
output_rgb = r'D:\Pycharm\code\realsensecamera\rgb'
# 创建输出路径文件夹
if os.path.exists(output_rgb):
print('rgb文件夹存在')
else:
print('rgb文件夹缺失,自动创建 ')
os.mkdir(output_rgb)
# 调用图像抽帧函数,分解RGB视频
process_rgb_video(input_rgb, output_rgb)
后续为16位深度图视频分解,其中调用了h5py来读取并分解16位深度图视频:
import os
import h5py # 用于16位深度图视频的读取与分解
import cv2
import numpy as np
def h52img(input_depth, output_depth):
# input_depth : h5文件路径
# output_depth: 图片文件路径
h5 = h5py.File(input_depth, 'r') # 读取深度图视频
os.path.join(output_depth)
cnt = 0
for key in h5.keys():
cnt = cnt + 1 # 每一帧都进行深度图保存
img = cv2.imdecode(np.array(h5[key]), -1) # 16位深度图解码
img_name = str(cnt) + '_depth'+'.png' # 自定义的深度图文件名称
cv2.imwrite(os.path.join(output_depth, img_name), img) # 以png格式保存深度图
h5.close()
if __name__ == '__main__':
# 目标深度图视频读取路径,需要根据本地情况进行修改
input_depth = r'D:\Pycharm\code\DepthCamera\targetvideo_depth.h5'
# 深度图图像帧保存路径
output_depth = r'D:\Pycharm\code\DepthCamera\depth'
# 创建保存路径对应的文件夹
if os.path.exists(output_depth):
print('depth文件夹存在')
else:
print('depth文件夹缺失,自动创建 ')
os.mkdir(output_depth)
# 调用视频分解函数,将目标视频分解为图像帧
h52img(input_depth, output_depth)
以上为视频分解的总体代码,可将获取的RGB与深度图视频分解为连续图像帧。
后续则会根据对应的RGB和深度图图像帧进行点云处理。