§ 2.4 Astra 3D相机对象初始化

0. 概要

本文介绍了Astra 3D相机对象创建以及视频流初始化等相关操作。

1. 导入依赖

# - 矩阵运算
import numpy as np
# - 图像处理
import cv2 
# - Open3D点云处理
import open3d as o3d
# - 绘图可视化
from matplotlib import pyplot as plt
  • numpy :Astra SDK获取的图像以及深度图的数据结构是 numpy 的ndarray对象,包括点云数据的部分操作也是通过 numpy 进行
  • cv2 :使用OpenCV实现2D彩图的读取、保存,以及图像处理
  • open3d :Open3D点云处理库
  • matplotlib :在Jupyter Notebook里面实验,可以使用Matplotlib进行图片的可视化。如果是py脚本也可以直接使用OpenCV自带的HighGUI组件
# 自定义库
# - Astra 3D相机类
from astra import Astra
  • astra :Astra 3D相机对象类

2. 创建相机对象

创建Astra相机对象

# 创建相机对象
camera = Astra()

3. 视频流初始化

初始化视频流,默认创建是 彩图+深度图(对齐后) 的视频流

# 初始相机
camera.init_video_stream()

来看一下 init_video_stream 的函数原型:

class Astra:
    '''略'''
    
	def init_video_stream(self, video_mode="color_depth", \
	 			image_registration=True):
		'''初始化视频流
  		@video_mode: 视频流模式
			* "color": 彩图
   			* "color_depth": 彩图与深度图
			* "depth": 深度图
			* "ir": IR图
			* "ir_depth": IR图与深度图
			注: 受限于OpenNI2, 彩图与IR图不能同时获取
		@image_registration: 图像对齐
			深度图与彩图对齐
	 	'''

不同视频流格式示例

如果只需要彩色相机拍摄的2D彩图,可以只创建彩图的视频流。

# 初始相机
camera.init_video_stream(video_mode="color")

如果只需要深度图,可以只创建深度图的视频流。

  • 获取彩色相机坐标系下的深度图 (对齐后的深度图)

    camera.init_video_stream(video_mode="depth", image_registration=True)
    
  • 获取IR相机坐标系下的深度图 (未对齐的深度图)

    camera.init_video_stream(video_mode="depth", image_registration=False)
    

如果只需要红外相机拍摄的IR图,可以只创建IR图的视频流。

camera.init_video_stream(video_mode="ir")

同时获取彩图与深度图,默认获取的是对齐后的彩色相机坐标系下的深度图

# 初始相机
camera.init_video_stream(video_mode="color_depth")

同时获取IR图与深度图,指定为获取未对齐的IR相机坐标系下的深度图

# 初始相机
camera.init_video_stream(video_mode="ir_depth", image_registration=False)

4. 载入相机标定参数

载入相机标定的结果,包括彩色相机与IR相机的内参与畸变系数等信息。

# 读取相机参数(相机内参)
camera.load_cam_calib_data()

将深度图转换为点云需要相机内参的信息,因此如果想获取点云则需要先载入相机标定的数据。

5. 释放相机对象

视频流初始化函数 init_video_stream() 只能被初始化一次,如果你要退出程序或者切换为其他的视频流格式之前都需要释放相机。

# 释放相机对象
camera.release()