最近一直在忙RGBD,发现一个东西叫D2C,你如果单纯的搜索就发现没什么结果。但是功夫不负有心人,我在奥比的论坛找到啦!
就是RGB和Depth的对其操作。
关于 D2C,当前主要有两种方式,一种是硬件对齐,一种是软件对齐。硬件对齐由芯片完成,不消耗主机资源,效率较高。但是对深度图的分辨率有要求,最大支持 640x480。软件对齐没有这个限制,且精度较高,缺点是会消耗大量主机算力,不适合计算能力较弱或主机资源进展的平台。
(1)硬件对齐
硬件对齐操作起来比较简单,在启动数据流之前调用 Device 类的成员函数:
m_device.setImageRegistrationMode(openni::IMAGE_REGISTRATION_DEPTH_TO_COLOR);
就可以了,这样输出的结果中彩色图像和深度图像就是对齐的。
接下来看看在SDK里面是什么样的。
我翻译了
这些是返回值的结构体
这个函数在里面的调用的地方
图像配准,使用1
当然这里也有一个
我注意到上面说了一个函数,找了一下是这样的,检查是不是可以对齐操作。
(2)软件对齐
软件对齐是使用 Orbbec 提供的一个 d2c.dll 的动态库。具体的操作比较复杂,这里暂不做详细介绍。硬件对齐相对于软件对齐来说效率高,并且从 SDK 出来的流直接就是对齐好了。软件对齐准确率更高,但是效率没有硬件对齐高,需要对从 SDK 读取出来的深度流做进一步处理,后续编码也较复杂。
软硬件D2C时的区别在于:
1. 硬件D2C时芯片会根据输入的Depth与Color的分辨率,直接利用Z0、f与b信息计算得到D2C后的深度图。而软件D2C只能根据得到的软件D2C参数与深度图,外部计算得到D2C后的深度图。
2. 硬件D2C忽略了Color相机的畸变信息。且硬件D2C参数在精度上有所损失。
3. 硬件D2C在flash写了若干组分辨率对齐参数,虽然可以直接根据这些参数得到深度,但也仅限于对齐存入的这几组分辨率。而软件D2C只存入一组分辨率比例(4:3或16:9)的参数,但可以根据内参缩放的方式对齐各种Color满足该分辨率比例的所有分辨率。
4.硬件D2C,由于固件设置了对齐输出的深度图分辨率与输入的深度图分辨率一致。考虑Depth:640x400对齐RGB:640X480的情形,芯片计算得到的是640x480的深度图,而固件打包输出为640x400的深度图。同样的,考虑Depth:640x400对齐RGB:640X360的情形,芯片计算得到的是640x360的深度图,而固件打包输出仍为640x400的深度图。SDK端在实现对齐时,在对深度图缩放后,需再对深度图做扩展或裁剪方能与Color图全图吻合。