当前位置: 首页 > news >正文

教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...

TB15bxJDjTpK1RjSZKPXXa3UpXa.jpg

本文为 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。

  三维重建所需的步骤

重建周围的世界有很多的方法但最终他们都需要一张准确的深度图。

深度图中的每一个像素都表示的是深度信息(而不是颜色信息)。它一般都是用灰度图的形式展现出来。

TB1fcXJDirpK1RjSZFhXXXSdXXa.jpg

 Tsukuba 数据集的深度图。由OpenCV提供

如同前面提到的得到一张深度图有很多种方法而这些方法都依赖于所使用的传感器。一种传感器可以是简单的相机(从现在起本文我们将其称为RGB相机)但它也可以是其他的传感器比如激光雷达,红外线或者它们的组合。

传感器的类型将会决定深度图的精确程度。根据精确度从大到小排列依次是激光雷达>红外线>相机。深度图也可以着色以更好的显示深度。

TB1mzdJDbvpK1RjSZFqXXcXUVXa.jpg

  Kinect相机自拍图

根据所使用的传感器类型,实际获取深度图所需的步骤或多或少。例如,Kinect摄像头使用红外传感器和RGB相机相结合,这样你马上就能得到一张深度图(因为它是由红外传感器处理的信息)。

但是如果你除了手机摄像头什么都没有呢?在这种情况下你需要做立体重建。立体重建和大脑、眼睛理解深度的原理是一样的。

它的要旨在于从两个不同的角度看同一幅画,在两幅画中寻找相同的东西,并根据位置的不同推断深度。这叫做立体匹配。

为了做立体匹配,两张图片必须具有完全相同的特性。换言之,这两张不应该有任何的失真。这是一个问题,因为大多数的相机中的镜头都会导致了畸变。这意味着,为了精确的进行立体匹配,就需要知道摄像机的光学中心和焦距。

在大多数情况下,这些信息将是未知的(尤其是对于你的手机摄像头),这就是立体三维匹配需要以下的步骤的原因:

1.相机校正:利用一组图片推断相机的光学中心和焦距。

2.图像畸变:消除重建所用图像中的镜头畸变。

3.特征匹配:在两张图片之间查找相似的特征并构建深度图

4.重投影点:使用深度映射将像素重投影到三维空间中

5.建立点云:生成一个新的文件,这个文件包含了三维空间中的点,以便可视化。

6.构建网格来得到实际的三维模型(不在本教程范围之内,但很快会出现在不同的教程中。

步骤1只需要执行一次,除非你更换摄像头。

而第2-5步在你每次得到一对新的图片都需要执行一次,差不多就是这样了。

实际的数学理论(为什么)要复杂的多,但在本教程之后会变得更容易理解,因为在本文结束时你将有一个实例让你可以进行各种实验。

在下一部分,我们将会探讨如何实际校准手机摄像头,以及一些校正的最佳操作,届时再见。

想要继续查看该篇文章相关链接和参考文献?

长按链接点击打开或点击【教程:使用iPhone相机和openCV来完成3D重建(第一部分)】:

https://ai.yanxishe.com/page/TextTranslation/1412

AI研习社每日更新精彩内容,观看更多精彩内容:雷锋网(公众号:雷锋网)雷锋网雷锋网

命名实体识别(NER)综述

杰出数据科学家的关键技能是什么?

初学者怎样使用Keras进行迁移学习

如果你想学数据科学,这 7 类资源千万不能错过

等你来译:

深度学习目标检测算法综述

一文教你如何用PyTorch构建 Faster RCNN

高级DQNs:利用深度强化学习玩吃豆人游戏

用于深度强化学习的结构化控制网络 (ICML 论文讲解)

相关文章:

  • MFC字体样式和颜色设置
  • 【译】Effective TensorFlow Chapter4——TensorFlow中的Broadcast机制的优缺点
  • 分享|面向敏捷开发团队的几款免费项目管理工具
  • 了解promise
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • javascript 几种常用继承方法和优缺点分析
  • Python零基础学习笔记(三十六)—— 递归
  • 『高级篇』docker之课程管理dubbo入门操练(14)
  • 离家46年 志愿者助94岁老兵回乡
  • updateByPrimaryKeySelective更新失败
  • MySQL5.6主从复制最佳实践
  • 关于STL库中的max min swap
  • 前端技术选型的遗憾和经验教训
  • 吴昕曝最新写真 百变风格引领冬日风尚
  • js---通过arguments来获取指定参数
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 4. 路由到控制器 - Laravel从零开始教程
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Consul Config 使用Git做版本控制的实现
  • CSS相对定位
  • docker python 配置
  • ECMAScript6(0):ES6简明参考手册
  • Fabric架构演变之路
  • JS实现简单的MVC模式开发小游戏
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Solarized Scheme
  • Spring核心 Bean的高级装配
  • ViewService——一种保证客户端与服务端同步的方法
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 高程读书笔记 第六章 面向对象程序设计
  • 聚类分析——Kmeans
  • 力扣(LeetCode)56
  • 前端临床手札——文件上传
  • 前端设计模式
  • 问题之ssh中Host key verification failed的解决
  • 正则表达式
  • nb
  • AI算硅基生命吗,为什么?
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #WEB前端(HTML属性)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (HAL库版)freeRTOS移植STMF103
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)计算机毕业设计高校学生选课系统
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)VirtualBox安装增强功能
  • .gitignore文件—git忽略文件
  • .Net Web项目创建比较不错的参考文章
  • .NET程序员迈向卓越的必由之路
  • .Net转前端开发-启航篇,如何定制博客园主题
  • [ JavaScript ] JSON方法