如何用OpenCV制作一个低成本的立体相机
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文转载自: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“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
如何用OpenCV制作一个低成本的立体相机相关推荐
- 独家|OpenCV1.11 使用OpenCV制作一个低成本立体摄像机
作者:Kaustubh Sadekar 翻译:顾伟嵩 校对:张玲本文约3000字,建议阅读6分钟 本文我们将学习如何创建一个定制的低成本立体摄像机. 标签:3D计算机视觉,摄像机标定,经典计算机视觉, ...
- 怎么用python制作简单的程序-神级程序员教你如何用python制作一个牛逼的外挂!...
玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂.... 我打开了4399小游 ...
- 手把手教你如何用Python制作一个电子相册?末附python教程
这里简单介绍一下python制作电子相册的过程,主要用到tkinter和pillow这2个库,tkinter用于窗口显示照片,pillow用来处理照片,照片切换分为2种方式,一种是自动切换(每隔5秒) ...
- python可视化迷宫求解_如何用 Python 制作一个迷宫游戏
相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路. 虽然 ...
- 如何用JAVA制作一个漂亮的表格
如何用JAVA制作一个漂亮的表格 表格图片: 选中一行时高亮显示,且字体变为红色: 在表格中添加数据: 代码如下: import java.awt.BorderLayout; import java. ...
- 如何制作一个低成本投入,多功能营销的企业网站
随着时代的发展,互联网事业越来越被人们所重视,一是现在是互联网+时代,二是互联网创业或是投资门槛相对较低,这导致很多人纷纷踏上互联网道路,这不仅是顺应时势,也是明智的抉择.而如今,各行各业都在潜移默化 ...
- html制作立体骰子,AI教程:利用illustrator自带的3D功能制作一个逼真的立体骰子...
今天课课家来教大家如何用Illustrator制作一个三维骰子,本教程只分析方法,不进行逐步详细讲解,希望大家用自己理解的方式实现出理想的效果来,具体步骤可分为以下三大步: 首先我们来看看最终效果图: ...
- 相机模型和双目立体匹配完成一个基于KITTI立体相机采集图片的立体图像匹配程序,生成视差图像和3D点云图像
机模型和双目立体匹配完成一个基于KITTI立体相机采集图片的立体图像匹配程序,生成视差图像和3D点云图像 一.针孔相机模型 二.双目相机模型 三.OpenCV实例实现用Pangolin生成视差图像和3 ...
- OpenCV制作一个类“全能扫描王”的简易扫描软件
转自:https://www.cnblogs.com/skyfsm/p/7324346.html 相信很多人手机里都装了个"扫描全能王"APP,平时可以用它来可以扫描一些证件.文本 ...
最新文章
- 采购订单的审批状态异常的处理,审批状态为:预审批或是处理中的单据
- python3 使用psutil 查看内存占用
- libwacom9 : Depends: libwacom-common (= 2.2.0-1) but 1.12-1 is to be installed
- 百度,你拿什么和谷歌争?| 畅言
- atitit.故障排除--- 当前命令发生了严重错误。应放弃任何可能产生的结果sql server 2008
- 关于Sentaurus的日常(三)
- Unity项目发布谷歌AAB+PAD
- 解决引用微信公众号获取的图片不能正常显示的问题,显示改图片来自微信公众号
- PYNQ在PS端进行图片缩放
- 光子/粒子的波长,频率及能量的对应表
- layim php,Workerman+LayIM+ThinkPHP5的webIM,即时通讯系统 – ThinkPHP框架
- 关于服务器,看这一篇就够了!
- 台式计算机启动时 每次按f1,电脑开机每次都要按f1怎么办|电脑开机要按f1的解决方法...
- office ppsx逻辑漏洞(CVE-2017-8570)
- webpack之css-loader
- 北京买房的10点建议
- 计算机网络教程第四版谢钧,计算机网络教程(第4版) 谢钧.pdf
- python实现KDJ指标模型 量化策略 python 策略开发
- 数字图像处理之图像增强
- 机器学习十大算法系类