16

如何用OpenCV制作一个低成本的立体相机

 4 years ago
source link: https://mp.weixin.qq.com/s/og-IdVapnz3veB6TsRmTgA
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

640?wx_fmt=jpeg

AR/VR的兴起,让我们喜欢上了3D电影和视频,前提是你需要戴上一副3D眼镜才能感受到3D效果。那么,它是如何工作的?当屏幕只是平面时,我们如何体验3D效果?其实,这些是通过一个叫立体相机的玩意儿来捕获的。
本文,我们将学习如何DIY一个低成本的立体相机(使用一对网络摄像头)以及如何使用OpenCV捕获3D视频。

一、制作立体相机的步骤

立体相机安装通常包含两个相同的摄像头,它们以固定的距离隔开。工业级标准立体相机使用一对相同的摄像头。如果是在家里面制作,你需要如下这些东西:1.2个USB网络摄像头(相同型号的优先)2.固定相机的刚性底座(木材,纸板,PVC泡沫板)3.夹钳或胶带当然,你也可以自由发挥,使用其它不同的组件制作立体相机。但基本要求是保持摄像机严格固定和平行。固定好相机并确保正确对齐后,我们完成了吗?我们准备好生成视差图和3D视频了吗?No, no, no!

二、立体相机标定和校正的重要性

为了理解标定和校正的重要性,我们试着用刚DIY好的立体相机捕获到的图像生成一个没有标定和校正过的视差图。
640?wx_fmt=png
左图是立体相机捕获到的左右图像;右图是用没有标定过的左右图像生成的视差图。我们观察到,使用未校准的立体相机生成的视差图非常嘈杂且不准确。为什么会这样?相应的关键点应具有相等的Y坐标,以简化点对应搜索。在下图中,当我们在几个对应点之间绘制匹配线时,我们观察到这些线不是完全水平的,还观察到对应点的Y坐标也不相等。
640?wx_fmt=png
下图显示了一对具有点对应关系的立体图像,以及使用这些图像生成的视差图。我们观察到,与前一张相比,现在的视差图噪声更低。在这种情况下,相应的关键点具有相等的Y坐标。仅当相机平行时才可能出现这种情况。这是双视图几何的特例,其中图像是平行的,并且仅通过水平平移而相关。这是必不可少的,因为用于生成视差图的方法仅搜索水平方向的点对关系。
640?wx_fmt=png
太棒了!我们需要做的就是对齐摄像机并使它们完全平行。那么,我们是否会根据反复试验手动调整摄像机?好吧,作为一项有趣的活动,您可以尝试一下!剧透警报!手动调整相机需要很长时间才能获得清晰的视差图。此外,每当设置受到干扰且摄像机移位时,我们都必须重复此过程。这很耗时,也不是理想的解决方案。为了代替手动调整相机,我们考虑用软件的方法。使用一种称为“立体图像校正”的方法。[1] 下图说明了立体校正的过程。这个想法是在平行于透过光学中心的线的公共平面上重新投影两个图像。这样可以确保相应的点具有相同的Y坐标,并且仅通过水平平移进行关联。
640?wx_fmt=png

三、立体相机标定和校正的步骤

1.使用相机校准手册中介绍的标准OpenCV校准方法校准单个摄像机;2.确定在立体相机中使用的两个相机之间的转换关系。3.使用前面步骤中获得的参数和stereoCalibrate方法,我们确定应用于两个图像的变换以进行立体校正。4.最后,使用initUndistortRectifyMap方法获得查找未失真和校正后的立体图像对所需的映射。5.将此映射应用于原始图像以获得校正的未失真的立体图像对。1)左右相机的独立标定在执行立体标定之前,我们会分别对两个相机进行标定。但是,如果stereoCalibrate()方法可以对两个相机中的每一个进行校准,为什么还要分别标定相机呢?由于要计算的参数很多(较大的参数空间),并且在诸如角点检测和将点近似为整数之类的步骤中累积了误差。这增加了迭代方法偏离正确解的风险。因此,我们分别计算摄像机参数,然后使用stereoCalibrate()方法仅用于获取立体相机对间的位置关系,本质矩阵和基础矩阵。但是该算法如何知道要跳过单相机的标定?为此,我们设置标志CALIBFIXINTRINSIC并将其传递给该方法。2)用固定内参执行立体标定校准相机后,我们将它们传递给stereoCalibrate()方法并设置CALIBFIXINTRINSIC标志。我们还传递两个图像中捕获的3D点和相应的2D像素坐标。该方法计算相机间的平移旋转矩阵以及基础矩阵和本质矩阵。
640?wx_fmt=png
3)立体校正使用相机的内外参,我们现在可以运用立体校正了。立体校正运用旋转使两个相机图像面都在同一平面上,同时stereoRectify方法还能返回新坐标空间中的投影矩阵。
640?wx_fmt=png
4)计算所需的映射由于我们假设相机是固定的,无需再次计算变换。因此,我们计算的通过映射将立体图像对转换为未失真的校正的立体图像对,并将其保存以备将进一步使用。好了,这样我们就制作好了立体相机,下期再会~参考文献[1] C. Loop and Z. Zhang. Computing Rectifying Homographies for Stereo Vision. IEEE Conf. Computer Vision and Pattern Recognition, 1999.备注:作者也是我们「3D视觉从入门到精通」特邀嘉宾:一个超干货的3D视觉学习社区本文仅做学术分享,如有侵权,请联系删文。下载1在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。下载2在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。下载3在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

640?wx_fmt=png▲长按加微信群或投稿

640?wx_fmt=jpeg

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款640?wx_fmt=jpeg 圈里有高质量教程资料、可答疑解惑、助你高效解决问题觉得有用,麻烦给个赞和在看~640?wx_fmt=gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK