§ 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