1. 写在前面
在前面的博客中,介绍了有关相机与投影仪的基础工作原理和相关细节问题。在这篇博客中,博主将使用它们搭建结构光3D相机。完成本篇博客的学习内容后,你将收获极具价值的结构光相机硬件搭建实战经验。
本系列博客的完整项目代码皆位于博主的Github项目SLMaster👈中:
https://github.com/Practice3DVision/SLMaster
项目README已经更新!动动你的小指头给个Star⭐并follow博主吧!你的支持是博主不懈的动力!
2. 3D相机硬件布局
我们知道,相机与投影仪的相对位姿将极大程度的影响最终3D相机的三维重建速率和三维重建精度。什么?你不知道?那肯定是博主上节博客偷懒没写出相机中部分知识点的问题。在这里我们主要关注两相机之间的夹角与三维重建速率和三维重建精度之间的关系。一般来说,双目立体视觉中,两相机间的夹角越大,精度越高,重建速率越低(重建速率低的原因主要是立体匹配难度增大)。
那似乎我们无法同时获得精度又高且重建速率又高的3D相机了,哎😔。真是如此吗?如果我们只有两台相机,那在夹角问题上我们的确已经被完全限制住了,只能取一个性价比最高的夹角大小去设计我们的布局。
但如果我们有三台,四台,甚至N台相机呢?那我们将拥有 C N 2 C_N^2 CN2个相机夹角可供我们去设计(这些夹角之间也是部分相关的)。事实上,我们仅需要两个夹角即可,一个夹角较大的组合和一个夹角较小的组合。如此,我们便可以通过这两个组合结合起来,让夹角较小的相机组合发挥出较高的三维重建速率,而夹角较大的相机组合发挥出较高的三维重建精度,也就是优势互补。
这个想法在Willomitzer F等人的Single-shot 3D motion picture camera with a dense point cloud[1]论文中被很好的描述了。如图1所示,让我们来看看如何将这两个夹角组合起来:
图1. 相机夹角组合
上图想表达的思想其实很简单,那就是先通过夹角较小的相机组合用最快的速度获得一个比较粗糙的点云,然后,将这个点云映射到夹角较大的相机组合,去指导它们进行立体匹配,最后,融合它们的点云从而提高精度。是不是豁然开朗了!加钱买相机就完事了!
那我们就开始打造这样的布局方式吧!
我们知道,投影仪可以简单的看作是相机成像的逆过程,它的成像模型可以简单的用相机成像模型来表示。那么,按道理,我们仅需要二台相机加一台投影仪就可以拿到我们想要的了,但是,为了获得更高的精度(相机精度肯定比用投影仪精度高啊),博主使用三台相机加一台投影仪的组合形式去搭建我们的结构光3D相机。
博主在水平夹角上进行了区分,中间相机(彩色的!还可以加色彩纹理!)和投影仪夹角较小(咋不用相机和相机呢?那我结构光意义在哪😓,此外这个小夹角组合本来就不追求精度,不用也罢),两侧相机之间夹角较大,很明显,对吧?
小Tips:小夹角组合的夹角也不能太小!不然误差太大了!
博主在这里列出所有相机与投影仪的参数,供大家参考。
设备名称 | 数量/个 | 分辨率/pixel×pixel | 帧率/fps |
---|---|---|---|
A5131MU210 | 2 | 1280×1024 | 208 |
A5131MC210 | 1 | 1280×1024 | 208 |
DLP 4710B | 1 | 1920×1080 | 1440(1bit) / 180(8bit) |
细心点的同学是不是发现了,如果我们用8位深度图案进行烧录投影,那我们投影仪的速率将明显低于相机帧率。这样将导致一个问题,我们得损失相机的速率以匹配投影仪速率!足足损失了28帧!太奢侈了!所以博主采用上一篇博客中提到的离焦投影技术,通过烧录1位深度图案以实现1440 Hz的投影速率!这样就能发挥出相机的全部性能了!
不过是不是投影仪性能又有点浪费了呢?还真是,不过,我们又不是高速三维重建!没必要上高速相机,售价五十万以上一个的高速相机可不是谁都能用得起的鸭!何况我们是想要实现一个在线三维重建的3D相机,不是离线!
3. 同步触发方式
搭建完所有的硬件之后,还需要进行同步触发,同步触发说白了就是让相机和投影仪能够正确的进行捕图和投图,也就是说投影仪投的图案让相机能够完全接收到且没有任何错误。
很多同学可能会遇到丢帧等现象,也就是少了几张图案没有捕获到。上述情况就属于对自己硬件不了解,没有计算最小曝光时间而导致的。以搭建的这台3D相机为例,博主将保姆级的带你推算一遍。
由于我们的相机帧率比投影仪低,所以我们知道我们的最小曝光时间应该为相机的曝光时间,也就是:
t
e
x
p
o
s
u
r
e
=
1
/
208
≈
4808
u
s
t_{exposure} = 1 / 208 \approx 4808 us
texposure=1/208≈4808us
然后,你需要观察自己的硬件是否存在以下情况:
- 使用了集线器
- 接口是USB 2.0或者网口速率不匹配(赶快换成速率匹配的接口!)
- 固态内存已满,导致写的是机械硬盘(赶快清理内存!)
如果上述情况你都不存在,那么你的最低曝光时间就是4808 us。如果上述情况存在,第二、三种情况无解(因为就算能用也很不稳定!)。第一种情况,假设这个集线器上插了N台相机,那么帧率对应除以N,也就是上述的最小曝光时间乘以N(原因在于集线器是分时复用的,当然这样操作极小概率情况下也存在丢帧情况)。
注意!
这个曝光时间以投影仪烧录时设置的曝光时间来说,就是pre exposure time + exposure time + post exposure time;而对相机来说就是简单的exposure time。
博主这么细了!求个关注赞⭐啥的不过分吧?如果觉得还是过分,再来个细节的小Tip!
当环境光包含使用交流电的灯光时,曝光时间最好设置为10000 us的整数倍,这样可以将周期性的光源影响降至最低。(如果影响很大的话你可以看到点云会产生水波纹的样子,有点类似投影仪非线性校正的那种效果)
在计算完上述的最小曝光时间后,还需要知道自己的触发方式和触发口。触发方式博主一般使用投影仪触发相机(德州仪器官方推荐相机触发投影仪,理由是相机同步信号精度更高),触发口选择Line 2。在这里再说一个细节问题,投影仪的Output 1输出是一组图案触发一次,Output 2输出是一幅图案触发一次,所以,投影仪的输出你只能选择Output 2。
4. 总结
在这篇博客中,博主介绍了一种相机硬件布局,并对3D相机的最小曝光时间和同步触发进行了介绍。在下一节中,博主将开始着手于算法介绍和代码编写。
参考文献
[1] Willomitzer F ,Gerd Häusler.Single-shot 3D motion picture camera with a dense point cloud[J].Optics Express, 2017.DOI:10.1364/oe.25.023451.
本系列文章将持续更新,如果有等不及想要获得代码的小伙伴,可访问博主Github中的SLMaster项目,动动你的小手指,follow and star⭐!你们的关注是博主持续的动力!
Github:https://github.com/Practice3DVision
QQ群:229441078
公众号:实战3D视觉