2014年工作学习总结 --- structured light depth sensing
2014年的平安夜 --- 好吧其实现在还是平安日 --- 稍微记录一下2014年工作上的收获,以及写一下2015年前几个月的工作学习计划。
3月中入职,来到。。。有9个多月了,待遇还不错,转正之后算上bonus一个月也有RMB大约20k到24k左右,自己小组的R&D氛围很不错,就是管理方面比较薄弱,部门之间support不够,当然问题主要还是在于上层。老大平时的奇思异想和一些行事作风往往可以气死人,不过看在钱的份上我也就习惯了。进来工作大半年,很长一段时间在熟悉环境,并且学了许多领域的皮毛,例如控制理论中的SMC(sliding mode control)、材料学中的ERF等等,还有自己比较熟悉的machine learning。7月底8月初还去了一趟美帝,和同事一起去了UT,与我们公司有合作关系的教授们给我们准备了不少talk(话说有个关于控制理论的talk很不错。。。),自己还是第一次看到了humanoid robot,还拍了不少照片。。。
大概6月多开始和森哥一起研究kinect和xtion,学习了不少东西,也尝试重现kinect的点云生成算法。后来转移方向到传统的成熟的编码结构光三维测量技术,有幸获得在台湾做研究的阮博士的协助,我们现在也算有个三维测量系统。读了不少paper,逐渐发现其实kinect所用的技术,也是编码结构光的一种,同时也发现它的局限性。
所谓编码结构光三维测量技术,测距原理是双目视觉原理,三维信息来源于两张图片,需要建立两张图片中的correspondence,然后利用三角几何计算出三维坐标。
1、 传统的双目视觉实现方案就是两个camera,两张图片就是两个camera从不同角度拍回来的照片。建立两张image的correspondence需要提取feature并进行feature matching。通常feature matching难度很大,譬如一个榴莲,上面有好多尖刺,每个尖刺都可以作为一个feature,问题是你怎样才知道在image A中的某个尖刺,对应image B中的哪一个尖刺呢。更悲剧的case是,一个球体就很难找到用来matching的feature了。关于这些问题,有一些成熟的技术,例如SIFT。
2、 既然两张camera拍回来的照片进行feature matching难度较大,干脆就自己主动投射一些feature出去,这就是主动光源双目视觉的意图。(所以实际上可以一个projector+两个camera,projector仅提供feature)同时用projector代替其中一个camera,这时候三维信息所需要的两张图,其中一张是camera capture回来的,另一张则是projector投射出去的那个pattern。为什么是这样,原理其实很简单,将projector看成一个camera,如下图所示,真实世界中的情况是,物体本身不发光,projector将一组网格线(例如正正常常的正方形)投到物体上,物体反射这些网格线到camera成像;然后在想象世界中,这个物体绝大部分不发光,但是真实情况下被网格线投射到的那些区域是发光的,那么,camera会得到真实世界中camera得到的图像,同时,在真实世界中projector的位置,放一个camera,并且光学特性和projector一模一样,仅仅是发光单元变成了感光单元,那么,根据光路可逆原理,这个虚拟的camera,将会得到一幅图像,这幅图像恰好就是真实世界中projector投射出去的那个pattern。
因为pattern是预先定义的,所以可以设计成容易找到feature进行matching的image,例如网格(每个十字点作为一个feature)。当然这时候也会遇到在projector中的哪个十字点和在image captured中的哪个十字点相对应的问题。考虑到pattern是我们自己定义的,我们大可以让这些features是互相不一样的,这样建立correspondence就轻松多了。既然需要让features互不一样,那就需要编码。编码按照编码域来分,可以分为时域,空域,对于现在,还有色彩域。时域编码就是传统的编码结构光,而kinect则是用空域编码。在时域编码,pattern上每一个pixel都可以获得一个独立的ID,因此最后结果的resolution会高,但是在时间上会吃亏;在空域编码,pattern上每一小块区域(包含多个pixel,例如5*5,7*7甚至9*9,例如据说kinect用的就是9*9)会获得一个独立的ID,因此最后结果的resolution会比较低,但是可以做到one-shot得到结果。
我们工作中选用了Ti DLP4500,RGB LED光源的微投,用红光做的系统calibration和depth sensing。以后应该会转用IR laser光源的微投。camera方面选用了Ximea 130W像素。
一些3Ddetect的实验结果:
盘子里边电容近乎圆柱体,直径大概是8mm
3D结果用PCL显示出来:
这些点云可以作进一步的处理进行识别。
我们组的目标是能够获得电容器的金属针脚的点云,金属针脚的直径大概是0.6mm。现在的系统能“看到”针脚,也就是说有一些点云描述针脚,不过这些点云不是圆柱体的形状(针脚是一个很幼席的圆柱体),而是一些扩散开来的3D点。一方面是projector和camera的resolution不足够的原因,另一方面是因为projector是一个短焦光学仪器,景深不够,在成像面前后移动一段小距离,pattern就会有点模糊,这也会对结果有影响。下一步的工作是在不更换更高分辨率的projector和camera的条件下,用IR Laser光源来代替LED光源,看看效果有没有提升。