草庐IT

三维重建(知识点详细解读、主要流程)

wzyannn 2023-07-29 原文

基于本人大创项目所学习三维建模过程的笔记。

1.概念:三维重建是指对三维物体建立适合计算机表示和处理的数学模型,是在计算机环境下对其进行处理、操作和分析其性质的基础,也是在计算机中建立表达客观世界的虚拟现实的关键技术。

2.三维重建的分类
根据采集设备是否主动发射测量信号,分为两类:基于主动视觉理论和基于被动视觉的三维重建方法。
主动视觉三维重建方法:主要包括结构光法和激光扫描法。
被动视觉三维重建方法:被动视觉只使用摄像机采集三维场景得到其投影的二维图像,根据图像的纹理分布等信息恢复深度信息,进而实现三维重建。

3.常见的三维重建表达方式
常规的3D shape representation有以下四种:深度图(depth)、点云(point cloud)、体素(voxel)、网格(mesh)。
深度图
深度图其每个像素值代表的是物体到相机xy平面的距离,单位为 mm。

体素
体素是三维空间中的一个有大小的点,一个小方块,相当于是三维空间种的像素。

点云
点云是某个坐标系下的点的数据集。点包含了丰富的信息,包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等等。在我看来点云可以将现实世界原子化,通过高精度的点云数据可以还原现实世界。万物皆点云,获取方式可通过三维激光扫描等。

用三角网格重建
三角网格就是全部由三角形组成的多边形网格。多边形和三角网格在图形学和建模中广泛使用,用来模拟复杂物体的表面,如建筑、车辆、人体,当然还有茶壶等。任意多边形网格都能转换成三角网格。
三角网格需要存储三类信息:

顶点:每个三角形都有三个顶点,各顶点都有可能和其他三角形共享。 .

边:连接两个顶点的边,每个三角形有三条边。

面:每个三角形对应一个面,我们可以用顶点或边列表表示面。

三角网格

4.主要内容:在计算机视觉中, 三维重建是指根据单视图或者多视图的图像重建三维信息的过程. 由于单视频的信息不完全,因此三维重建需要利用经验知识. 而多视图的三维重建(类似人的双目定位)相对比较容易, 其方法是先对摄像机进行标定, 即计算出摄像机的图象坐标系与世界坐标系的关系.然后利用多个二维图象中的信息重建出三维信息。

5.主要步骤
(1) 图像获取:在进行图像处理之前,先要用摄像机获取三维物体的二维图像。光照条件、相机的几何特性等对后续的图像处理造成很大的影响。
(2)摄像机标定:利用摄像机所拍摄到的图像来还原空间中的物体。在这里,不妨假设摄像机所拍摄到的图像与三维空间中的物体之间存在以下一种简单的线性关系:[像]=M[物],这里,矩阵M可以看成是摄像机成像的几何模型。 M中的参数就是摄像机参数。通常,这些参数是要通过实验与计算来得到的。这个求解参数的过程就称为摄像机标定。
(3)特征提取:特征主要包括特征点、特征线和区域。大多数情况下都是以特征点为匹配基元,特征点以何种形式提取与用何种匹配策略紧密联系。因此在进行特征点的提取时需要先确定用哪种匹配方法。特征点提取算法可以总结为:基于方向导数的方法,基于图像亮度对比关系的方法,基于数学形态学的方法三种。
(4)立体匹配:立体匹配是指根据所提取的特征来建立图像对之间的一种对应关系,也就是将同一物理空间点在两幅不同图像中的成像点进行一一对应起来。在进行匹配时要注意场景中一些因素的干扰,比如光照条件、噪声干扰、景物几何形状畸变、表面物理特性以及摄像机机特性等诸多变化因素。
(5)三维重建:有了比较精确的匹配结果,结合摄像机标定的内外参数,就可以恢复出三维场景信息。由于三维重建精度受匹配精度,摄像机的内外参数误差等因素的影响,因此首先需要做好前面几个步骤的工作,使得各个环节的精度高,误差小,这样才能设计出一个比较精确的立体视觉系统。

6.具体操作(对应上述步骤)
首先在上述几种常见表达方式中,我们选择点云,所以以下具体操作步骤是以点云为基本表达方式来展开细说。
(1)图像获取:工业相机与民用相机相比,采集的图像更加清晰、数据传输更加迅速以及稳定、可以适应更多的非常规条件。因此本设计选择海康威视公司型号为MV-CA013-20GC的CMOS工业相机。

表2.2 MV-CA013-20GC的主要参数

参数类型参数规格
分辨率1280×1024
最大帧率90 fps
数据接口GigE
外形尺寸29 mm × 29 mm × 42 mm
IP防护等级IP30
传感器类型CMOS
工作温度0℃~ 50℃
湿度20% ~ 80%RH 无冷凝

使用三台相机,以待测物为中心,每台间隔 120°放置,即可以采集到环待测物的3张图片。便于对待测物的下一步研究,但是图片需要同时采集,因此本设计对于同步的要求极高。
图3.1 整体系统构建图

(2)摄像机标定:相机标定即根据标定板,拍摄相应的图像,建立图像中像素位置与场景点位置之间的函数关系,根据相机成像模型,由匹配点在图像中的坐标与场景中的坐标的对应关系,求解相机的内部参数和外部参数。
黑白格标定板
首先我们先打印一张黑白格标定板固定于平面上,由于我们使用多个相机,因此需要对各个相机都进行标定。以各个相机从不同的角度拍摄若干张标定板的图像,将标定图像导入到程序中,检测标定图像中的特征点,然后求解理想无畸变情况下的相机的内部参数和外部参数,并用极大似然估计来提升精度。 这之后需要应用最小二乘法来求出实际的径向畸变系数,接着再次用极大似然估计法,综合内部参数,外部参数及畸变参数,来优化估计精度,最后得出相机的内部参数、外部参数及畸变参数。

(3)特征提取:对比ORB、SURF、SIFT三种算法
计算速度: ORB>>SURF>>SIFT(各差一个量级)
旋转鲁棒性: SURF>ORB~SIFT(表示差不多)
模糊鲁棒性: SURF>ORB~SIFT
尺度变换鲁棒性: SURF>SIFT>ORB(ORB并不具备尺度变换性)
较SIFT计算量小,耗时短,具有旋转不变性、尺度不变性,鲁棒性较好。我们选择SURF算法。

Python SURF算法实现:
下面展示一些 内联代码片

// An highlighted block
def surf(filename): img = cv2.imread(filename) # 读取文件
 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化为灰度图 
sift = cv2.xfeatures2d_SURF.create() keyPoint, descriptor = sift.detectAndCompute(img, None) # 特征提取得到关键点以及对应的描述符(特征向量) 
return img, keyPoint, descriptor

(4)特征匹配
特征匹配主要是计算两幅图像中特征描述子的匹配关系。需要计算两个描述符之间的距离,这样他们的差异就被转换成一个单一的数字,我们可以用它作为一个简单的相似度量,如下图:

匹配策略

a.蛮力匹配(Brute Force Matching)
对于第一张图像中给定的关键点,它将获取第二张图像中的每个关键点并计算距离。距离最小的关键点将被视为一对、

b.快速最近邻(FLANN)
2014年,David Lowe和Marius Muja发布了"快速最近邻(fast library for approximate nearest neighbors(FLANN)“)。FLANN训练了一种索引结构,用于遍历使用机器学习概念创建的潜在匹配候选对象。该库构建了非常有效的数据结构(KD树)来搜索匹配对,并避免了穷举法的穷举搜索。因此,速度更快,结果也非常好,但是仍然需要调试匹配参数。
BFMatching和FLANN都接受描述符距离阈值T,该距离阈值T用于将匹配项的数量限制为“好”,并在匹配不对应的情况下丢弃匹配项。相应的“好”对称为"正阳性(TP)”,而错对称为"假阳性(FP)",为T选择合适的值的任务是允许尽可能多的TP匹配,而应尽可能避免FP匹配。尽管在大多数情况下都无法避免FP,但我们可以尽可能的降低FP次数。

有效降低FP的两种策略

a.BFMatching-crossCheck
只要不超过所选阈值T,即使第二图像中不存在关键点,蛮力匹配也将始终返回与关键点的匹配。这不可避免地导致许多错误的匹配。抵消这种情况的一种策略称为交叉检查匹配,它通过两个方向上应用匹配过程并仅保留那些在一个方向上的与在另一个方向上的最佳匹配相同的匹配来工作。交叉检查方法的步骤为:
①对于源图像中的每个描述符,请在参考图像中找到一个或多个最佳匹配。
②切换源图像和参考图像的顺序。
③重复步骤1中源图像和参考图像之间的匹配过程。
④选择其描述符在两个方向上最匹配的那些关键点。
尽管交叉检查匹配会增加处理时间,但通常会消除大量的错误匹配,因此,当精度优于速度时,应始终执行交叉匹配。交叉匹配一般仅仅用于BFMatching。

b.Nearest neighbor distance ratio (NN)/K-nearest-neighbor(KNN)
减少FP数量的另一种非常有效的方法是为每个关键点计算最近邻距离比(nearest neighbor distance ratio)。
KNN与NN的区别在与NN每个特征点只保留一个最好的匹配,而KNN每个特征点保留k个最佳匹配,k一般为2。
主要思想是不要将阈值直接应用于SSD,相反,对于源图像中的每个关键点,两个最佳匹配位于参考图像中,并计算描述符距离之间的比率。然后,将阈值应用于比率,以筛选出模糊匹配。如下图所示:

(5)三维重建:

利用surf算法获得深度图,采用python opencv库完成三维重建点云的重建。

有关三维重建(知识点详细解读、主要流程)的更多相关文章

  1. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  2. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  3. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  4. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  5. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  6. java - java和ruby的主要区别和相似之处是什么? - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭9年前。Improvethisquestion我现在是java专业人士,我喜欢使用ruby​​。这两种语言有什么相似之处吗?主要区别是什么?因为两者都是面向对象的。

  7. ruby-on-rails - 没有找到主要的连接池 - 2

    我正在使用Rails并且非常随机地遇到连接池错误,它不专门针对任何单个端点。我可以在大约70%的时间内命中端点而不会出现此错误。数据库是在谷歌云上运行的PostgreSQL。这是我遇到的错误的主要内容:#/usr/local/bundle/gems/activerecord-5.1.5/lib/active_record/connection_handling.rb:112:in`connection_pool'ActiveRecord::ConnectionNotEstablished(Noconnectionpoolwith'primary'found.):gem文件:source

  8. 华为ensp详细安装包、安装教程及所遇问题 - 2

    目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装

  9. Linux操作系统CentOS7安装Nginx[详细版] - 2

    Nginx安装1.官网下载Nginx2.使用XShell和Xftp将压缩包上传到Linux虚拟机中3.解压文件nginx-1.20.2.tar.gz4.配置nginx5.启动nginx6.拓展(修改端口和常用命令)(一)修改nginx端口(二)常用命令1.官网下载Nginxhttp://nginx.org/en/download.html这里我下载的是1.20.2版本,大家按需下载对应稳定版即可2.使用XShell和Xftp将压缩包上传到Linux虚拟机中没有XShell可以参考《Linux操作系统CentOS7连接XShell》3.解压文件nginx-1.20.2.tar.gz1)检查是否存

  10. 等保工作流程和明细 - 2

    一、系统定级信息系统运营使用单位按照等级保护管理办法和定级指南,自主确定信息系统的安全保护等级。有上级主管部门的,应当经上级主管部门审批。跨省或全国统一联网运行的信息系统可以由其主管部门统一确定安全保护等级。定级需要根据信息系统的实际情况合理定级。二、系统备案第二级以上信息系统定级单位到所在地设区的市级以上公安机关办理备案手续。省级单位到省公安厅网安总队备案,各地市单位一般直接到市级网安支队备案,也有部分地市区县单位的定级备案资料是先交到区县公安网监大队的,具体根据各地市要求来。信息系统运营、使用单位或者其主管部门应当在信息系统安全保护等级确定后30日内,到公安机关办理备案手续。三、初次测评信

随机推荐