100小时从零开始:双目视觉重建系统

本文转载自: PYNQ开源社区微信公众号

感兴趣者可与 pynq_china@xilinx.com 联系,共同合作拓展项目。

在上一期100小时从零开始:用摄像头认识世界中,暑期学校A班的同学思维巧妙,让摄像头得到了活用。本期小编继续为大家带来使用了摄像头的暑期学校B班优秀作品分享之双目视觉重建系统。让我们一起来看看吧!

本项目已在github开源,有兴趣的同学请务必访问作品的github库查看源代码,并且上手试试看哟!

设计目的

能够在FPGA上读入图片,并通过连接电脑或显示器显示两侧摄像头的左右图像,再内部及逆行并实时显示通过在FPGA上处理完成后的深度图像,深度图像采用深浅的灰度图并使用深度伪色彩图显示。

项目内容

本项目的具体内容实在PYNQ-Z2上实现一个双目视觉的测距系统,能够通过传入的左右目图片,在PYNQ-Z2上实现透视仿射等变换,进行摄像头标定,进行矫正以及消除畸变,完成后继续使用立体匹配算法计算两个摄像头之间的视差,转为伪彩色的深度图,最后通过得到的视差图以及对应的映射矩阵进行三维重构,以此得到相应的深度图像。其中所应用的矩阵的乘法以及图片读取的方式均可以实现硬件加速,并且视情况进行量化。

知识点

双目摄像头标定,打印棋盘板,首先对两个摄像头分别进行标定,消除由于改变空间坐标系以及镜头内部导致的刚体变形以及畸变。其通过对不同图片中棋盘格的角点的对应关系,来求出摄像头的内参变量(坐标系转换)以及外参变量(镜头导致的畸变),以此来消除每一个摄像头内的更接近真实坐标系的棋盘图像。

之后在分别得到两个摄像头各自的参数后,需要对双目摄像头进行整体的标定,来消除由于两个摄像头之间拜访不平行或者微小旋转带来的误差,测量两个相机之间的相对位置。为了计算目标点在左右两个视图上形成的视差首先要将该点在左右视图上两个对应点匹配起来,为了减少匹配搜索的范围,我们采用极线约束来对图片进行降维搜索,使得两幅图像的对极线恰好在同一水平线上,这样一幅图像上任意一点与其在另一幅图像上的对应点就必然具有相同的行号,只需在该行进行一维搜索即可匹配到对应点。最终实现左右视图的成像坐标原点一致,光轴平行,左右平面共面的效果。

2、立体匹配:通过使用BM,SGBM等算法,通过SAD方法以及梯度方向等参数,来对两幅图像计算视差,使用灰度值来代表距离信息。

3、硬件加速,对于循环体优化,添加优化指令进行加速:通过unroll指令进行展开,并对端口进行展开;使用pipeline指令进行加速。可以对嵌套循环的不同循环层进行不同的优化指令,寻找最佳优化方式。

作品展示

首先需要现通过c++对相机参数进行运算校正后传入HLS工程,通过HLS工程进行双目校正操作,将校正完成的图片传入matlab进行对比,得到的结果如下:

原始图像如下所示:

最终得到的深度图如下所示:

通过灰度图生成伪彩色图:

在得到深度图之后,通过将相机极坐标系转换为环境中直角坐标系获得点云,即得到图像中每个像素点的三维坐标信息,从而完成测距与重建功能。

点击查看视频演示

github链接: https://github.com/marshmallow911/Binocular-Stereo-Vision-PYNQ.git

最新文章