当前位置: 首页 > 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来获取指定参数
  • [nginx文档翻译系列] 控制nginx
  • 【mysql】环境安装、服务启动、密码设置
  • Gradle 5.0 正式版发布
  • interface和setter,getter
  • JavaScript对象详解
  • LeetCode18.四数之和 JavaScript
  • Logstash 参考指南(目录)
  • React的组件模式
  • win10下安装mysql5.7
  • 爱情 北京女病人
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 前端面试之闭包
  • 深入 Nginx 之配置篇
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 问题之ssh中Host key verification failed的解决
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • (13)Hive调优——动态分区导致的小文件问题
  • (TOJ2804)Even? Odd?
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (简单) HDU 2612 Find a way,BFS。
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core 版本不支持的问题
  • .net 程序发生了一个不可捕获的异常
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net下的富文本编辑器FCKeditor的配置方法
  • ::before和::after 常见的用法
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @SpringBootApplication 包含的三个注解及其含义
  • []FET-430SIM508 研究日志 11.3.31
  • [ACTF2020 新生赛]Include
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)
  • [Invalid postback or callback argument]昨晚调试程序时出现的问题,MARK一下
  • [JavaScript]_[初级]_[关于forin或for...in循环语句的用法]
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [JDBC-1] JDBC Base Template
  • [LeetCode] 148. Sort List 链表排序
  • [LeetCode]Balanced Binary Tree
  • [Linux]创建新用户并授予root权限