Astra 3D相机 - Python SDK使用手册

1. Astra S 3D相机

Astra S 是目前性价比很高的消费级单目结构光3D相机,适合入门3D点云处理使用。大家可以在我们的淘宝店铺 阿凯爱玩机器人 购买。

Astra S 淘宝购买链接 奥比中光深度相机3D机器视觉结构光立体摄像头三维点云体感摄影头

如果需要精度更高的工业3D相机,可以选购店铺中的 RVC X Mini 双目结构光3D相机

本课程的配套源码,可以联系阿凯老师获取。

2. 修改相机配置文件

配套实验代码路径: 02.Astra-3D相机-Python SDK/astra-camera-python/

阿凯开发了基于Open3D的Astra 3D相机的SDK,对OpenNI2的Python SDK做了二次封装。

需要注意的是,因为Windows下,必须填写OpenNI2动态链接库的安装路径,因此需要做一下相关配置。

通过VSCode或者其他文本编辑器,编辑相机的配置文件。

openni2_dll_path 变量,修改为自己的dll安装路径。

需要注意的是在Windows下,路径中文件夹与文件夹之间,需要使用两个反斜杠 \\

image-20220720174913608

config/camera.yaml

#############################
## 相机的默认参数
############################# 
# OpenNI动态链接库的安装路径
# 如果是Windows, 需要修改为OpenNI的安装路径
# 如果是Linux, 将openni2_dll_path赋值为空字符串
# openni2_dll_path = ""
openni2_dll_path: "D:\\KyleSoftware\\OpenNI2\\libs"
# 画面宽度
img_width: 640
# 画面高度 
img_height: 480
# 相机帧率
fps: 30

3. RGB图与深度图预览

注意:如果你使用的是Windows,需要把命令行里的 python3 改为 python

python3 astra.py

效果视频,见 video/AstraS读取RGB图与深度图的效果.webm

4. 相机标定

4.1 制作标定板

将源码文件根目录的 Radon相机标定板.svg 按照原尺寸,打印到A4纸上,并粘至硬板上。

4.2 采集标定板图像

python3 astra.py --img_path data/caliboard

S 键保存图像,采集20-30张图像。在采集前,请先将 data/caliboard 文件夹里面的图像删除。

4.3 修改标定板参数

修改 config/camera_calibration.yaml 为实际值。

#############################
## 相机标定的参数
#############################
caliboard :         # 标定板
  row : 9           # 行数
  column : 14       # 列数
  ceil_size : 12.0  # 格子的尺寸,单位mm
  type: "radon"     # 标定板类型
cali_img_source_path: 'data/caliboard' # 标定图像的存储路径
cali_info_save_path : 'config' # 相机标定信息存储路径

注:只需要修改 ceil_size ,将其修改为实际测量尺寸。

4.4 相机标定

执行相机标定脚本

python3 camera_calibration.py 

输出日志

a-camera-python$ python3 camera_calibration.py 
检测到28张标定图像
相机内参 intrinsic
[[517.838   0.    331.957]
[  0.    517.841 230.248]
[  0.      0.      1.   ]]
畸变参数 distortion
[[ 0.038 -0.178 -0.001 -0.001  0.088]]

5. 3D点云预览

执行下面的脚本,查看Astra 3D相机拍摄的3D点云图像。

python3 test_pcd_visualizer.py

6. 示例源码

test_pcd_visualizer.py

'''
PCD点云动态可视化
从Realsense中读取RGB图像与深度图
并将其转换为pcd格式的文件.
----------------------------------------------
@作者: 阿凯爱玩机器人
@QQ: 244561792
@微信: xingshunkai
@邮箱: [email protected]
@B站: https://space.bilibili.com/40344504
'''
import numpy as np
import cv2
import open3d as o3d
import time
# 自定义库
from astra import Astra
from pcd_visualizer import PCDVisualizer

# 创建Realsense
# 创建相机对象
camera = Astra()
# 初始相机
camera.init_video_stream()
# 读取相机参数(相机内参)
camera.load_cam_calib_data()

# 创建可视化窗口
visualizer = PCDVisualizer()
visualizer.create_window()

# 读取
pcd = None
for i in range(20):
	camera.read()

try:
	while True:
		# 获取彩图与深度图
		color_image, depth_image = camera.read()
		# print("Cap image")
		# 转换为点云
		pcd = camera.get_pcd(color_image, depth_image)
		# print("Get Pcd")
		# 更新可视化器里面的PCD
		visualizer.update_pcd(pcd)
		# 可视化器迭代
		visualizer.step()

except Exception as e:
	# 关闭窗口
	visualizer.destroy_window()
	# 释放相机
	camera.release()