作者:Kaustubh Sadekar  翻译:顾伟嵩
校对:张玲本文约3000字,建议阅读6分钟
本文我们将学习如何创建一个定制的低成本立体摄像机。

标签:3D计算机视觉,摄像机标定,经典计算机视觉,入门指南,OAK

在本文中,我们将学习如何创建一个定制的低成本立体摄像机(使用一对网络摄像头),并使用它通过用OpenCV捕捉3D视频。我们提供Python和C++的代码。

一个3D视频的示例。

(来源链接:

https://www.youtube.com/channel/UChlS_iGCul2Osw3wPT_k1Ig )

我们都已经看完了上面那样的3D电影和视频,你需要红色-青色的3D眼镜(如图1)来体验3D的效果。它是如何起作用的?当屏幕只是平面时,我们如何体验3D效果?它们都是用安装好的立体摄像机拍摄的。

图1——红色-青色3D眼镜

在上一篇文章中,我们学习了什么是立体摄像机以及它们如何用来帮助计算机进行感知深度的内容。在本文中,我们学习制作自己的立体摄像机,并且理解其如何用来创建3D视频。具体而言,你将学习以下内容:

安装立体摄像机的步骤 

一个立体摄像机通常包含两个相距固定距离的相同摄像头。工业级别标准立体摄像机设备是使用一对相同的摄像头。

为了在家创建一个,我们需要以下材料:

1. 两个USB网络摄像头(最好是同一型号)。

2. 固定摄像头的刚性底座(木头,纸板,PVC泡沫板)。

3. 夹子或强力胶带。

人们可以创造性地使用不同的部件来组装立体摄像机,但基本要求是要保持摄像头刚性固定和平行。

图2——我的DIY立体摄像机(左)和带有深度处理能力的OpenCV AI套件(OAK-D)(右)的图片。在OAKD两侧的两个摄像头构成了立体摄像机的设置。OAK-D的图片来源:https://luxonis.com/depthai# .

许多人已经创建并且分享了他们的DIY立体摄像机设置,如图2左边展示的我的分享,或是在这篇文章中分享的那个。

(https://medium.com/@omar.ps16/stereo-3d-reconstruction-with-opencv-using-an-iphone-camera-part-iii-95460d3eddf0)

一旦我们固定好摄像头,并确保了它们正确校准,我们完工了吗?我们准备好生成视差图和3D视频了吗?

立体标定和校正的重要性

为了理解立体标定和立体校正的重要性,我们尝试用由我们的立体设备拍摄的图片生成视差图,而不进行任何标定和立体校正。

图3——左图和右图由立体摄像头设备拍摄

图4——用左图和右图在没有立体标定的情况下产生的视差图

我们看到,由一个非标定立体摄像头设置生成的视差图是非常嘈杂而不准确。为什么会发生这种情况呢?

基于上一篇文章,对应的关键点应具有相等的Y坐标以简化点对应搜索。在图5中,当绘制几个对应点之间的匹配线时,我们观察到那些线并不是完全水平的。

图5——绘制对应点之间的匹配线。

我们还能观察到对应点的Y坐标不相等。图6显示了一对具有对应点的立体图像,以及用这些图像生成的视差图。我们观察到现在的视差图与前一个相比噪声更小。在这种情况下,对应的关键点具有相等的Y坐标。只有当摄像头平行时,这种情况才可能发生。这是双视图几何体的特殊情况,图像是平行的,并且通过水平平移进行关联。这是必要的,因为这种生成视差图的方法仅在水平方向上搜索对应点的关系。

图6——立体图像对和生成的视差图的特征匹配。

令人惊叹的!我们需要做的就是校准摄像头,并使它们完全平行。那么,我们是否要基于实验和错误手动调整摄像头呢?嗯,作为一个有趣的活动,你可以尝试它!剧透警告!!通过手动调整摄像头来获得一个清晰的视差图将花很长时间。而且,每次设置被干扰,摄像头被移位时,我们都不得不重复这个步骤。这是耗时间的,并不是一个理想的解决方法。

与物理上调整摄像头不同,我们是在软件方面做这些。我们使用一个名叫立体图像校正的方法。[1]图7解释了立体校正的过程。该思想是将两张图重新投影到一个平行于穿过光学中心的的线的公共平面上。这确保了相应点有相同的Y坐标,并且仅通过水平平移进行关联。

图7——立体校正的过程。

(https://upload.wikimedia.org/wikipedia/commons/9/9a/Image_rectification.svg)

立体标定和校正的步骤

基于我们之前关于镜头失真的文章,我们知道由摄像头拍摄的图片会受到镜头失真的影响。因此,除了立体校正,消除图像失真也是必要的。因此整个过程如下:

1. 使用标准OpenCV标定方法(在摄像机标定文章中解释的)分别标定左右两个摄像头。

2. 确定立体摄像机两个摄像头之间的变换。

3. 使用前面步骤中获得的参数和立体标定方法,我们确定两幅图像的变换以进行立体校正。

4. 最后,使用InitUnderortRectiveyMap方法获得查找未失真和校正立体图像对所需的映射。

5. 将该映射应用于原始图像,以获得校正后的无失真立体图像对。

为了执行这些步骤,我们拍摄标定模式的图像。下面的视频展示了为了标定DIY立体相机而拍摄的不同图像。

让我们理解标定和校正的代码。

步骤1:分别标定立体设备的左右摄像头

视频展示了为立体标定拍摄图像的过程(阅读原文查看视频)

https://learnopencv.com/making-a-low-cost-stereo-camera-using-opencv/

在进行立体标定之前,我们对两个摄像头进行单独标定。但是,如果立体标定方法也可以标定两个摄像头中的每一个,我们为什么需要单独标定摄像头呢?

因为要计算的参数很多(参数空间很大),并且在角点检测和将点近似为整数等步骤中也会累积误差。这会增加迭代方法偏离正解的可能性。因此,我们单独计算摄像机参数,并且stereoCalibrate()方法仅用于查找两个立体摄像头对之间的本征矩阵和基础矩阵之间的变换。

但是算法stereoCalibrate()是如何知道要跳过单个摄像头的标定?对此我们设置了CALIB_FIX_INTRINSIC 标志。

步骤2:使用固定的内在参数进行立体标定

当摄像头被标定时,我们把它们传递到stereoCalibrate()方法中,并且设置CALIB_FIX_INTRINSIC标志。我们还传递在两幅图中捕获的3D点和对应的2D像素坐标。

该方法计算了两个摄像头之间以及本征矩阵和基础矩阵之间的旋转和平移。

步骤3:立体校正

利用摄像头的内部特性以及摄像头之间的旋转和平移,我们现在可以应用立体校正。立体校正利用旋转来使两个摄影头图像平面位于同一平面中。除了旋转矩阵,立体校正方法还返回了新坐标空间中的投影矩阵。

步骤4:计算要求获得无失真的校正立体图像对的映射

因为我们假设摄像头是刚性固定的,所以无需再次计算变换。因此,我们计算将立体图像对转换为无失真校正立体图像对的映射,并存储它们以供进一步使用。

3D眼镜是如何起作用的?

一旦我们的DIY立体摄像机标定了,我们就可以创建3D视频了。但在我们了解如何制作3D视频之前,必须先了解3D眼镜的工作原理。

我们用双目视觉系统感知世界。我们的眼睛处于横向不同的位置。因此,它们捕获了一些不同的信息。

我们的左眼和右眼捕捉到的信息有什么区别?

让我们做一个简单的实验!向前伸展你的手臂,并且手里拿着任一物品。现在,闭上一只眼睛看这个物体。一秒钟后,用另一只眼睛重复这个动作,并保持交替。你能观察到你的双眼所能看到的东西有什么不同吗?

该差异主要在于物体的相对水平位置。这些位置差异称为水平视差。在上一篇文章中,我们使用一对立体图像计算了视差图。

现在,把物体靠近你,并且重复同样的实验。你现在看到了什么变化?与物品相对应的水平视差增大。因此,物品的视差越大,它越靠近。这就是我们利用双目视觉系统,通过使用立体视觉来感知深度的方式。

我们可以通过一种称为立体视法的方法,人为地向每只眼睛分别呈现两幅不同的图像来模拟这种差异。最初,对于3D电影,人们通过使用红色和青色滤镜对每只眼睛的图像进行编码来实现。他们使用了红色-青色3D眼镜,以确保两幅图像中的每一幅都能到达眼睛。这就产生了深度错觉。用这种方法产生的立体效果称为立体感3D。因此,这些图像被称为立体感图像,这些眼镜被称为立体感3D眼镜。

创建一个自定义的3D视频

我们了解了如何将立体图像对转换为它的立体感图像,从而在使用立体感眼镜观看时产生深度错觉。但是我们如何捕捉这些立体图像呢?是的!这是我们使用DIY立体摄像机的地方。我们使用DIY立体摄像机设置捕捉立体图像,并为每个立体图像对创建一个立体感图像。然后,我们将所有连续的立体感图像保存为视频。这就是我们制作3D视频的方式!

让我们深入理解代码并创建我们的3D视频。

使用定制的立体摄像机设置和上面解释的代码创建的3D视频(阅读原文查看视频)

https://learnopencv.com/making-a-low-cost-stereo-camera-using-opencv/

空间人工智能导论的第一篇文章讨论了与双视图几何和立体视觉相关的所有基本概念。这篇文章是关于创建一个低成本的立体摄像机设置,标定它,并使用它来创建自定义的3D电影。

本系列的下一篇文章将讨论另一个激动人心的应用,并解释一些有关立体视觉的更基本的概念。

参考文献

[1] C. Loop and Z. Zhang. Computing Rectifying Homographies for Stereo Vision. IEEE Conf. Computer Vision and Pattern Recognition, 1999.

原文标题:

Making A Low-Cost Stereo Camera Using OpenCV

原文地址:

https://learnopencv.com/making-a-low-cost-stereo-camera-using-opencv/

往期回顾:

独家|OpenCV 1.1 Mat - 基本图像容器(附链接)

独家|OpenCV 1.2 如何用OpenCV扫描图像、查找表和测量时间(附链接)

独家|OpenCV 1.3 矩阵的掩膜操作(附链接)

独家|OpenCV 1.4 对图像的操作

独家|OpenCV 1.5 利用OpenCV叠加(混合)两幅图像

独家|OpenCV 1.6 改变图像的对比度和亮度!

独家|OpenCV 1.7 离散傅里叶变换

独家|OpenCV1.8 使用XML和YAML文件实现文件的输入/输出

独家|OpenCV1.9 如何利用OpenCV的parallel_for_并行化代码(附代码)

独家|OpenCV1.10 使用OpenCV实现摄像头标定

编辑:于腾凯

校对:李敏

译者简介

顾伟嵩,中国科学院大学网络空间安全专业研究生。对数据科学领域充满好奇,渴望探索未知世界。课余时间喜欢踢足球、游泳。愿意挑战新事物,结交新朋友,一起进步,一起成长。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

独家|OpenCV1.11 使用OpenCV制作一个低成本立体摄像机相关推荐

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

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:3D视觉工坊 AR/VR的兴起,让我们喜欢上了3D电影 ...

  2. 如何制作一个低成本投入,多功能营销的企业网站

    随着时代的发展,互联网事业越来越被人们所重视,一是现在是互联网+时代,二是互联网创业或是投资门槛相对较低,这导致很多人纷纷踏上互联网道路,这不仅是顺应时势,也是明智的抉择.而如今,各行各业都在潜移默化 ...

  3. OpenCV制作一个类“全能扫描王”的简易扫描软件

    转自:https://www.cnblogs.com/skyfsm/p/7324346.html 相信很多人手机里都装了个"扫描全能王"APP,平时可以用它来可以扫描一些证件.文本 ...

  4. 使用OpenCV制作一个动图表情包

    最近和这个人聊天的过程中,她发了一张表情包,如下: 我第一反应是,我可以用学过的 OpenCV 知识实现这个效果. 说干就干,于是我花了一个小时实现了. 我的大体思路是:先拿到一张图片进行二值化处理, ...

  5. 独家 | OpenCV1.12 对极几何和立体视觉简介(附链接)

    作者:Kaustubh Sadekar 翻译:黄瑞迪 校对:张玲本文约6500字,建议阅读15分钟本文将使用OpenCV和立体视觉来赋予计算机这种深度知觉能力. 你是否曾经好奇过,为什么你带上特制的3 ...

  6. ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

    ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现 ...

  7. Unity制作一个望远镜与查看器摄像机

    Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的 ...

  8. 基于Arduino制作一个实时示波器

    示波器是电子工程师或制造商的工作台上可以找到的最重要的工具之一.它主要用于查看波形并确定其输入端可能随时间变化的信号的电压电平.频率.噪声和其他参数.嵌入式软件开发人员还使用它进行代码调试,技术人员在 ...

  9. 独家|OpenCV1.10 使用OpenCV实现摄像头标定

    作者:Kaustubh Sadekar Satya Mallick翻译:陈之炎 校对:王可汗本文约3200字,建议阅读5分钟 本文为大家系统地介绍了使用OpenCV实现摄像头标定. 标签:摄像头,标定 ...

最新文章

  1. CentOS 7.x 远程重装
  2. loadrunner脚本运行时设置:Run Logic设置运行次数
  3. 视频播放器的极致体验优化
  4. windbg + sos 调试w3wp进程内存崩溃问题
  5. Exchange2013恢复已删除用户邮箱
  6. Map集合知识点(炸窝)
  7. termux使用无图形界面linux,在termux上使用图形化
  8. 全球及中国家具市场消费规模与运营能力状况分析报告2022版
  9. 计算机培训ppt课件,计算机基础操作培训ppt课件.ppt
  10. wifi情况下使用fiddler_如何对手机http进行抓包?Fiddler工具超好用
  11. 正则表达式以及正则表达式在字符串的替换、切割、获取中的应用
  12. 图解HTTP四:返回结果的 HTTP 状态码
  13. Matlab将数据写入文件
  14. Unity3D编程之NGUI和UGUI比较
  15. Android Verified Boot 2.0 最新安卓P AVB详解
  16. PHP实现简单的万年历
  17. Python爬虫学习之API与模拟ajax请求
  18. 毕业四年的职场经历自述
  19. HTML第六次作业笔记
  20. 估值1500亿的阿里云为何要与市值1.2亿的新三板公司光环国际签署战略合作协议?

热门文章

  1. 7-7 12-24小时制 (C语言)
  2. java用1234组成,用javasecp代码展现数字1234可以组成多少个三位数
  3. java+script+当前日期_javascript获取当前时间
  4. java滥用接口_吐槽一下项目中的代码坏味道:滥用java常量
  5. JavaScript专题之模拟实现call和apply
  6. Java-NIO(九):管道 (Pipe)
  7. 细说Android事件传递
  8. Delphi - 数组 详解
  9. lnmp mysql 哪个好_lamp与lnmp的选择
  10. ​kdevelop用法_weixin_44594953的博客-CSDN博客_kdevelop​