双目立体视觉系统”机器之眼“之扬帆起航篇
双目立体视觉系统”机器之眼“之扬帆起航篇
好久不见,你还好吗?!!!
久违了,不能等太久,一休哥与大家再次相见,相约双目立体视觉系统!
双目立体视觉(Binocular Stereo Vision)是机器视觉的一种重要形式,它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方法。
如果你现在对双目立体视觉不太熟悉,但是想必你一定听过如下名词:深度相机,3D打印,机器人的眼睛,三维成像,三维人脸识别等等。殊不知,这些耳熟能详的名词都与双目立体视觉技术息息相关,很多相关产品都是基于双目立体视觉而实现的。
了解双目立体视觉将会让你离实现这些“高科技”的第一步。
学习双目立体视觉,掌握这个技术是一段漫长的旅程,一休哥将带领大家一步步实现。
首先,一休哥将简单介绍一下双目立体视觉。
1、双目立体视觉系统的硬件结构
听名字就可以知道,双目立体视觉系统的硬件结构一定包含两个摄像头,不然就不是正宗的双目立体视觉了。
为什么需要两个摄像头呢?
我们一般习惯用手机拍照,手机上的摄像头只有一个,那么我们拍照后会得到一张二维图像。
而单个摄像头的成像原理图如下所示。
如图中所示,O点是光心,它是镜头的中心,而π则是CMOS/CCD芯片的感光平面阵列,也可以简单的理解为摄像头的成像平面。P和W点是真实世界中的两个点。
这里有的童鞋可能有点困惑,为啥π平面会在镜头的前面呢?
这是因为实际上,根据镜头的成像定理我们可以知道,镜头一般放在光路的中间,物在镜头前面,像平面在镜头后面。而为了对无穷远处的物体成像,我们需要将像平面摆放在镜头的后焦平面上,即将π平面放在镜头的后焦平面上,而为了画图方便,节省空间呢,我们会将π平面等效的放在镜头的前焦面上。放在前焦面上的π平面与后焦面的像平面关于光心O点对称,即图像刚好反了180°。
这个原理图表达的是什么意思呢,由于真实世界中的两个点P和W点刚好与光心O点共线,因此,P和W点会成像于π平面的同一点上(即p三q)。由这个意思可以衍生出来一个问题,当一个物点处于Q点或者P点时,对于成像平面π来说是毫无意义的。虽然物点相对于摄像头移动了,但是并不能从图像中知道物点移动了多少距离,这个问题是单个摄像头的瓶颈,而这个距离就可以理解为深度。而我们要做的就是得到这个深度,如何得到深度呢,解决方案就是我们的双目立体视觉系统了。
双目立体视觉系统如何获取物体的深度信息?
我们来看看两个摄像头的成像原理图。
从图中,我们可以看到参考视角R就是上一副图中的单个摄像头,然后我们在它的一侧增加一个摄像头。此时我们发现,在目标视角T处我们可以区分Q点和P点。
而如何获取深度信息呢,则需要获得真实空间的物点在两个不同视角R和T处的成像对应点,即p和p’点、q和q’点。如何理解这句话,双目视觉就是我们人的双眼,左右眼锁定一个物点,然后就构成了一个三角形,而根据这个三角关系就可以得到深度信息。
当然这只是一个简单的理解。接下来,我们来进一步剖析其中的奥秘。
首先,第一步,如何找到两个相机的对应点。
在两张图片中寻找对应点是个十分复杂的工作。简单一点的想法就是在整个二维图像中进行搜索,但这无疑会浪费大量的时间,实时性不高。因此,我们需要对源图像进行极线校正,将两个不同视角的图片校正到同一平面上,这样就将二维搜索简化成了一维搜索,即在水平线上搜索。(其实极线校正与相机标定有关,在以后的章节中,一休哥会详细介绍极线校正的方法。)
在图中我们可以看到,经过极线校正之后,p和p’点、q和q’点的y坐标相同。然后进行一维搜索。搜索的算法有很多,如(SAD、SSD、ASW等),一休哥会在后续的文章详细介绍,并使用FPGA来实现它们。
如此,我们找到了两个相机的对应点。
第二步,通过对应点获取深度信息。
在上幅图中,我们得到了经过极线校正的成像原理图。然后我们切换到上帝视角,此时我们忽略y轴,如下图所示。
此时,物点P的对应点为p和p’。z就是我们要求的物点P深度信息。由三角形Ppp’与POROT相似,可得
其中,h为相机平面的宽的一半,于是可得
从而得到,
其中,XR - XT就是对应点之间的位置差,简称视差(disparity)。而剩下的B和f是双目立体视觉系统的系统参数,可以通过立体视觉标定来获得。(关于标定的内容,一休哥也会在后续的文章中一一讲述,并提供实例和具体操作方法。)
既然公式中的数据都已知了,那么自然地,深度信息Z就可以轻松求出来了。
呼呼呼,让一休哥休息一会儿,缓会儿气,一休哥终于把双目立体视觉的大致流程给说了一遍了。那么接下来,一休哥帮大家梳理一下:
1、 双目立体视觉系统的标定;
2、 极线校正;
3、 匹配算法,寻找对应点;
4、 根据公式,得到深度信息。
这里有必要说明一下,因为,实际开发中的双目相机是不可能完全做到理论上的水平,往往都需要做极线校正,然后才能进行匹配。又因为极线校正与相机标定有关,因此系统的标定才是我们的第一步。
讲完了理论部分,是不是就开始讲标定了呢?
不急不急,一休哥先带领大家来搭建整个双目立体视觉系统,注意哦,整个系统是基于FPGA的哦。而双目立体视觉系统最重要的就是获取两个摄像头的图像了,有了图像才能进行接下来的标定哦。
因此!!!接下来的第一步,一休哥将手把手教大家实现一个双目相机系统,具体功能为:FPGA同步采集两个摄像头的图片,然后通过USB接口上传给电脑的上位机,通过上位机可以实时显示双视角图像。只有先完成了这一步,才能开始标定的哟。
什么?为什么不在FPGA内部做标定?来来来,那个提问的童鞋过来,就是你,标定你知道有多复杂吗,标定算法的复杂度极高,想要自己编写一个标定的程序都是十分困难的,更别谈用FPGA来实现了。具体为什么,嘿嘿,一休哥先卖个关子,请听下下下次分解。
看客:打!给我狠狠的打!一休哥说好的干货呢,怎么全是些理论的东西!!!
一休哥:哎哎,别打,别打!这也是没办法的事,毕竟科学是严谨的,所做的一切都有理论做支撑。
接下来,一休哥分享一个关于双目立体视觉算法及应用的PPT,里面的内容十分丰富。其中原理部分,一休哥本人也借鉴了一下。由于PPT是意大利的一个大学教授做的,因此是全英文的,大家将就看看,随便提高下外文阅读能力,嘿嘿。
链接:http://pan.baidu.com/s/1hs9v66K 密码:4b43
接下来图片走一波,一休哥DIY的双目相机采的图片大放送。
这个是一休哥实现双目相机采集并显示在VGA上的画面。单个相机的分辨率是640*[email protected],而VGA的分辨率是1280*[email protected]。这也是VGA画面中下面一段是黑色的原因。
这个是一休哥实现双目相机采集并通过USB接口传输在上位机上显示的画面。