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

共 2683字,需浏览 6分钟

 ·

2021-02-05 16:33

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转载自:3D视觉工坊


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

一、制作立体相机的步骤

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

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

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

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

1.使用相机校准手册中介绍的标准OpenCV校准方法校准单个摄像机;
2.确定在立体相机中使用的两个相机之间的转换关系。
3.使用前面步骤中获得的参数和stereoCalibrate方法,我们确定应用于两个图像的变换以进行立体校正。
4.最后,使用initUndistortRectifyMap方法获得查找未失真和校正后的立体图像对所需的映射。
5.将此映射应用于原始图像以获得校正的未失真的立体图像对。
1)左右相机的独立标定
在执行立体标定之前,我们会分别对两个相机进行标定。但是,如果stereoCalibrate()方法可以对两个相机中的每一个进行校准,为什么还要分别标定相机呢?
由于要计算的参数很多(较大的参数空间),并且在诸如角点检测和将点近似为整数之类的步骤中累积了误差。这增加了迭代方法偏离正确解的风险。因此,我们分别计算摄像机参数,然后使用stereoCalibrate()方法仅用于获取立体相机对间的位置关系,本质矩阵和基础矩阵。
但是该算法如何知道要跳过单相机的标定?为此,我们设置标志CALIBFIXINTRINSIC并将其传递给该方法。
2)用固定内参执行立体标定
校准相机后,我们将它们传递给stereoCalibrate()方法并设置CALIBFIXINTRINSIC标志。我们还传递两个图像中捕获的3D点和相应的2D像素坐标。
该方法计算相机间的平移旋转矩阵以及基础矩阵和本质矩阵。
3)立体校正
使用相机的内外参,我们现在可以运用立体校正了。立体校正运用旋转使两个相机图像面都在同一平面上,同时stereoRectify方法还能返回新坐标空间中的投影矩阵。
4)计算所需的映射
由于我们假设相机是固定的,无需再次计算变换。因此,我们计算的通过映射将立体图像对转换为未失真的校正的立体图像对,并将其保存以备将进一步使用。
好了,这样我们就制作好了立体相机,下期再会~
参考文献
[1] C. Loop and Z. Zhang. Computing Rectifying Homographies for Stereo Vision. IEEE Conf. Computer Vision and Pattern Recognition, 1999.
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目31讲
小白学视觉公众号后台回复:Python视觉实战项目31讲即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 8
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报