本文为 AI 研习社编译的技术博客,原标题 :
Tutorial: Stereo 3D reconstruction with openCV using an iPhone camera. Part I.
作者 | Omar Padierna
翻译 | yaya牙牙
校对 | Disillusion 审核 | 酱番梨 整理 | 菠萝妹
原文链接:
https://medium.com/@omar.ps16/stereo-3d-reconstruction-with-opencv-using-an-iphone-camera-part-i-c013907d1ab5
注:本文的相关链接请点击文末【阅读原文】进行访问
教程:使用iPhone相机和openCV来完成3D重建
(第一部分)
本篇教程由三段内容组成,这是第二部分和第三部分的链接。
我注意到其他大多数关于三维重建的教程都让人感觉少了点东西。诚然,这些教程都非常的棒,但它们有些是支离破碎的,要么对理论方面过于深究,或者两者兼而有之。
更糟糕的是,他们使用专门的数据集(例如Tsukuba),这就造成对一些数据集之外的东西的时候使用这些算法的时候会有点问题。(因为参数微调)
我相信关于三维重建(广义的计算机视觉)的很酷的事情就是重建你周围的世界,而不是其他人的世界(比如数据集中的世界)。本教程将尝试帮助你用OpenCV的力量重新创造你自己的世界。
简单的说,本教程带你通过使用你自己的手机摄像头和图片实现从零开始到点云。让我们开始吧。
为了避免写一篇非常长的文章,本教程分为三个部分
第一部分(理论和需求):简要概述了立体三维重建所需的步骤
第二部分(相机校正):包括用代码校正你相机的基础知识
第三部分(视差图和点云):介绍了重建图片基础知识利用前面用代码标定过的相机。
如果你很忙或者想直接跳到实际的代码部分,可以直接进入我的GitHub。
重建周围的世界有很多的方法但最终他们都需要一张准确的深度图。
深度图中的每一个像素都表示的是深度信息(而不是颜色信息)。它一般都是用灰度图的形式展现出来。
Tsukuba 数据集的深度图。由OpenCV提供
如同前面提到的得到一张深度图有很多种方法而这些方法都依赖于所使用的传感器。一种传感器可以是简单的相机(从现在起本文我们将其称为RGB相机)但它也可以是其他的传感器比如激光雷达,红外线或者它们的组合。
传感器的类型将会决定深度图的精确程度。根据精确度从大到小排列依次是激光雷达>红外线>相机。深度图也可以着色以更好的显示深度。
Kinect相机自拍图
根据所使用的传感器类型,实际获取深度图所需的步骤或多或少。例如,Kinect摄像头使用红外传感器和RGB相机相结合,这样你马上就能得到一张深度图(因为它是由红外传感器处理的信息)。
但是如果你除了手机摄像头什么都没有呢?在这种情况下你需要做立体重建。立体重建和大脑、眼睛理解深度的原理是一样的。
它的要旨在于从两个不同的角度看同一幅画,在两幅画中寻找相同的东西,并根据位置的不同推断深度。这叫做立体匹配。
为了做立体匹配,两张图片必须具有完全相同的特性。换言之,这两张不应该有任何的失真。这是一个问题,因为大多数的相机中的镜头都会导致了畸变。这意味着,为了精确的进行立体匹配,就需要知道摄像机的光学中心和焦距。
在大多数情况下,这些信息将是未知的(尤其是对于你的手机摄像头),这就是立体三维匹配需要以下的步骤的原因:
1.相机校正:利用一组图片推断相机的光学中心和焦距。
2.图像畸变:消除重建所用图像中的镜头畸变。
3.特征匹配:在两张图片之间查找相似的特征并构建深度图
4.重投影点:使用深度映射将像素重投影到三维空间中
5.建立点云:生成一个新的文件,这个文件包含了三维空间中的点,以便可视化。
6.构建网格来得到实际的三维模型(不在本教程范围之内,但很快会出现在不同的教程中。
步骤1只需要执行一次,除非你更换摄像头。
而第2-5步在你每次得到一对新的图片都需要执行一次,差不多就是这样了。
实际的数学理论(为什么)要复杂的多,但在本教程之后会变得更容易理解,因为在本文结束时你将有一个实例让你可以进行各种实验。
在下一部分,我们将会探讨如何实际校准手机摄像头,以及一些校正的最佳操作,届时再见。
想要继续查看该篇文章相关链接和参考文献?
长按链接点击打开或点击底部【阅读原文】:
https://ai.yanxishe.com/page/TextTranslation/1412
AI研习社每日更新精彩内容,观看更多精彩内容:
等你来译:
点击 阅读原文 查看本文更多内容↙