zoukankan      html  css  js  c++  java
  • [二维成像与三维重建]系列(6) 三维重建的简易原理与总体框架

    关键词:基于图像的三维重建 单目视觉 极简原理 总体框架 作者:李二 日期:14/04/2020 - 16/04/2020

    本系列博客从这里开始,进入第二部分,也就是三维重建。
    

    我觉得不能一下就陷入到具体的步骤或者流程中去,讲东西最好先给大家一个总的轮廓以及其核心原理,这样由浅入深,由粗到精,更容易接受与吸收。

    本期博客仅仅介绍三维重建的核心原理,里面涉及的要素或模块,我将在后面的几期中逐个展开。

    话不多说,还是恢复讲故事模式。话说李二在家喜欢上了写博客,天天在阳台上码字,家里人越看他越不顺眼,因为感觉他似乎并没有干什么正经事,于是就有了下面的对话。

    1. 什么是三维重建

    李二的老婆Mme.Zhang问:我说咱天天地也不出去溜达溜达,看你都快废了。前几天看你在朋友圈里面发二维成像与三维重建,费劲巴力的写了这么长时间,想干点啥? 话说什么是三维重建?

    李二觉得难得老婆想了解自己做了点啥事,于是便高兴地说道:简单点说,三维重建≈三维点云获取。如果较起真来,三维重建=三维点云获取+几何结构恢复+场景绘制

    我讲的三维重建指的是基于图像的三维重建,直白点说,就是从一系列图像中恢复三维点云

    严格意义上的三维重建(摘自深蓝学院)
    严格意义上的三维重建(摘自深蓝学院)

    注意:点云构建之后的几何结构恢复(即三维格网化)和场景绘制(即纹理贴图),则不在本系列的scope之内。

    2. 三维重建有什么用

    Mme.Zhang:那三维重建有什么用处?

    李二:太多了。根据重建到的三维物体,可以准确测量它的三维结构

    • 例1. 比如咱们去巴黎的时候,很遗憾的没有参观巴黎圣母院,他 不是被火烧了嘛。这时我们根据以前测量到的三维结构,就可以原汁原味的恢复它火烧之前的面貌。
    • 例2. 再比如,现在虚拟现实、增强现实不是都很火嘛,关键就是把三维建出来。
    • 例3. 还有关于我的近地面植被遥感工作,只有把树和作物的三维建立出来,才能更好地测量他们的一些参数,比如生物量、叶倾角之类的。

    假如我们只看图像,它缺失了距离信息,扭曲了物体之间的角度信息,我们没法基于影像做一些准确的测量。

    了解一下:计算机视觉包含两个基本方向,物体识别和三维重建。

    • 图像识别的突破性进展源自于2012年卷积神经网络的兴起(AlexNet)
    • 三维重建是未来的必然趋势,我们生活在三维空间里,必须将虚拟世界恢复到三维,才能和环境进行交互。
    • 三维重建和图像识别将逐渐融为一体

    3. 需要什么设备来重建三维

    Mme.Zhang忽然觉得李二每天也不是瞎胡闹了,倒是有点用处了,于是便问起来:那用什么设备能获取三维信息呢?

    李二见老婆挺上道,话匣子便打开了:刚才我说了,三维重建其实可以认为就是获取三维点云,那么点云获取的方式有三种:

    • 激光雷达LiDAR,直接对三维进行测量,直接得到三维点云
    • 深度相机,比如Kinect,也是直接获取三维信息,其实感觉不能叫做三维,算是2.5维,得到深度图
    • 双目立体视觉,两个标定好的相机,通过同时拍照以及立体视差获取三维信息,可以类比于人眼;摄影测量就是这么干的。
    • 单目视觉,也就是一个相机,通过一系列照片,根据某些算法,恢复三维。
    三维获取的四种方式(摘自深蓝学院)
    三维获取的四种方式(摘自深蓝学院)

    (每一项的具体信息,不做展开了,各位看官请自行出门左转了解)

    Mme.Zhang坚定的说:那还弄啥嘞,直接LiDAR上呀。

    李二突然一下不知道该咋解释了,便含糊的说道:

    • LiDAR不是贵嘛,目前一般人买不起,等到跟相机差不多钱了可能就行了。
    • 深度相机的左右距离有限,只能最多3-5米的范围吧。
    • 双目立体视觉需要两个位置、姿态标定好的相机,弄起来比较费劲,万一你磕了碰了弄弯了,还得重新标定。
    • 单目视觉就很方便了,一个相机,通过运动,就可以恢复三维,而且这个还有纹理与色彩信息,对于图像识别也是有好处的

    (我解释的可能不够,但是应该把主要问题包含了)

    Mme.Zhang若有所思,突然说道:其实单个相机也不好,因为这样你们男生可以只用一个手机,准确计算出女生的三围、身高、体重了。 李二:这..... 唉.....

    4. 基于图像的三维重建 - 极简原理

    Mme.Zhang终于开始问点关键的了:那你大致说说怎么样基于一个相机恢复三维点云呀,就是你前面说的基于图像的三维重建。不过我是文科生,你别讲太深了。

    李二自信满满的说:别说你是文科生,你就是初中生,我都给你讲明白了。核心原理十分简单,肯定能听懂。

    (各位看官若是看不懂,评论区写差评)

    李二开始了表演:

    准备材料:我们刚刚说到,必须要一系列的图像才行,而且图像之间要有重叠,不能拍的东西完全不同,否则咋重建。不妨拿四张图像来解释一下三维重建。


    极简思路:假如这四幅影像是在不同视角拍摄的同一地物,由下图可以看出,这四幅影像同时看到了地物的一些相同的地方,比如我们知道每幅影像的拍摄位置(或者光心(焦点)位置) 以及姿态 (嗨,看官们,其实就是外方位元素),它们在不同视角都看到了点,那么就可以通过图像 、点对应的像素位置 恢复出视线(line of sight) ,一共四条视线。因为所有的视线都应该交于点 ,因此构成了6个空间三角形。

    • 其实一个空间三角形,就能够确定点 的空间位置,就是三角定位(triangulation)。在极简思路中,你可以认为多出的空间三角形没用。(备注一下,是非常有用的,因为噪声的问题)。
    • 不一定在每幅图像中都必须出现点 ,理想情况下,两幅就够了,因为两幅图像的视线就可以构造一个空间三角形进行三角定位。(备注一下,事实上至少三四张,才能有理想结果)。

    这四幅影像其实不止同时看到了点 ,他们可能同时也看到了其他很多点,这时就能够构成点云啦,也就恢复三维了

    由影像同名点构成的多个三角几何,并进行三角定位
    由影像同名点构成的多个三角几何,并进行三角定位

    (如果仅仅想了解三维重建的核心原理的看官,看到这就够了。之后无非是怎么找特征点,确定同名点,三角定位确定三维点,因为误差所以需要不断优化调整,得到最终的三维点以及相机的内外方位元素)

    Mme.Zhang很高兴,她觉得她已经已经理解了,便说:就这么点事呀,那你前段时间又买书又查资料的,又费劲巴力的写二维成像的博客。我的护肤化妆品钱都然你给造了。

    5. 基于图像的三维重建 - 总体框架

    李二梗着脖子,涨红了脸说道:哪有这么简单,实际中还有好多问题呢。比如我下面要讲这些,直到本世纪初,它们的技术才慢慢成形呢,2010年左右才正式到了应用层次。

    Mme.Zhang拗不过我,便说:行行行,你自己玩耍吧,我去护肤化妆去了。

    题外话:我一看见一桌子护肤品,就想到,相同的钱买点电子产品也好呀。我是人穷志气短呀!
    

    李二看Mme.Zhang没有听下去的欲望,不知是为了表明这事情真不容易,还是因为其他原因,便自言自语地接着说了下去,在实际三维重建中我们会发现几个问题:

    上面说到四幅图像都看到空间点 ,对应在图像上的像素点分别为 ,这四个像素点是你人眼识别出来的,但是现在得让计算机识别出来,而且识别出这四个像素点都对应同一个空间点 ,这就有点难度了。

      1. 特征点检测:图像中会有很多像素点,一些比较有特征的点更容易识别和表达出来,比如灰度变化剧烈的点,这些点被称为特征点或者关键点,因此我们可以把每幅图像的这些特征点先提取出来,这就是特征点检测。
      1. 特征点匹配:每幅图像的特征点被检测出之后,我们需要知道图像与图像之间,哪些特征点是对应的(比如),称之为同名点,这就需要对特征点进行匹配。
      1. 误匹配删除:实际匹配结果可能存在误差,也就是很多错误匹配的点,因此需要通过某种方式对误匹配的点进行删除;
      1. 集束调整(或光束法平差):误差或者噪声何时何地都是存在的,在构建三角几何关系时,也不例外。实际情况中,不同图像对于同一空间点的视线并不一定能保证交于这一点,因此需要通过某种方式对视线进行调整,使其交于一点。在此过程中,基于成像模型,我们也恢复了相机的位置与姿态等外方位元素,同时实现了点云的构建;
      1. 稠密重建:由于一般特征点数量并不是特别多,因此重建出来的点云比较稀疏。但是有了相机位姿之后,每幅图像的每个像元对应的视线我们都知道了,这是就可以根据某种方式,建立稠密点云,形成比较完整的三维。

    这就是基于图像的三维重建的各个模块,每个模块中涉及了很多内容,没有那么简单。但是三维重建的核心东西就是这些。

    基于图像的三维重建的总体框架与流程
    基于图像的三维重建的总体框架与流程

    其实所有的商业或开源三维重建软件的技术路线基本都是一样,但是一些技术细节不同,造成结果的差异。说明具体的技术细节还是十分重要吧!正如对于世界上绝大多数国家来说,即使拿到DF-17的详细图纸,也不一定能造出来。

    6. 后记

    以上故事纯属虚构,如果Mme.Zhang看到,企盼理解,不要揍我。
    

    接下来的几期博客,我可能不会讲的太细了,因为好多具体内容我自己也不了解,更不敢打肿脸充胖子给各位看官讲了。我个人认为:如果不是专门做这个的,仅知其大略或思路即可,不必苛求过深,思路对于我们的借鉴意义更大一些。

  • 相关阅读:
    .net core 3.1 使用Redis缓存
    JavaSE 高级 第11节 缓冲输入输出字节流
    JavaSE 高级 第10节 字节数组输出流ByteArrayOutputStream
    JavaSE 高级 第09节 字节数组输入流ByteArrayInputStream
    JavaSE 高级 第08节 文件输出流FileOutputStream
    JavaSE 高级 第07节 文件输入流FileInputStream
    JavaSE 高级 第06节 初识I、O流
    JavaSE 高级 第05节 日期类与格式化
    JavaSE 高级 第04节 StringBuffer类
    JavaSE 高级 第03节 Math类与猜数字游戏
  • 原文地址:https://www.cnblogs.com/ludwig1860/p/12709846.html
Copyright © 2011-2022 走看看