基于图像的三维重建解释

基于图像的三维重建,是一种通过拍摄一个场景的不同视角的图片,恢复出场景三维模型的方法,三维重建在逆向工程,文物保护,增强现实等领域有着广泛的应用。

本文只总结流程,不做算法的详细解释

主要流程有:

  1. 图像特征点检测与匹配;
  2. 通过对极几何恢复相机模型
  3. SFM(Structure from motion)方法生成稀疏点云
  4. MVS(Multi view Stereo)方法生成稠密点云
  5. 将点云重建为网格模型
  6. 添加纹理和贴图

图像特征点检测与匹配

特征点检测是三维重建的第一步,可以理解成检测出图像中与周围像素不同的点,然后储存进列表,特征点检测算子有很多,方法也都是现成的,比如harris,sift,surf,后两个最常用。

匹配原理是通过对两幅图像储存的特征点按一定算法进行匹配,从而判断不同图像上的点是不是同一个点。常用的两个概念:尺度不变性(同一个特征点能在不同尺度下被检测),旋转不变性(特征点旋转以后依旧能正确匹配)

特征匹配图像

相机模型与对极几何

1.相机模型

相机的表达是三维重建的基础,必须标定了相机参数,才能根据图像计算出像素点的位置和相机姿态。通常相机都是采用针孔相机模型,相机成像四个坐标系(像素坐标系,图像坐标系,摄像机坐标系,世界坐标系)。常见概念:本质矩阵(E),基础矩阵(F),径向畸变(k1,k2)。

世界坐标和相机坐标的转换

姿态估计,6个外参(R,t);R为3x3矩阵,t为向量;

相机标定,5个内参(fa=fb,k1,k2,u0,v0);

2.对极约束:2D-2D

对极几何描述了同一个场景两幅图像之间的几何关系,我们已经通过特征匹配求得匹配点,根据极线约束,就能推导出基础矩阵(F)。

对极约束

常用方法:

1.直接线性变换法(八点法,最小二乘法)

2.基于ransac的鲁棒方法

ransac算法流程:a.随机采样8对匹配点; b.8点法求解基础矩阵F; c.奇异值约束获取基础矩阵F; d.计算误差,并统计内点个数; e.重复上述过程,选择内点数最多的结果; f.对所有内点执行2,3,重新计算F。

SFM方法(Structure from motion)

SFM,又称为运动恢复结构,是一种常用的稀疏重建方法,通过收集到的无序图像,还原三维场景。

1.三角测量:相片中的每一个点,都对应着一个空间投影,不同相片中同一个点的空间投影的交点,就是该点在三维空间的坐标点。通过前两步,我们已经知道相机参数和匹配的特征点。因此,可以通过相机参数和匹配点用三角测量的方法,恢复匹配点在三维空间中的坐标。

2.PnP问题-直接线性变换法:已知三维点和对应的二维点求解相机内外参数,至少需要6对3D-2D对应点。

3.捆绑调整(Bundle Adjustment):一种同时对三维点云位置和相机参数进行非线性优化的方法,(先计算几张图像的位置和相机姿态,再添加新图片,进行优化,直到所有图像都优化完毕)捆绑调整的优化方法主要有 a.最速下降法,b.牛顿法,c. LM(Levenberg-Marquardt)法(结合牛顿法与最速下降法),效果最好。

通过这些方法,可以构建出较为准确的稀疏的三维模型。

稀疏重建

MVS方法(Multi view Stereo)

1.稠密点云的获取方式:

a. 激光,雷达扫描;

b. kinect相机;

c. 结构光;

d。基于图像的mvs方法。

激光雷达一般都是用于扫描精细结构,能得到精度高的点云,效率高,有效范围高达几百米,价格偏贵。 kinect相机是一种深度相机,范围在1-3米,速度快,能实时建模。这两种方法般都已经集成算法,不需要自己编写,直接就能得到稠密三维点云。结构光是用有编码的条纹光对物体进行扫描,方法性能稳定,测量精度高,通常用于人体,文物修复。基于图像的mvs方法,则是在sfm方法基础上进行三维点云重建。

2.基本原则:

a.光度一致性假设:同一空间点在不同视角的投影应当具有相同的光度,重建的核心就是恢复空间中具有光度一致性的点。

b.可视性约束:图像中出现的点不能被遮挡,重建的点前面不能有其他点,并且不能在物体内部。

c.极线搜索:图像中一点对应另一条图像中的线段。

3.主要方法:基于体素方法,基于空间patch方法(PMVS),基于深度图融合方法

稠密点云图像

从点云到网格

三维模型的表述方法主要有两种:边界表述法,空间划分法

1.边界表述法:将三维物体描述成一组表面

a. 多面体表述法,将物体表面表述成一组封闭物体空间的多边形,其中最常用的是三角形和四边形。

b. 曲面表述法:将边界表述成一组参数或者非参数化的曲面。

c. 参数曲面:z=f(x,y),用来表示场景中的规则物体。

b. 隐式曲面:通过函数f(x,y,z)的零水平集,可以用来描述比较复杂的物体

2.空间划分方法:将物体内部的空间划分成细小,不重叠的连续实体来描述物体的形状。

a.构造体素法:通过对一些元素进行加,减,并集和交集等组合运算生成新的物体

b.八叉树法:利用分层的树结构将要表述的物体构造一个树结构,树节点对用空间中一块特定区域。从根节点开始,包含物体的节点被均匀的划分成八个子节点,直到这种迭代满足终止条件。

c.二分空间法:和八叉树法差不多,都是对空间进行逐步划分,只不过二分法是将空间划分成两部分,可随时调整空间分布。

最常见的三维网络都是采用的三角网格,基本结构为 顶点,面片,边。

纹理映射

三维点云不具有拓扑结构,不能进行高质量的渲染,几何结构恢复重建点云的拓扑结构,是进行场景渲染的基础。图像纹理差距较大的原因,主要就是网络模型的优化上。

基本原理:找到三角网络的顶点坐标(x,y,z),然后找到对应的纹理坐标(u,v),按照一定的算法进行纹理映射,从而在拓扑网络上形成纹理图案。

纹理贴图后的图像

基本流程大致就是这些,基于图像的三维重建,一般用于建筑,场景,地形等一些对精度要求不高,要求简单的大型场景的重建。要想重建高精度的器件,还是用激光雷达好。

过几天更新SLAM的方法

三角测量计算三维坐标的代码_计算机视觉10 基于图像的三维模型重建流程总结...相关推荐

  1. 三角测量计算三维坐标的代码_浅谈三维扫描仪的由来

    随着人类的发展,每一款新型产品的由来都是工业革命的产物,人们发明的任何一个产品都是要服务于人类并创造出更多的价值:其中三维扫描仪的出现也是为了满足于人类的需要而产生的,在传统的测量中接触式测量是出现最 ...

  2. Python双目相机计算三维坐标(使用opencv自带图片)

    前言:虽然计算三维坐标已经很多大佬研究过了,但是网上能用的好少啊.原理不多解释了,直接上程序. 1.导入库 import numpy as np import cv2 包括矩阵处理和图像处理的两个基本 ...

  3. python运用三角学通过方位角仰角与距离计算三维坐标

    00:本文目录 01:概念辨析 01.01:方位角.仰角与距离 01.02:三维坐标 02:目标 03:资源 03.01:准备 03.02:文献参考 04:开始编程 05:尾声 05.01: 05.0 ...

  4. python画三维立体图完整代码_如何用Matplotlib 画三维图的示例代码

    最基本的三维图是由(x, y, z)三维坐标点构成的线图与散点图,可以用ax.plot3D和ax.scatter3D函数来创建,默认情况下,散点会自动改变透明度,以在平面上呈现出立体感 三维的线图和散 ...

  5. opengl实现三维动画简单代码_使用Python简单实现马赛克拼图!内附完整代码

    今天小编带大家使用python简单实现马赛克拼图,内容比以往会稍长一些,各位看官老爷可以慢慢细读,若有不足之处还望请斧正,闲话不多说,请看文章. 先看原图: 效果图: 思路: 拼图的原理其实很简单,就 ...

  6. 用python计算绩点的代码_重庆大学GPA计算python程序

    GPA计算方法来源于百度文库的方法,<重庆大学学分绩点计算办法(试行)> 运行环境:python 3.x 脚本源码: # 用于重庆大学GPA计算 # author: DYBOY input ...

  7. 计算营业额的python代码_【每日一练】巧用python实现利润计算

    相信很多小伙伴都遇到过阶梯利率的问题,比如说银行的利息计算,不同阶段的本金有不同的利率:税务的税费计算,不同的营收有不同的缴纳率:个人的提成,不同的销售额提成比率也不同,那么这些你是怎么计算的? 其实 ...

  8. 自己写的计算时间坐标的代码

    1 数据库sql查询的数据 2 最终echarts画出来的图 3 代码如下 计算主方法方法 /*** echarts算时间轴代码(算流量的代码),这里的时间间隔为5秒钟,一分钟的流量,totalSiz ...

  9. 用python计算绩点的代码_【Python】计算GPA

    最近开始我的研究生生涯了,周围都在谈论GPA这种高深的东西,像我这种工科学校背景的孩子一向是个喜欢在键盘上耕耘的人,对考高分没有多大兴趣(其实是没有那个本事).不过我也想知道我自己本科的GPA是多少来 ...

最新文章

  1. 如何在Tensorflow.js中处理MNIST图像数据
  2. python基础知识资料-Python基础知识(一)—简介
  3. 2022-02-21
  4. 1.16 static关键字(静态变量和静态方法)
  5. BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)
  6. 机器学习之决策树与随机森林
  7. vb隐藏指定程序系统托盘图标_Windows环境设置系统托盘图标默认显示
  8. java web获取请求体内容
  9. kafka报错:Error writing out kafka.log:type=Log,name=LogStartOffset,topic=xx EofException
  10. 华为上半年收入4540亿元;GitHub服务中断,已恢复​;Python 3.8.4发布|极客头条
  11. SqlMapConfig.xml 的配置
  12. 多路抢答器c语言编程,多路抢答器的设计
  13. 40多套在线教育平台系统网站源码知识付费源程序网上教育
  14. SpringBoot验证码
  15. 焓湿图软件 android,焓湿图计算软件
  16. linux14.04镜像,ubuntu14.04 iso镜像下载
  17. White Sheet(面积法)
  18. Excel表计算两个时间段之间的总月数、折算年限公式
  19. C++程序设计课程主页-2013级
  20. 手把手教你搭建个人技术博客,半小时搞定

热门文章

  1. Linux下查询图片的大小
  2. 【安卓逆向】护眼软件去广告教程(简单详细)软件名护眼宝
  3. 【报告分享】如何角逐存量车市-易车研究院(附下载)
  4. 学习笔记(01):教你玩转HTML(html5)h5网页设计,网站开发-浏览
  5. 考验记忆力的翻牌小游戏
  6. mysql小数点后保留两位_不会保留小数点位数,做出来的表格难看,巧用ROUND函数解决...
  7. 详讯:微软宣布放弃收购雅虎
  8. Linux驱动模块编译报错 ‘init_module‘ specifies less restrictive attribute than its target
  9. WPD-StackPanel中的控件水平居中
  10. 如何将一个Excel文件中的sheet移动到另外一个Excel?