本文由作者原创,禁止转载!
(一)原理简述与硬件设备与模块划分
写在前面的话
从2017年秋到2019年夏,从事三维扫描方向的研究也快满两年了。从最初的大三小白到制成一台线激光三维扫描仪再到毕设期间完成的双目结构光三维扫描仪,我似乎学到了许多知识,但仔细想想却又发现可堪用者寥寥。所以计划在此将之前的研究做一个总结,从双目结构光三维扫描仪入手:谈谈我对其原理之理解;介绍我所采用的一些硬件;主要写写三维扫描在软件上的实现(包括功能上的模块化,以及各个模块的实现),也希望能为有志从事这方面工作的同学提供一点小小的帮助。在博文中出现的错误和疏漏还请诸位老师同学斧正,谢谢!
1.1 三维扫描原理简述
三维扫描的原理有很多,大体上可以分为“接触式”和“非接触式”两种,其中“接触式”在这里不做赘述。“非接触式”中有包含激光三角法、飞行时间法(TOF)、红外散斑技术、傅里叶变换轮廓术等等。
我采用的是双目立体视觉和编码结构光相结合的一种方法[1],属于“非接触式”。在实现基于这一原理的三维扫描仪后,我的直观感受是(1)原理并不复杂,这使得编程的难度大大降低;(2)硬件要求很低,完全不用考虑电路设计,买现成的便携投影仪和CMOS或CCD就可以;(3)效果拔群,主要体现在精度较高和扫描速度快这两点上。
那么闲言少叙,下面开始介绍。既然是“双目立体视觉和编码结构光相结合的方法”,那就得了解“双目立体视觉”和“编码结构光”在这个方法中起到了什么作用。
首先,“双目立体视觉”,简单而言就是利用不同位置的两台相机取得同一场景的两幅视差图像[1],然后通过某种方法确定物体上一点在对应两幅图片中的位置,从而得到该点的三维坐标信息(具体的数学推导在另一篇博文中补充),从而得到整个物体的三维点云模型。如图1所示。
图1
其次,“编码结构光”就是用来确定物体上一点在对应两幅图片中的位置的某种方法,我使用的是格雷码编码的结构光,通过将格雷码编码图案投影到物体表面,可以将物体表面上每一个点(准确来说应该是每一个子区域)都赋予一个独一无二的码值,即特征值。通过搜索这个特征值,我们就不难在两幅图片中找到对应的点了。
这样原理部分就简单说明完毕了,下面介绍一下我在制作扫描仪时所使用的硬件设备。
1.2 使用的硬件设备
由于这台三维扫描仪仅仅依托于本科毕设,经费有限,同时我当时所在的实验室内也没有人从事这方面的研究,所以在硬件选型方面我大概了解了双目结构光扫描仪所需硬件之后,就在实验室的现成器具中攒了一套设备出来,好在后面证明这些设备都是能胜任工作的。
下面将给出我所使用的硬件设备。值得注意的是,这并非是广告,选用同类型其他产品是完全可以的。如果你打算选用更加优质(昂贵?)的设备,相信最终的扫描效果会更好。
便携式投影仪
我用的是投美公司的C800,便携式投影仪用于投射格雷码编码图片,C800是安卓操作系统,可以用遥控器控制图片投影,能够外接U盘,这样就可以很方
便的将格雷码编码图片投影到物体上了。
图2
成像设备
采用的是MindVision公司出品的黑白工业相机MV-UB130M和中联科创公司的2/3英寸靶面FA镜头HM0814MP5。虽然它们的价格比普通网络摄像头贵很多,但是成像质量有保证,至少肉眼是无法发现畸变的。
其他
还有一些其他的小玩意儿。
HUB,笔记本电脑上的USB插口比较少,一个HUB可以轻松将两个工业相机接入电脑。
三脚架,用来灵活调节投影仪高度。
固定板,用来固定两个工业相机。
系统展示
图3
1.3 模块划分
下面将给出一种自顶向下的把复杂的三维扫描仪系统按照功能划分为不同模块的方法,方便我们按模块一步步实现它。但是在此之前,我们得先解决硬件和软件的协同问题。
双目结构光三维扫描仪包括硬件与软件,它们的协同问题将决定这台机器能否运行成功。如果通过软件来控制两台摄像机拍摄图像和投影仪投影图片,我们不仅要额外编写控制它们的代码,还必须面临时序问题(时序问题曾在制作激光三维扫描仪时给我造成了很大的麻烦)。
幸运的是,在面对这个问题时我们还可以选择回避它:)
自己无需编写控制硬件的代码,只需要利用工业相机SDK中附带的拍照例程,遥控器控制投影切换图片,就可以得到我们需要的编码图像和标定图像。而在代码部分我们需要做出的努力就是利用这些已经拍摄好并储存在电脑本地的照片来构建三维点云模型。
假如买到的相机并没有例程可供使用呢?用OpenCV写一个用来拍照的小程序吧,不会超过10行的(只要是由你本人来按下“快门”,不涉及协同与时序)。
现在,我们可以开始根据功能划分模块了。
“生成格雷码编码图案序列”模块
我们显然需要一个能够自由生成所需格雷码编码图案序列的模块,这样才能自由的调整三维扫描仪的精度(是的,三维扫描仪的精度与格雷码编码图案,进一步地,与格雷码的位数有关)
“相机标定”模块
我们需要利用张氏标定法将相机进行标定,用来获得相机的内部参数,然后我们还需要立体标定,用来获得相机的外部参数。
“特征点提取”模块
用于处理相机拍摄的编码图案,在这一步骤中又可以分为三个模块(1)“二值化”模块;(2)“精细化”模块;(3)“获取格雷码码值图(矩阵)”模块。
“特征点匹配和三维重构”模块
用来获取点云数据,并输出三维点云模型。
1.4 效果展示
先展示一下扫描效果吧。
图4
图5
好了,博文《如何制作一台双目结构光三维扫描仪(一)》就到此结束啦:)
参考文献
[1] 李靖, 王炜, 张茂军. 双目立体视觉和编码结构光相结合的三维重建方法[J]. 计算机应用, 2012, 32(a02):154-158.