§ 2.1 图像预览 (彩图+IR图+深度图)

0. 概要

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

本文讲解了如何使用SDK内置脚本预览Astra 3D相机拍摄的彩图、深度图、IR图。

配套实验代码路径: 03.Astra-3D相机案例源码/astra-config

1. 准备工作

1.1 完整的配置文件

config/astra.yaml

#############################
## 相机的默认参数
############################# 
# OpenNI动态链接库的安装路径
# 如果是Windows, 需要修改为OpenNI的安装路径
# 如果是Linux, 将openni2_dll_path赋值为空字符串
# openni2_dll_path : ""
openni2_dll_path: "D:\\KyleSoftware\\OpenNI2\\libs"

# 支持UVC协议的型号需要的配置项 ["Astra Pro", "Gemini", "Gemini Pro"]
# - uvc_capture_id默认为0, 如果电脑上已有内置摄像头,
#   则需要将uvc_capture_id修改为1
uvc_capture_id: -1 #  0

# 深度图配置
depth:
  # 注意是先旋转再平移
  # 深度的偏移量 单位mm
  depth_offset_mm: 0.0

1.2 配置设备型号

Astra Pro和Gemini的彩色相机使用的是USB摄像头免驱协议(UVC),使用OpenCV的内置VideoCapture去获取视频流。

需要配置相机的ID号 uvc_capture_id

# 支持UVC协议的型号需要的配置项 ["Astra Pro", "Gemini", "Gemini Pro"]
# - uvc_capture_id默认为0, 如果电脑上已有内置摄像头,
#   则需要将uvc_capture_id修改为1
uvc_capture_id: -1 #  0

uvc_capture_id 如果填写 -1 的话,代表的是最近插入的UVC相机。

如果你对OpenCV不太熟悉,可以看1Z实验室上面免费的OpenCV入门课。

Python - OpenCV基础入门 / 摄像头与视频流 / OpenCV读入USB摄像头的画面

http://wiki.1zlab.com/wiki/python-opencv-tutorial/opencv-read-usb-camera-image/

1.3 配置OpenNI2安装路径

Linux操作系统

自动检索OpenNI2的安装路径,配置文件里面的 openni2_dll_path 不需要修改。

Windows操作系统

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

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

openni2_dll_path 变量,修改为自己的dll安装路径。路径中文件夹与文件夹之间,需要添加两个反斜杠 \\

1.4 连接设备

将奥比中光3D相机连接到PC的USB口上。

Gemini / Gemini Pro

需要注意的是Gemini / Gemini Pro的红外结构光投影仪功率比较大, 对USB口电流输出能力有要求,因此只能使用 USB3.0 接口 (USB口是蓝色的) 。

如果USB线比较长,或者没有剩余的USB3.0接口,则需要使用 带独立供电的USB 3.0拓展坞

1.5 导出相机配置文件

此步骤仅对Dabai与Gemini 二代3D相机有用。 其他型号,可以跳过此步骤。

阅读 开发环境配置/奥比中光3D相机上位机 相关章节,使用上位机导出相机参数文件 .ini

并将其拷贝到 03.Astra-3D相机Open3D测试样例/astra-config/config/<相机型号文件夹> 里面。

例如:型号是 Gemini ,就拷贝到 config/Gemini 。如果之前有 .ini 文件,需要将原来的 .ini 文件删掉。

2. Astra 3D相机图像预览

2.1 彩图预览

只预览相机拍摄的彩图

Windows

python test_astra.py --video_mode "color"

Ubuntu

python3 test_astra.py --video_mode "color"

注:在Windows下是用 python ,在Ubuntu下是用 python3

注意 测试发现在Windows平台上,Gemini的UVC相机初始化需要很长的时间。目前不清楚原因。加载时请耐心等待。在Ubuntu平台下,没有此问题。

2.2 深度图预览

预览IR相机的原始 (未与RGB相机对齐的) 深度图

Windows

python test_astra.py --video_mode "depth" --image_registration=false

Ubuntu

python3 test_astra.py --video_mode "depth" --image_registration=false

注:传参系统使用的是 absl ,当传入布尔值时,必须采用 = 的形式,例如 --image_registration=false

获取对齐后的深度图

Windows

python test_astra.py --video_mode "depth" --image_registration=true

Ubuntu

python3 test_astra.py --video_mode "depth" --image_registration=true

2.3 彩图与深度图同时预览

同时预览RGB图与深度图

Windows

python test_astra.py

Ubuntu

python3 test_astra.py

默认视频模式为 "color_depth" ,可以手动指定

Windows

python test_astra.py --video_mode "color_depth" 

Ubuntu

python3 test_astra.py --video_mode "color_depth" 

这里的深度图是与RGB相机对齐后的深度图。

也可以获取未对齐的深度图,将 image_registration 选项设置为 false

Windows

python test_astra.py --video_mode "color_depth"  --image_registration=false

注:absl传入布尔值的时候比较特殊,必须使用这种形式: --image_registration=false

Ubuntu

python3 test_astra.py --video_mode "color_depth"  --image_registration=false

2.4 IR图预览

预览IR相机 (红外相机) 拍摄的图像

Windows

python test_astra.py --video_mode "ir" --equal_hist=false

Ubuntu

python3 test_astra.py --video_mode "ir" --equal_hist=false

红外投影仪打开时,画面中的散点是IR投影仪投射的散点结构光。

红外投影仪被遮挡的时候画面很暗

可以使用外部的红外光源进行补光,也可以打开直方图均衡 equal_hist 开关。

Windows

python test_astra.py --video_mode "ir" --equal_hist=true

Ubuntu

python3 test_astra.py --video_mode "ir" --equal_hist=true

遮挡红外投影仪-无红外光源

白天在自然光的照射下,还是可以看清楚的,但是噪点比较大。在这种情况下,是可以拍清楚标定板的,只是在后续相机标定的过程中,精度会受损。

如果晚上想要获取清晰的红外图像,则需要使用红外补光灯。否则红外光线太弱,直方图均衡后得到的都是噪声。

遮挡红外投影仪-有红外光源

有条件建议使用红外光源进行补光,将红外补光灯用纳米胶黏在Astra上侧。

大部分的红外补光灯是用于安防领域的,使用光敏电阻来检测是否到了晚上,到了晚上红外补光灯才打开。

使用时记得要拆开红外补光灯,把光敏电阻的(黑白)端子断开,让红外补光灯进入常亮模式。

遮挡红外投影仪的区域,建议使用不透光的黑色纸板,用电工胶带固定。

下图是未打开直方图均衡开关的 --equal_hist=false

打开直方图均衡的效果 --equal_hist=false

因为标定板是用相纸打印的,光源为点状光源,所以会反光比较厉害。这样会影响后续的标定板的角点检测。

优化方式:

  • 替换标定板的材质,令其表面不反光。例如使用铝基板等,但是这么大的标定板造价会比较高。
  • 使用更大功率的红外环形光源。现在用的红外补光灯功率比较低 (只有6W) 。换用更高功率的环形红外补光灯,效果会更好。

2.5 IR图与深度图同时预览

同时预览IR图与深度图

Windows

python test_astra.py --video_mode "ir_depth" --equal_hist=false

Ubuntu

python3 test_astra.py --video_mode "ir_depth" --equal_hist=false