三维重建_三维重建精度 - CSDN
三维重建 订阅
三维重建的英文术语名称是3D Reconstruction.三维重建是指对三维物体建立适合计算机表示和处理的数学模型,是在计算机环境下对其进行处理、操作和分析其性质的基础,也是在计算机中建立表达客观世界的虚拟现实的关键技术。 展开全文
三维重建的英文术语名称是3D Reconstruction.三维重建是指对三维物体建立适合计算机表示和处理的数学模型,是在计算机环境下对其进行处理、操作和分析其性质的基础,也是在计算机中建立表达客观世界的虚拟现实的关键技术。
信息
领    域
计算机
类    型
数学模型
中文名
三维重建
外文名
3D Reconstruction
三维重建简介
三维重建的英文术语名称是3D Reconstruction.三维重建是指对三维物体建立适合计算机表示和处理的数学模型,是在计算机环境下对其进行处理、操作和分析其性质的基础,也是在计算机中建立表达客观世界的虚拟现实的关键技术。在计算机视觉中, 三维重建是指根据单视图或者多视图的图像重建三维信息的过程. 由于单视频的信息不完全,因此三维重建需要利用经验知识. 而多视图的三维重建(类似人的双目定位)相对比较容易, 其方法是先对摄像机进行标定, 即计算出摄像机的图象坐标系与世界坐标系的关系.然后利用多个二维图象中的信息重建出三维信息。物体三维重建是计算机辅助几何设计(CAGD)、计算机图形学(CG)、计算机动画、计算机视觉、医学图像处理、科学计算和虚拟现实、数字媒体创作等领域的共性科学问题和核心技术。在计算机内生成物体三维表示主要有两类方法。一类是使用几何建模软件通过人机交互生成人为控制下的物体三维几何模型,另一类是通过一定的手段获取真实物体的几何形状。前者实现技术已经十分成熟,现有若干软件支持,比如:3DMAX、Maya、AutoCAD、UG等等,它们一般使用具有数学表达式的曲线曲面表示几何形状。后者一般称为三维重建过程,三维重建是指利用二维投影恢复物体三维信息(形状等)的数学过程和计算机技术,包括数据获取、预处理、点云拼接和特征分析等步骤。
收起全文
精华内容
参与话题
  • opencv应用实例-实战视频教学

    万人学习 2018-12-17 17:54:06
    并且对这些案例的算法流程及相关接口进行详细说明与讲解,涉及到的opencv具体案例有鸟瞰图、肤色检测、颜色聚类、模板匹配、人眼检测、camshift目标跟踪、三维重建sfm。
  • 三维重建基础

    万次阅读 多人点赞 2016-06-01 20:02:59
    三维重建技术通过深度数据获取、预处理、点云配准与融合、生成表面等过程,把真实场景刻画成符合计算机逻辑表达的数学模型。这种模型可以对如文物保护、游戏开发、建筑设计、临床医学等研究起到辅助的作用。1.1 研究...

    三维重建技术通过深度数据获取、预处理、点云配准与融合、生成表面等过程,把真实场景刻画成符合计算机逻辑表达的数学模型。这种模型可以对如文物保护、游戏开发、建筑设计、临床医学等研究起到辅助的作用。

    1.1 研究背景及意义

    人类通过双眼来探索与发现世界。人类接收外部信息的方式中,有不到三成来自于听觉、触觉、嗅觉等感受器官,而超过七成、最丰富、最复杂的信息则通过视觉[1]进行感知的。计算机视觉便是一种探索给计算机装备眼睛(摄像头)与大脑(算法)的技术,以使计算机能够自主独立的控制行为、解决问题,同时感知、理解、分析外部环境。20世纪60年代,计算机视觉得到了最初的发展。该阶段的研究重心主要体现在如何从二维图像中恢复出如立方体、圆柱体等立体化的三维形状,解释各个物体的空间位置关系。1982年,David Marr[2]从信息处理的角度对数学、神经生理学、计算机图形学等学科的研究成果进行了归纳总结,并在此基础上提出了一系列计算机视觉理论。得益于这个完整明确的理论体系,计算机视觉得到了蓬勃的发展。它的核心思想是从二维图像恢复三维结构。图1-1展示的是经典Marr视觉信息处理过程。
    这里写图片描述

    图1-1 Marr视觉信息处理过程
    Fig.1-1 Process of Marr visual information
    随着科学技术的日新月异,计算机视觉的应用日益受到各行业的关注和重视,如设备检测与监视、医学图像处理、文物保护[3]、机器人视觉、自动导航、工业产品外观设计与生产等领域。计算机视觉技术为人们带来了机遇,也带来了挑战。三维重建作为计算机视觉技术中最为最为热门的研究方向之一,涉及到包括图像处理、立体视觉、模式识别等多个学科体系。利用计算机建立表达现实客观景物的三维模型,并以此来满足生产和生活的需要。随着工业化进程的不断发展,多种技术的实现均有赖于目标物体三维信息的获取。三维重建现已被广发的应用于生活和科研工作中,特别是在医学治疗、文物保护、游戏开发、工业设计、航天航海等方面,展现出了极强的生命力和影响力。

    1.2 三维重建技术简介

    三维重建技术的重点在于如何获取目标场景或物体的深度信息。在景物深度信息已知的条件下,只需要经过点云数据[4]的配准及融合,即可实现景物的三维重建。基于三维重建模型的深层次应用研究也可以随即展开。人们按照被动式测量与主动式测量[5]对目标物体深度信息的获取方法进行了分类,下面对这两种方式进行相应的介绍。

    1.2.1 被动式三维重建技术

    被动式一般利用周围环境如自然光的反射,使用相机获取图像,然后通过特定算法计算得到物体的立体空间信息。主要有以下三种方法:

    1.纹理恢复形状法

    各种物体表面具有不同的纹理信息,这种信息由纹理元组成,根据纹理元可以确定表面方向,从而恢复出相应的三维表面。这种方法称为纹理恢复形状法[6] (Shape From Texture,SFT)。
    纹理法的基本理论为:作为图像视野中不断重复的视觉基元,纹理元覆盖在各个位置和方向上。当某个布满纹理元的物体被投射在平面上时,其相应的纹理元也会发生弯折与变化。例如透视收缩变形使与图像平面夹角越小的纹理元越长,投影变形会使离图像平面越近的纹理元越大。通过对图像的测量来获取变形,进而根据变形后的纹理元,逆向计算出深度数据。SFT对物体表面纹理信息的要求严苛,需要了解成像投影中纹理元的畸变信息,应用范围较窄,只适合纹理特性确定等某些特殊情形。所有在实际使用中较为少见。

    2.阴影恢复形状法

    SFS[7] (Shape From Shading,从阴影恢复形状)法也是一种较为常用的方法。考虑到图像的阴影边界包含了图像的轮廓特征信息,因此能够利用不同光照条件下的图像的明暗程度与阴影来计算物体表面的深度信息,并以反射光照模型进行三维重建。需要注意的是,像素点的亮度受到包括光源指标、摄像机参数、目标表面材质等的制约。
    阴影恢复形状法的应用范围比较广泛,可以恢复除镜面外的各种物体的三维模型。缺点体现在过程多为数学计算、重建结果不够精细,另外不能忽视的是,SFS法需要准确的光源参数,包括位置与方向信息。这就导致其无法应用于诸如露天场景等具有复杂光线的情形中。

    3.立体视觉法

    立体视觉法[8](Multi-View Stereo,MVS)是另外一种常用的三维重建方法。主要包括直接利用测距器获取程距信息、通过一幅图像推测三维信息和利用不同视点上的两幅或多幅图像恢复三维信息等三种方式。通过模拟人类视觉系统,基于视差原理获取图像对应点之间的位置偏差,恢复出三维信息。S.T.Barnard[9]等人对20世纪70年代到80年代之间出现的三维重建的算法和评价体系做了概述。到了80年代中后期,出现了更多、更深层次的视觉原理,包括立体测量方法和深度传感器等,极大的促进了相关学科的发展。新兴方法可以直接获取景物的三维信息,极大的节省了物力与人力成本。U.R.Dhond[10]等人提出了基于层次处理的三目立体约束方法。二十世纪90年代末,涌现出诸如图像匹配的前沿算法、遮挡处理算法等。M.Z.Brown[11]等人总结了2000年到2010年间的三维视觉发展的总体概况,包括遮挡、配准和效率等的相关分析。
    双目立体视觉重建,在实际应用情况优于其他基于视觉的三维重建方法,也逐渐出现在一部分商业化产品上; 不足的是运算量仍然偏大,而且在基线距离较大的情况下重建效果明显降低 。
    代表文章:AKIMOIO T Automatic creation of 3D facial models 1993
    CHEN C L Visual binocular vison systems to solid model reconstruction2007
    作为计算机视觉的关键技术之一,立体视觉法也其弊端。例如,立体视觉需要假设空间的平面是正平面,而实际情况却与此相差甚远。除此之外,匹配还存在歧义性:对于一幅图像上的某些特征点,另外的图像可能存在若干个与之相似的特征点。那么如何选取最适配的匹配点,显得较为棘手。如图1-2所示,展示了Middlebury[16]数据集中Teddy和Cones场景的基准彩色图像、标准视差以及通过Graph Cuts[17]算法获取的立体匹配视差估计结果。虽然视差结果体现出了景物的三维位置关系,但是某些像素点的视差与标准值仍有细微的差距。除此之外,对于如相机运动参数的确定、大型场景重建需要获取多帧图像等问题,也极大的影响了立体视觉的深层次应用。
    这里写图片描述
    图1-2(a) 基准彩色图像
    这里写图片描述
    图1-2(b) 标准视差
    参考:立体匹配导论

    1.2.2 主动式三维重建技术

    主动式是指利用如激光、声波、电磁波等光源或能量源发射至目标物体,通过接收返回的光波来获取物体的深度信息。主动测距有莫尔条纹法、飞行时间法、结构光法和三角测距法等四种方法。

    1.莫尔条纹法

    莫尔条纹在生活中比较常见,如两层薄薄的丝绸重叠在一起,即可以看到不规则的莫尔(Morie)条纹;微风的吹动窗纱时,条纹亦随之运动。莫尔条纹法[18]起源于18世纪的法国,是一项古老又现代的测量方法。基本原理是将两块等间隔排列的直线簇或曲线簇图案重叠起来,以非常小的角度进行相对运动来形成莫尔条纹。如图1-3所示,在主光栅与指示光栅的交叉重合处,因光线的透射与遮挡而产生不同的明暗带,即莫尔条纹。莫尔条纹随着光栅的左右平移而发生垂直位移,此时产生的条纹相位信息体现了待测物体表面的深度信息,再通过逆向的解调函数,实现深度信息的恢复。这种方法具有精度高、实时性强的优点,但是其对光照较为敏感,抗干扰能力弱。
    这里写图片描述
    图1-3 双光栅莫尔条纹法

    提出:WIKTIN recovering surface shape and orientation from texture (1987)(被引用454 次)。
    发展:Warren 2010 对 wiktin 方法进行改进使用了透视投影;
    Liboy 2006 给出了在纹理单元结构发生改变的情况下的重建方法。
    优点:精度高,对光照和噪声不敏感。
    缺点:只应用于具有规则纹理的物体。

    2.飞行时间法

    飞行时间法[19] (Time of Flight,ToF)指的是在光速及声速一定的前提下,通过测量发射信号与接收信号的飞行时间间隔来获得距离的方法。这种信号可以是超声波,也可以是红外线等。飞行时间法相较于立体视觉法而言,具有不受基线长度限制、与纹理无关、成像速度快等特点。但是其也有一定的缺点。首先,ToF相机的分辨率非常低。例如图1-4所示,当今分辨率最高的PMD Camcube 2.0 相机,也仅为204×204像素;其次,ToF相机容易受到环境因素的影响,如混合像素、外界光源等,导致景物深度不准确;最后,系统误差与随机误差对测量结果的影响很大,需要进行后期数据处理,主要体现在场景像素点的位置重合上。值得注意的是,ToF相机的售价达到了数万美元,受众较窄。
    这里写图片描述
    图1-4 SR4000 ToF相机
    Fig.1-4 SR4000 ToF camera

    3.结构光法

    结构光法[20](Structured Light)通过向表面光滑无特征的物体发射具有特征点的光线,依据光源中的立体信息辅助提取物体的深度信息。具体的过程包括两个步骤,首先利用激光投影仪向目标物体投射可编码的光束,生成特征点;然后根据投射模式与投射光的几何图案,通过三角测量原理计算摄像机光心与特征点之间的距离,由此便可获取生成特征点的深度信息,实现模型重建。这种可编码的光束就是结构光,包括各种特定样式的点、线、面等图案。结构光法解决了物体表面平坦、纹理单一、灰度变化缓慢等问题。因为实现简单且精度较高,所以结构光法的应用非常广泛,目前已有多家公司生产了以结构光技术为基础的硬件设备,如PrimeSense公司的Prime Sensor、微软公司的Kinect和华硕公司的Xtion PRO LIVE等产品[21]。图1-5展示了利用结构光技术采集文物三维信息的场景。
    提出:Woodham 对 SFS 进行改进(1980 年):photometric method for determining surface orientation from multiple images (该文章被引用了 891 次)
    发展:Noakes :非线性与噪声减除 2003 年;
    Horocitz :梯度场合控制点 2004 年;
    Tang : 可信度传递与马尔科夫随机场 2005 年;
    Basri : 光源条件未知情况下的三维重建 2007 年;
    Sun :非朗伯特 2007 年;
    Hernandez : 彩色光线进行重建方法 2007 年;
    Shi : 自标定的光度立体视觉法 2010 年。
    这里写图片描述
    图1-5 结构光法原理图

    4.三角测距法

    三角测距法[22]是一种非接触式的测距方法,以三角测量原理为基础。红外设备以一定的角度向物体投射红外线,光遇到物体后发生反射并被CCD(Charge-coupled Device,电荷耦合元件)图像传感器所检测。随着目标物体的移动,此时获取的反射光线也会产生相应的偏移值。根据发射角度、偏移距离、中心矩值和位置关系,便能计算出发射器到物体之间的距离。三角测距法在军工测量、地形勘探等领域中应用广泛。

    参考文献

    [1] Szeliski R. Computer vision: algorithms and applications[M]. Berlin: Springer, 2010.
    [2] D. Marr, et al. A Computational Theory of Human Stereo Vision. Proc.R.Soc.Lond. 1979, B.204:301-328.
    [3] Levoy, M. Pulli, et al. The Digital Michelangelo Project:3D Scanning of Large Statues. Proc.SIGGRAPH,2000.
    [4] Anand A, Koppula H S, Joachims T, et al. Contextually guided semantic labeling and search for three-dimensional point clouds[J]. The International Journal of Robotics Research, 2013, 32(1):19-34.
    [5] Mada S K, Smith M L, Smith L N, et al. Overview of passive and active vision techniques for hand-held 3D data acquisition [C]//Opto Ireland. International Society for Optics and Photonics, 2003: 16-27.
    [6] D. A. Forsyth, J. Ponce, Computer Vision: A Modern Approach. Prentice Hall 2001
    [7] Horn B. K. P. Shape from shading: a method for obtaining the shape of a smooth opaque object from one view. PhD thesis, Department of Electrical Engineering, MIT, Cambridge. 1970.
    [8] Ikeuchi K. Determining surface orientations of specular surfaces by using the photometric stereo method [J]. Pattern Analysis and Machine Intelligence, IEEE Transactions, 1981, (6): 661-669.
    [9] S. T. Barnard, M. A. Fisehler. Computational Stereo[J].ACM Computing Surveys. 1982, Vol.14:553-572.
    [10] U. R. Dhond, J. K. Aggarval. Struct from Stereo—A Review [J]. IEEE Trans. Systems, Man, and Cybemeties.1989, Vol.19: 1489-1510.

    转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/51558310
    来自:shiter编写程序的艺术

    展开全文
  • 三维重建技术综述

    万次阅读 2019-06-15 16:23:25
    三维重建技术通过深度数据获取、预处理、点云配准与融合、生成表面等过程,把真实场景刻画成符合计算机逻辑表达的数学模型。这种模型可以对如文物保护、游戏开发、建筑设计、临床医学等研究起到辅助的作用。 三维...

         三维重建技术通过深度数据获取、预处理、点云配准与融合、生成表面等过程,把真实场景刻画成符合计算机逻辑表达的数学模型。这种模型可以对如文物保护、游戏开发、建筑设计、临床医学等研究起到辅助的作用。

         三维重建技术的重点在于如何获取目标场景或物体的深度信息。在景物深度信息已知的条件下,只需要经过点云数据的配准及融合,即可实现景物的三维重建。基于三维重建模型的深层次应用研究也可以随即展开。人们按照被动式测量与主动式测量[5]对目标物体深度信息的获取方法进行了分类,下面对这两种方式进行相应的介绍。

    被动式三维重建技术

    被动式一般利用周围环境如自然光的反射,使用相机获取图像,然后通过特定算法计算得到物体的立体空间信息。主要有以下三种方法:

    1.纹理恢复形状法

    纹理法的基本理论为:作为图像视野中不断重复的视觉基元,纹理元覆盖在各个位置和方向上。当某个布满纹理元的物体被投射在平面上时,其相应的纹理元也会发生弯折与变化。例如透视收缩变形使与图像平面夹角越小的纹理元越长,投影变形会使离图像平面越近的纹理元越大。通过对图像的测量来获取变形,进而根据变形后的纹理元,逆向计算出深度数据。SFT对物体表面纹理信息的要求严苛,需要了解成像投影中纹理元的畸变信息,应用范围较窄,只适合纹理特性确定等某些特殊情形。所有在实际使用中较为少见。

    2.阴影恢复形状法

         SFS(Shape From Shading,从阴影恢复形状)法也是一种较为常用的方法。图像的阴影边界包含了图像的轮廓特征信息,因此能够利用不同光照条件下的图像的明暗程度与阴影来计算物体表面的深度信息,并以反射光照模型进行三维重建。阴影恢复形状法的应用范围比较广泛,可以恢复除镜面外的各种物体的三维模型。缺点体现在过程多为数学计算、重建结果不够精细,另外不能忽视的是,SFS法需要准确的光源参数,包括位置与方向信息。这就导致其无法应用于诸如露天场景等具有复杂光线的情形中。

    3.立体视觉法

         立体视觉法(Multi-View Stereo,MVS)是另外一种常用的三维重建方法。主要包括直接利用测距器获取程距信息、通过一幅图像推测三维信息和利用不同视点上的两幅或多幅图像恢复三维信息等三种方式。通过模拟人类视觉系统,基于视差原理获取图像对应点之间的位置偏差,恢复出三维信息。

         双目立体视觉重建,在实际应用情况优于其他基于视觉的三维重建方法,也逐渐出现在一部分商业化产品上; 不足的是运算量仍然偏大,而且在基线距离较大的情况下重建效果明显降低 。 作为计算机视觉的关键技术之一,立体视觉法也其弊端。例如,立体视觉需要假设空间的平面是正平面,而实际情况却与此相差甚远。除此之外,匹配还存在歧义性:对于一幅图像上的某些特征点,另外的图像可能存在若干个与之相似的特征点。那么如何选取最适配的匹配点,显得较为棘手。除此之外,对于如相机运动参数的确定、大型场景重建需要获取多帧图像等问题,也极大的影响了立体视觉的深层次应用。 

    主动式三维重建技术

         主动式是指利用如激光、声波、电磁波等光源或能量源发射至目标物体,通过接收返回的光波来获取物体的深度信息。主动测距有莫尔条纹法、飞行时间法、结构光法和三角测距法等四种方法。

    1.莫尔条纹法

    莫尔条纹在生活中比较常见,如两层薄薄的丝绸重叠在一起,即可以看到不规则的莫尔(Morie)条纹。基本原理是将两块等间隔排列的直线簇或曲线簇图案重叠起来,以非常小的角度进行相对运动来形成莫尔条纹。因光线的透射与遮挡而产生不同的明暗带,即莫尔条纹。莫尔条纹随着光栅的左右平移而发生垂直位移,此时产生的条纹相位信息体现了待测物体表面的深度信息,再通过逆向的解调函数,实现深度信息的恢复。这种方法具有精度高、实时性强的优点,但是其对光照较为敏感,抗干扰能力弱。 

    2.飞行时间法

         飞行时间法(Time of Flight,ToF)指的是在光速及声速一定的前提下,通过测量发射信号与接收信号的飞行时间间隔来获得距离的方法。这种信号可以是超声波,也可以是红外线等。飞行时间法相较于立体视觉法而言,具有不受基线长度限制、与纹理无关、成像速度快等特点。但是其也有一定的缺点。首先,ToF相机的分辨率非常低。其次,ToF相机容易受到环境因素的影响,如混合像素、外界光源等,导致景物深度不准确;最后,系统误差与随机误差对测量结果的影响很大,需要进行后期数据处理,主要体现在场景像素点的位置重合上。

    3.结构光法

        结构光法(Structured Light)通过向表面光滑无特征的物体发射具有特征点的光线,依据光源中的立体信息辅助提取物体的深度信息。具体的过程包括两个步骤,首先利用激光投影仪向目标物体投射可编码的光束,生成特征点;然后根据投射模式与投射光的几何图案,通过三角测量原理计算摄像机光心与特征点之间的距离,由此便可获取生成特征点的深度信息,实现模型重建。这种可编码的光束就是结构光,包括各种特定样式的点、线、面等图案。结构光法解决了物体表面平坦、纹理单一、灰度变化缓慢等问题。因为实现简单且精度较高,所以结构光法的应用非常广泛,如微软公司的Kinect

    4.三角测距法

         三角测距法是一种非接触式的测距方法,以三角测量原理为基础。红外设备以一定的角度向物体投射红外线,光遇到物体后发生反射并被CCD(Charge-coupled Device,电荷耦合元件)图像传感器所检测。随着目标物体的移动,此时获取的反射光线也会产生相应的偏移值。根据发射角度、偏移距离、中心矩值和位置关系,便能计算出发射器到物体之间的距离。三角测距法在军工测量、地形勘探等领域中应用广泛。

    from:https://www.cnblogs.com/wuyida/p/6301263.html


    1、彩色图像与深度图像

          彩色图像也叫作RGB图像,R、G、B三个分量对应于红、绿、蓝三个通道的颜色,它们的叠加组成了图像像素的不同灰度级。RGB颜色空间是构成多彩现实世界的基础。深度图像又被称为距离图像,与灰度图像中像素点存储亮度值不同,其像素点存储的是该点到相机的距离,即深度值。下图表示深度图像与灰度图像之间的关系。

                                          

          深度值指的目标物体与测量器材之间的距离。深度值的大小只与距离有关,而与环境、光线、方向等因素无关,所以深度图像能够真实准确的体现景物的几何深度信息。通过建立物体的空间模型,能够为深层次的计算机视觉应用提供更坚实的基础。

                                       

    2、PCL库

         PCL(Point Cloud Library,点云库)是由斯坦福大学的Dr.Radu等学者基于ROS(Robot Operating System,机器人操作系统)下开发与维护的开源项目,最初被用来辅助机器人传感、认知和驱动等领域的开发。随着对三维点云算法的加入与扩充,PCL逐步发展为免费、开源、大规模、跨平台的C++编程库。

         PCL框架包括很多先进的算法和典型的数据结构,如滤波、分割、配准、识别、追踪、可视化、模型拟合、表面重建等诸多功能。在算法方面,PCL是一套包括数据滤波、点云配准、表面生成、图像分割和定位搜索等一系列处理点云数据的算法。例如PCL中实现管道运算的接口流程:

    ①创建处理对象,例如滤波、特征估计、图像分割等; 
    ②通过setInputCloud输入初始点云数据,进入处理模块; 
    ③设置算法相关参数; 
    ④调用不同功能的函数实现运算,并输出结果。

    PCL部分常用的算法模块:

    libpcl I/O:完成数据的输入、输出过程,如点云数据的读写; 
    libpcl filters:完成数据采样、特征提取、参数拟合等过程; 
    libpcl register:完成深度图像的配准过程,例如迭代最近点算法; 
    libpcl surface:完成三维模型的表面生成过程,包括三角网格化、表面平滑等。

    3、点云数据

    如下图所示,展示了典型的点云数据(Point Cloud Data,PCD)模型。

                                         

           点云数据通常出现在逆向工程中,是由测距设备获取的物体表面的信息集合。其扫描资料以点的形式进行记录,这些点既可以是三维坐标,也可以是颜色或者光照强度等信息。通常所使用的点云数据一般包括点坐标精度、空间分辨率和表面法向量等内容。点云一般以PCD格式进行保存,这种格式的点云数据可操作性较强,同时能够提高点云配准融合的速度。本文研究的点云数据为非结构化的散乱点云,属于三维重建特有的点云特点。

    4、三维重建流程

    使用Kinect采集景物的点云数据,经过深度图像增强、点云计算与配准、数据融合、表面生成等步骤,完成对景物的三维重建。

                              

    对获取到的每一帧深度图像均进行前六步操作,直到处理完若干帧。最后完成纹理映射。下面对每个步骤作详细的说明。

    4.1 深度图像的获取

         景物的深度图像由Kinect在Windows平台下拍摄获取,同时可以获取其对应的彩色图像。为了获取足够多的图像,需要变换不同的角度来拍摄同一景物,以保证包含景物的全部信息。具体方案既可以是固定Kinect传感器来拍摄旋转平台上的物体;也可以是旋转Kinect传感器来拍摄固定的物体。

    4.2 预处理

        受到设备分辨率等限制,它的深度信息也存在着许多缺点。为了更好的促进后续基于深度图像的应用,必须对深度图像进行去噪和修复等图像增强过程。作为本文的重点问题,具体的处理方法将在第四章进行详细的解释说明。

        目前深度相机输出的depth图还有很多问题,比如对于光滑物体表面反射、半/透明物体、深色物体、超出量程等都会造成深度图缺失。而且很多深度相机是大片的深度值缺失,这对于算法工程师来说非常头疼。https://mp.weixin.qq.com/s?__biz=MzIxOTczOTM4NA==&mid=2247485757&idx=1&sn=42403a80dffc73f507407e06a8452319&chksm=97d7ecaaa0a065bcf54f06d644d5ec0a719ddeddfc595cf0523dd2ca55dc45b0fade19421587&scene=21#wechat_redirect

    4.3 由深度图计算点云数据

                  

          预处理后的深度图像具有二维信息,像素点的值是深度信息,表示物体表面到Kinect传感器之间的直线距离,以毫米为单位。以摄像机成像原理为基础,可以计算出世界坐标系与图像像素坐标系之间具有下式的转换关系:
                 

        其中u,v为图像坐标系下的任意坐标点。u0,v0分别为图像的中心坐标。xw,yw,zw表示世界坐标系下的三维坐标点。zc表示相机坐标的z轴值,即目标到相机的距离。R,T分别为外参矩阵的3x3旋转矩阵和3x1平移矩阵。

        对外参矩阵的设置:由于世界坐标原点和相机原点是重合的,即没有旋转和平移,所以:

                                         
        注意到,相机坐标系和世界坐标系的坐标原点重合,因此相机坐标和世界坐标下的同一个物体具有相同的深度,即zc=zw.于是公式可进一步简化为:

    从以上的变换矩阵公式,可以计算得到图像点[u,v]T 到世界坐标点[xw,yw,zw]T的变换公式:

                                            

          M1称为相机的内参矩阵,包含内参(fx,fy,u0,v0)。M2称为相机的外参矩阵,包含外参(R:旋转矩阵,T:平移矩阵)。

          M=\begin{bmatrix} \frac{1}{dx}& 0&u_{0} \\ 0& \frac{1}{dy}& v_{0}\\ 0& 0&1 \end{bmatrix}\begin{bmatrix} f& 0&0 \\ 0& f& 0\\ 0& 0&1 \end{bmatrix}=\begin{bmatrix} f_{x}& 0&u_{0} \\ 0& f_{y}& v_{0}\\ 0& 0&1 \end{bmatrix},        Z\begin{bmatrix} x\\ y\\ 1\end{bmatrix}=\begin{bmatrix} f& 0&0 \\ 0& f& 0\\ 0& 0&1 \end{bmatrix}\begin{bmatrix} X\\ Y\\ Z\end{bmatrix}   (图像到相机的变换)

        (u0, v0)是图像坐标系原点(图像中心)在像素坐标系(以左上角为原点)中的坐标,dx 和 dy分别是每个像素在图像平面x和y方向上的物理尺寸。f 为焦距(像平面与相机坐标系原点的距离)。 M称之为内参矩阵可以理解为矩阵内各值只与相机内部参数有关,且不随物体位置变化而变化。其中fx,fy的单位为个(像素数目)。用一幅图来总结从世界坐标系到像素坐标系(不考虑畸变)的转换关系:

                                                               

    相机坐标系:在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为沟通世界坐标系和图像/像素坐标系的中间一环。单位为m。以相机的光心为坐标原点,X 轴和Y 轴分别平行于图像坐标系的 X 轴和Y 轴,相机的光轴为Z 轴,用(Xc, Yc, Zc)表示其坐标值。

    图像坐标系(image coordinate system):描述物体从相机坐标系到图像坐标系的投影透射关系,方便进一步得到像素坐标系下的坐标。 以图像平面的中心为坐标原点,X轴和Y 轴分别平行于图像平面的两条垂直边,用( x , y )表示其坐标值。图像坐标系是用物理单位(例如毫米)表示像素在图像中的位置。

    像素坐标系(pixel coordinate system):描述物体成像后的像点在数字图像上(相片)的坐标,是我们真正从相机内读取到的信息所在的坐标系。单位为个(像素数目)。以图像平面的左上角顶点为原点,X 轴和Y 轴分别平行于图像坐标系的 X 轴和Y 轴,用(u , v )表示其坐标值。数码相机采集的图像首先是形成标准电信号的形式,然后再通过模数转换变换为数字图像。每幅图像的存储形式是M × N的数组,M 行 N 列的图像中的每一个元素的数值代表的是图像点的灰度。这样的每个元素叫像素,像素坐标系就是以像素为单位的图像坐标系。

    4.4 点云配准

        对于多帧通过不同角度拍摄的景物图像,各帧之间包含一定的公共部分。为了利用深度图像进行三维重建,需要对图像进行分析,求解各帧之间的变换参数深度图像的配准是以场景的公共部分为基准,把不同时间、角度、照度获取的多帧图像叠加匹配到统一的坐标系中。计算出相应的平移向量与旋转矩阵,同时消除冗余信息。点云配准除了会制约三维重建的速度,也会影响到最终模型的精细程度和全局效果。因此必须提升点云配准算法的性能。

    三维深度信息的配准按不同的图像输入条件与重建输出需求被分为:粗糙配准、精细配准和全局配准等三类方法。

    (1)粗糙配准(Coarse Registration)

           粗糙配准研究的是多帧从不同角度采集的深度图像。首先提取两帧图像之间的特征点,这种特征点可以是直线、拐点、曲线曲率等显式特征,也可以是自定义的符号、旋转图形、轴心等类型的特征。随后根据特征方程实现初步的配准。粗糙配准后的点云和目标点云将处于同一尺度(像素采样间隔)与参考坐标系内,通过自动记录坐标,得到粗匹配初始值。

    (2)精细配准(Fine Registration)

          精细配准是一种更深层次的配准方法。经过前一步粗配准,得到了变换估计值。将此值作为初始值,在经过不断收敛与迭代的精细配准后,达到更加精准的效果。以经典的ICP(Iterative Closest Point,迭代最近点)算法为例,该算法首先计算初始点云上所有点与目标点云的距离,保证这些点和目标点云的最近点相互对应,同时构造残差平方和的目标函数。基于最小二乘法对误差函数进行最小化处理,经过反复迭代,直到均方误差小于设定的阈值。ICP算法能够获得精正确无误的配准结果,对自由形态曲面配准问题具有重要意义。另外还有如SAA(Simulate Anneal Arithmetic,模拟退火)算法、GA(Genetic Algorithm,遗传)算法等也有各自的特点与使用范畴。

    (3)全局配准(Global Registration)

        全局配准是使用整幅图像直接计算转换矩阵。通过对两帧精细配准结果,按照一定的顺序或一次性的进行多帧图像的配准。这两种配准方式分别称为序列配准(Sequential Registration)和同步配准(Simultaneous Registration)。

         配准过程中,匹配误差被均匀的分散到各个视角的多帧图像中,达到削减多次迭代引起的累积误差的效果。值得注意的是,虽然全局配准可以减小误差,但是其消耗了较大的内存存储空间,大幅度提升了算法的时间复杂度。

    4.5 数据融合

          经过配准后的深度信息仍为空间中散乱无序的点云数据,仅能展现景物的部分信息。因此必须对点云数据进行融合处理,以获得更加精细的重建模型。以Kinect传感器的初始位置为原点构造体积网格,网格把点云空间分割成极多的细小立方体,这种立方体叫做体素(Voxel)。通过为所有体素赋予SDF(Signed Distance Field,有效距离场)值,来隐式的模拟表面。

         SDF值等于此体素到重建表面的最小距离值。当SDF值大于零,表示该体素在表面前;当SDF小于零时,表示该体素在表面后;当SDF值越接近于零,表示该体素越贴近于场景的真实表面。KinectFusion技术虽然对场景的重建具有高效实时的性能,但是其可重建的空间范围却较小,主要体现在消耗了极大的空间用来存取数目繁多的体素。

          为了解决体素占用大量空间的问题,Curless[50]等人提出了TSDF (Truncated Signed Distance Field,截断符号距离场)算法,该方法只存储距真实表面较近的数层体素,而非所有体素。因此能够大幅降低KinectFusion的内存消耗,减少模型冗余点。

                         

         TSDF算法采用栅格立方体代表三维空间,每个栅格中存放的是其到物体表面的距离。TSDF值的正负分别代表被遮挡面与可见面,而表面上的点则经过零点,如图2-7中左侧展示的是栅格立方体中的某个模型。若有另外的模型进入立方体,则按照下式(2-9)与(2-10)实现融合处理。

    ????

    其中,指的是此时点云到栅格的距离,是栅格的初始距离,是用来对同一个栅格距离值进行融合的权重。如图2-7中右侧所示,两个权重之和为新的权重。对于KinectFusion算法而言,当前点云的权重值设置为1。

    鉴于TSDF算法采用了最小二乘法进行了优化,点云融合时又利用了权重值,所有该算法对点云数据有着明显的降噪功能。

    4.6 表面生成

        表面生成的目的是为了构造物体的可视等值面,常用体素级方法直接处理原始灰度体数据。Lorensen[51]提出了经典体素级重建算法:MC(Marching Cube,移动立方体)法。移动立方体法首先将数据场中八个位置相邻的数据分别存放在一个四面体体元的八个顶点处。对于一个边界体素上一条棱边的两个端点而言,当其值一个大于给定的常数T,另一个小于T时,则这条棱边上一定有等值面的一个顶点。然后计算该体元中十二条棱和等值面的交点,并构造体元中的三角面片,所有的三角面片把体元分成了等值面内与等值面外两块区域。最后连接此数据场中的所有体元的三角面片,构成等值面。合并所有立方体的等值面便可生成完整的三维表面。

     

    from:https://www.cnblogs.com/wuyida/p/6301262.html

     

    展开全文
  • 6种常见的三维重建方式

    千次阅读 2019-07-18 10:01:39
    1 多平面重建(MPR multiplanar reconstruction) 用XYZ个平面在任一点切物体得到个切面,而且X/Y/Z个轴可以任意旋转 2 最大密度投影(MIP maximum intensity projection) 最大密度投影是将一定厚度...

    1 多平面重建(MPR  multiplanar reconstruction)

    用XYZ三个平面在任一点切物体得到三个切面,而且X/Y/Z三个轴可以任意旋转

     

     

    2 最大密度投影(MIP maximum intensity projection)

    最大密度投影是将一定厚度(即CT层厚)中最大CT值的体素投影到背景平面上,以显示所有或部分的强化密度高的血管和/或器官

    由于这种方法显示的是一定层厚图像中CT值最高的体素,所以变化层厚会对图像产生影响,如图6和图7。

    图6 (层厚5mm)

    图7 (层厚15mm)

    是不是觉得层厚5mm的MIP图像上门脉有狭窄,而层厚15mm的MIP图像上门脉是正常的?

    所以层厚的选择很重要,既不能太薄(血管的部分管腔可能在层厚以外),又不能太厚(周围组织器官有干扰),这是很考验放射科大夫的技术和临床经验的。

    MIP这种技术有个双胞胎——最小密度投影(minIP),和MIP正好相反,反映的是一定层厚图像中CT值最低的体素,所以常用来显示胆道、气道等组织结构,如图10。

    图10 最小密度投影

    3 表面阴影遮盖(SSD)

    表面阴影遮盖是将操作者的眼睛作为假设光源方向,投射到CT值在设定阈值以上的体素上则不再透过继续成像,仅呈现所有表面体素的集合立体图形,适用于显示CT值与其他结构相差较大的组织结构成像……(天地良心,我说的真是中文,如果觉得理解不了,继续看下文……)说得接地气些,SSD图像就像是黑白的塑形图像,所以临床上主要用于显示骨骼病变或是结肠CT重建,如图11和图12。

    图11 SSD图像(骨骼)                                                   图12 SSD图像(结肠)

    4 容积漫游技术(VRT)

    5 曲面重建(CPR)

    6 虚拟内镜技术(VE)

    展开全文
  • 完成三维图像重建:特征提取,计算坐标,三角剖分,三维重构。
  • OpenCV实现SfM:双目三维重建

    千次下载 热门讨论 2020-07-30 23:33:23
    使用OpenCV3.0进行双目三维重建。 代码是用VS2013写的,OpenCV版本为3.0且包含扩展部分,如果不使用SIFT特征,可以修改源代码,然后使用官方未包含扩展部分的库。软件运行后会将三维重建的结果写入Viewer目录下的...
  • 三维重建

    千次阅读 2018-07-06 17:52:26
    转载自:https://blog.csdn.net/bizer_csdn/article/details/52712965这里三维重建输入的是断层图像。对图像首先需要进行一些常见操作,直方图均衡化、常见滤波、图像锐化、边缘提取、二值化等等,把常见操作集成在...

    转载自:https://blog.csdn.net/bizer_csdn/article/details/52712965

    这里三维重建输入的是断层图像。


    对图像首先需要进行一些常见操作,直方图均衡化、常见滤波、图像锐化、边缘提取、二值化等等,把常见操作集成在一个MATLAB GUI中。当初也是从网上下的demo改的,这里就不要积分了。

    网址:http://download.csdn.net/detail/bizer_csdn/9644508


    这里主要注意一下图像二值化操作(后面MC算法需要输入二值化图像)

    请看这篇博客:http://blog.csdn.net/bizer_csdn/article/details/52717940

    代码编写核心就是就是用一个比较大高斯卷积核与图像卷积后作为二值化的阈值。


    下面开始讲讲三维重建把,我这里主要针对医学断层图像。

    三维重建的方法大概有两种:直接将体素投影到计算机显示平面的方法被称为体绘制(VolumeRendering),也可以被称为直接绘制;而通过几何单元(一般近似选取三角面片)来拟合物体的表面,这种方法被称为面绘制(SurfaceFiting),也可以称为间接绘制。其中,体绘制是直接分析光线穿过三维体数据场时的变化情况,并且得到最终绘制结果;而面绘制方法主要利用计算机图形学技术,借助光照模型,把物体的表面绘制在计算机屏幕上。


    MATLAB自带isosurface其实就是一种等值面绘制技术,具体操作请看:

    https://cn.mathworks.com/help/matlab/visualize/techniques-for-visualizing-scalar-volume-data.html


    下面我们仔细讲一讲:


    首先,体绘制,大概有以下几种:


    光线投射算法(Ray casting)是以图像空间为序的体绘制算法,并被广泛地运用。在光线投射过程中,该算法需要累加计算每一条穿过体数据的光线的不透明度和颜色的属性值,并且投射结束的条件设定为光线不透明或者光线已经穿过体素空间,最后合成当前的不透明度值和颜色值,并把其作为该像素的属性写入帧缓冲区。

    光线投射算法大致有三步,首先,输入原始数据,并可以对其进行一些预处理操作;其次,是计算光强的过程,即根据一定规则对不同的数据赋予不同的不透明度值和颜色值,在VTK编程中,有专门的成员函数负责分段线性化工作,主要依靠vtkSmartPointer<vtkPiecewiseFunction>和vtkSmartPointer<vtkColorTransferFunction>来实现;最后,就是图像与合成显示工作。



    纹理映射算法(Texture Mapping),也称为纹理贴图,由于纹理映射算法中的纹理生成步骤都是在专有的图形硬件中生成,所以它的绘制速度也比光线投射算法快,但质量缺没光线投射算法高。所谓的纹理映射,是指依靠计算机图形学技术描述真实物体表面细节(纹理可以理解为物体表面细节)。二维纹理映射和三维纹理映射是纹理映射算法的典型代表算法。

    人们把物体纹理放入一个称为纹理空间的坐标系中(纹理空间可以理解为一个二维图像),纹理映射,就是建立从物体表面上的点到纹理空间中的点的映射关系,这个过程就像“贴墙纸”。最后,根据映射关系,纹理图案就可以贴到物体表面上。

    三维重建的输入数据可以是二维图像序列,也可以是三维体数据。纹理映射首先要根据输入数据生成纹理,然后才是纹理绘制过程。如果用二维图像序列作为输入,按着不同图形硬件要求,对图像进行裁剪或者插值;然后通过转换函数,分别建立灰度对不透明度和颜色的对应关系,使原来的图像序列变为二维纹理切片序列,构成纹理空间。如果三维体数据作为输入,仍按着照图形硬件要求对体素进行裁剪或者插值,此后,再按某个正交方向对体数据切片,生成二维图像序列,下面步骤就完全与二维图像输入的情况一样,通过转换函数生成二维纹理序列。在VTK编程中,也是依靠vtkSmartPointer<vtkPiecewiseFunction>和vtkSmartPointer<vtkColorTransferFunction>来实现灰度值对不透明度和颜色的转换。


    对于安装VTK的朋友,VTK的官网有demo,这里不贴出来了。


    好了,下面开始重头戏,面绘制。


    面绘制主要通过平面元来逼近物体表面,目前面绘制主要有切片级重建和体素级重建两种,划分依据就是绘制过程中处理元素的级别不同。由于,切片级重建重建方法有一些技术难点尚待解决,本文只介绍介绍体素级重建方法。

    体素级重建方法是体数据内的体素(这里“体素”定义,是三维数据场中相邻两层中相邻的八个顶点组成的立方体,与前文体绘制中“体素”定义完全不同)为单位进行表面跟踪,小面片重建是在体素内完成的。最后,借助于计算机图形学,通过光照模型,明暗处理后,显示出小面片组成的物体。





    表面重建最经典的就是Marching cubes(MC)算法了

    这篇文章是对算法的编程进行了介绍(opengl),很经典,一定要看(ps:后面MC改进我是在VTK平台下实现,VTK实现与该文章大同小异)

    http://paulbourke.net/geometry/polygonise/


    下面接单介绍:


    MC算法,通过等值面提取(IsosurfaceExtraction)重建物体表面,其本质就是从一个三维数据场中抽取一个等值面。等值面定义为三维空间中具有相同属性的点的集合,其数学描述为:

       

    此外,还需要了解下三线性插值,这里就不介绍了。


    标准MC算法的步骤如下:

    (1)确定体素中等值面的剖分方式

    首先需要把体素的八个顶点分为两类,如果顶点数据大于或等于等值面的标量值,记该点的状态为“1”;如果顶点数据小于等值面的标量值,记为该点的状态为“0”。 由于MC算法是基于沿着立方体的边数据场呈连续性变化这一假设上而提出的,也就是说立方体边数据场是线性变化的。所以,如果体素中一条边上的两个顶点分别大于、小于等值面的值(即该棱边上两个顶点状态分别为“1”和“0”),则在该边上必有也仅有一点是这条边与等值面的交点,然后可以通过线性插值方法计算该边上等值面的顶点和该顶点的方向量。

    因为每个体素有八个顶点,而每个顶点又有“1”和“0”两种状态,所以一共有2的8次方种可能,即256种组合。MC算法把256种组合化简了最基本的15种情况。首先,把体素顶点状态置反,即“1”变“0”, “0”变“1”,而对体素内三角面片的剖分方式并没有影响,这一性质也被称为互补对称性,这样256种组合就可以化简为128种。然后,对于上述情况某种确定体素而言,如果这经过旋转后,这个体素与另一情况的体素是一致的,即表现为顶点位置及其状态相同,那么这两种体素情况就又可以合并为同一种,这一性质也被称为旋转对称性,于是128种情况化简为最终的15种情况。

    下图所示为MC算法的15种基本情况,其中黑点表示标记为1的角点,标记为0的角点在图中立方体上为未作记号的顶点。

    在VTK编程处理中,定义了一个构型索引(index),index中存储了体素中八个角点的所有状态(“1”变“0”),如图所示:

     

    为了方便求出每个立方体的索引,实际中让索引从0开始,并根据立方体每个顶点的标量值的状态,决定索引与1,2,4,8,16,32,64,128中依次哪几个(这些数字称之为掩码)进行“或”运算得到。具体核心代码如下所示:

    1. for ( ii=0, index = 0; ii < 8; ii++)
    2. {
    3. if ( s[ii] >= value )
    4. {
    5. index |= CASE_MASK[ii]; // static int CASE_MASK[8] = {1,2,4,8,16,32,64,128};
    6. }
    7. }



    另外VTK通过构造“三角剖分”查找表中确定三角剖分形式,图3·13举例了查找表其中一种构型的构造过程,左为立方体顶点和其边的编号,右为基本构型中的其中一种。

    对于上图右边这一基本构型,我们如下所示的表来表示其三角剖分形式:

    其中数字3,11,2分别表示第3号边、第11号边和第2号边上有三角面片的顶点,而-1表示缺省。由于每个立方体最多可能产生5个三角面片,所以这里一共需要16位数字来表示。

    (2)求取等值面与体素边界的交点

    当体素内三角面片剖分模式确定后,三角面片顶点位置是通过线性插值方法计算得到的,这是因为MC算法假设立方体边数据场呈线性变化。对于体素某一棱边,设其两个端点(p1、p2)的标量数据为v1、v2,那么插值得到的交点(即三角面片的顶点)为p:

    (3)计算等值面顶点处的法向量

    在计算机图形学中,为了生成具有真实感三维图形,就需要选择合适的局部光照模型进行光照计算,所以,MC算法除了要给出三角面片各顶点的坐标外,还是给出该顶点处的法向量。

    在计算出三角面片各顶点处坐标后,虽然可以通过叉积的方法计算该顶点处的法向量,但这种做法计算量较大。MC注意到,对于等值面上任意一点而言,该点处等值面的切线方向在等值面上无变化率可言,而梯度方向是方向导数变化率最大的方向,因此,该点的梯度方向就是该点在等值面上法向量的方向。前文已经讲述MC算法假设立方体边数据场呈线性变化,为了方便求出三角面片顶点处的法向量,可以先分别求出该三角面片顶点所在体素棱边上的两个角点的梯度,然后再次通过线性插值,计算该三角面片顶点的法向量。所谓的中心差分,就是计算当前角点在某个方向上前向和后向两个角点的标量的差分,体素角点的中心差分公式如下:

    此时,法向量为:

    设立方体顶点处的法向量为N1、N2(标量数据仍为V1、V2),再次利用线性插值得到的三角面片顶点处法向量为:

    以上分析了MC算法的基本理论,下面逐步说明MC算法的编程步骤:

         1) 分层读入三维离散数据场的数据;

         2) 逐层扫描三维数据场,把相邻两层的八个顶点组成的立方体作为当前体素;

         3) 分别比较当前体素中八个角点的标量值与等值面的值,计算出当前体素的索引(index);

         4) 排除index为0或者255的体素;

         5) 利用线性插值方法求出三角面片的各顶点坐标;

         6) 利用中心差分法,先计算体素各角点处的法向量,然后再次利用线性插值,

    计算三角面片各顶点处的法向量;

         7) 将三角面片各顶点坐标及相应的法向量送入表面绘制环节。

    MC算法的伪代码描述如下:

     for(k=1;k<Nz;k++)

    {

           读入数据点值

            for(j=1;j<Ny,j++)

            {

               读入数据点值

              for(i=1;j<Nx;i++)

              {

                 a.读入数据点值

                 b. 由当前体素的八个角点(i,j,k),(i+1,j,k),(i,j+1,k),(i+1,j+1,k),(i,j,k+1),(i+1,j,k+1),(i,j+1,k+1)和(i+1,j+1,k+1),判定每个角点上标量值与等值面的值相对大小,并由此                  计算出当前体素的索引下标index,并且排除index为0或255的体素

                 c. 通过当前index对应“三角剖分”插值表,确定当前三角剖分形式

                 d. 由当前三角剖分形式,可知当前体素哪条棱边(以及确定该棱边对应的哪两个顶点)会与三角面片相交

                 e. 由线性插值计算出体素棱边上三角面片顶点的坐标

                 f. 由中心差分法计算体素各角点处的法向量

                g. 再次利用线性插值计算三角面片各顶点处的法向量

                h. 把三角顶点和法向量送入表面绘制步骤

               }

           }

    }

    实现就是这样,如果使用VTK的话,参考一下vtkMarchingCubes这个类

    VTK实现MC源码是这几个文件:vtkMarchingCubes.h,vtkMarchingCubes.cxx,vtkMarchingCubesCases.h,vtkMarchingCubesCases.cxx

    下面看一下结果,可以发现MC去噪声能力有待提高,并且MC算法还存在二义性问题。

    下面对MC方法的改进:

    算法基于文章 "何晖光, 田捷, 赵明昌, 杨骅. 基于分割的三维医学图像表面重建算法[J]. 软件学报, 2002, 02: 219-226"

    对于图像二值化算法,采用的是前文自适应二值化方法,在此处就不再赘述。另外采用二值化数据重建表面,可以不用考虑等值面的标量值,这一点也是有优势的。

    标准算法是遍历所有体素,实际中有些体素并不需要遍历,如上文MC的15种基本构型中的第0号构型,是可以直接忽略的。文献采用的算法把标准MC算法遍历所有体素改为一种基于区域增长的立方体检测方法,并不需要遍历所有体素,这能够加快重建速度。

    除了如前所述,第0号构型不需要考虑外,对于连通区域,如果一个立方体中的三角剖分的形式确定后,那么与它相邻的立方体中的三角面片只可能按着按着三维空间内,前、后、右、左、上、下这六个方向其中的一个或几个方向去延伸。比如,对于图3.11中15种基本构型中的第1号构型,它延伸的方向可能会向前、向左和向下,其他方位相邻的立方体可以不用考虑;

    基于以上分析,当立方体确定后,与之相应的是该立方体的延伸方向也随之确定。因此在标准MC算法的索引(index)和“三角剖分”查找表的基础上,在构建一个立方体邻接表,来确定当前立方体的邻接方向。于此同时,算法可以用一个标记Flag来表示立方体是否被处理过(1代表处理过,0代表未处理过),并在程序初始化时候,让立方体的标记Flag置零。

    MC采用线性插值的方法计算三角面片的顶点坐标和当前顶点的法向量,文献采用的算法直接默认三角面片的顶点在立方体的边的中点,与之相应,法向量计算也改为对立方体边的法向量直接求平均,这样做可以进一步减少计算量。

    所以,算法在标准MC算法基础上,在添加一些数据结构,其基本数据结构包括标准MC算法中的“三角剖分”查找表triCases、一个立方体邻接表neiborCases、一个表示立方体的结构体Cube、一个队列CubeQueue和一个由若干个该结构体组成的向量List。“三角剖分”查找表的构造过程已经在第3.1.1节中阐释,立方体邻接表与其相似,按着前、后、右、左、上、下这六个访问构造,其中1表示此处方向邻接,0表示此处方向不邻接,具体过程这里不再赘述。而对于立方体,本文用图3.13中第0号顶点表示当前立方体坐标,其结构体如下所示:

    1. struct Cube{
    2. int oi;
    3. int oj;
    4. int ok;
    5. int index;
    6. bool Flag;
    7. Cube(int i=0,int j=0,int k=0,int id=0,bool f=0):oi(i),oj(j),ok(k),index(id),Flag(f){}
    8. };

    其中oi,oj,ok分别表示前文中第0号顶点的坐标,index即是前文所示的立方体的构型索引,Flag是立方体的访问标记,并通过构造函数,将所有值初始化为零。

    程序是在VTK的基础上实现的,队列和向量的实现可以通过C++中STL,很方便的实现。

    算法开始时,在遍历体素过程中一旦发现构型索引不为0或255(即立方体index不为0或255)直接停止遍历,把当前立方体作为种子点压入队列CubeQueue中,并置当前立方体的标记Flag为1,随后通过当前立方体的构型索引(index)和“三角剖分”查找表确定当前立方体的三角剖分形式,并按前文所述方法计算各个三角面片的顶点以及各个顶点处的法向量;然后,通过邻接表,把该立方体相邻的立方体压入到队列中。随后循环重复上述步骤,直至队列为空时候停止。


    算法伪代码描述如下:

    输入:分割后的数据(用于表面追踪),原始三维数据(用于计算法向量)

    输出:三维模型

    辅助数据结构:struct Cube;std::queue<Cube> CubeQueue;

    std::vector<Cube>List;

    Begin:

    (1)       初始化List;初始化CubeQueue,置其为空;

    (2)       然后检测数据集,选取一个构型索引index不为0或255的立方体作为种子点,并将其压入队列CubeQueue中;

    while(!CubeQueue.empty()){

    (3)       从CubeQueue中取出队首元素,得到前文图中第0号顶点的坐标(i,j,k),并令List中该立方体的编号idx=i+jOffset+kOffset;

    (4)       if(List[idx].Flag==1)  continue;

    (5)       置List[idx].Flag=1;

    (6)       根据当前立方体的八个顶点状态得到其构型索引index;

    (7)       由构型索引index查找“三角剖分”查找表triCases得到当前立方体的三角剖分形式,同时采用本节前文所述的方法计算各三角面片的顶点坐标和顶点处的法向量;并将其输出备用;

    (8)       通过构型索引,查找立方体邻接表neiborCases将邻接的立方体压入到队列中去;

    }

    End


    再看一下结果,因为有二值图像输入,噪声少很多了:



    代码我放在了github上,欢迎下载指正(VTK6.2):

    https://github.com/bizerfr/new-marching-cubes

    另外,还有把一些常见三维重建算法与上文算法集成在一个简单VTK,QT程序中:

    https://github.com/bizerfr/Simple_Qt_design_3D_reconstruction

    展开全文
  • 三维重建开源软件介绍

    千次阅读 多人点赞 2018-12-02 19:58:33
    先上一个招聘三维重建岗位的图,这个图上信息是我之前在招聘网上看到的,写的很详细,虽然我暂时做不到这些,但是可以描述一个方向,如果你想去三维重建公司工作,那么你应该具备一些什么技能 一、针对初学者 ...
  • 三维重建技术 各种方法简介

    万次阅读 多人点赞 2017-11-21 09:49:16
    三维重建技术通过深度数据获取、预处理、点云配准与融合、生成表面等过程,把真实场景刻画成符合计算机逻辑表达的数学模型。这种模型可以对如文物保护、游戏开发、建筑设计、临床医学等研究起到辅助的作用。 1.1 ...
  • 三维重建概述

    千次阅读 2017-09-18 20:44:53
    三维重建技术通过深度数据获取、预处理、点云配准与融合、生成表面等过程,把真实场景刻画成符合计算机逻辑表达的数学模型。这种模型可以对如文物保护、游戏开发、建筑设计、临床医学等研究起到辅助的作用。 1.1 ...
  • 三维重建技术概述

    万次阅读 多人点赞 2016-12-25 00:08:22
    基于视觉的三维重建,指的是通过摄像机获取场景物体的数据图像,并对此图像进行分析处理,再结合计算机视觉知识推导出现实环境中物体的三维信息。1. 相关概念(1)彩色图像与深度图像彩色图像也叫作RGB图像,R、G、B...
  • OpenCV+OpenGL 双目立体视觉三维重建

    万次阅读 多人点赞 2018-07-18 10:25:04
    0.绪论这篇文章主要为了研究双目立体视觉的最终目标——三维重建,系统的介绍了三维重建的整体步骤。双目立体视觉的整体流程包括:图像获取,摄像机标定,特征提取(稠密匹配中这一步可以省略),立体匹配,三维重建...
  • 三维重建软件 医三维

    2020-07-24 23:33:59
    免费的三维重建影像软件,DICOM软件,三维影像工作站
  • 基于matlab的sfm三维重建

    千次阅读 热门讨论 2018-12-25 20:29:02
    基于matlab的sfm三维重建 想学习三维重建,但是不会c语言,python调用opencv弄得我头大,正好matlab上也有三维重建的代码,于是编跟着案例库的案例倒弄了一阵,大致弄明白了,分享一个流程给新手做参考。 1,加载...
  • 双目视觉三维重建框架

    万次阅读 多人点赞 2018-01-23 14:08:48
    玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题。希望这样的方式让大家以一个轻松的心态阅读玉米的《计算机视觉学习笔记》双目视觉数学架构系列博客。这个系列博客旨在捋顺一下已标定的双目视觉中的...
  • 首先我们先来看一下三维重建的效果图: 这里特别感谢博主shiter的原创文章:OpenCV+OpenGL 双目立体视觉三维重建 本博文参考了该博主的的核心代码,并针对该博主博文中声明的一些BUG进行了修正: 本文代码下载...
  • Kinect实现简单的三维重建

    万次阅读 多人点赞 2014-06-16 20:41:32
    Kinect想必大家已经很熟悉了,最近基于...看到很多国外大牛用Kinect做三维重建,其中最著名的要数来自微软研究院的Kinect Fusion了,可以看看下面这个视频http://v.ku6.com/show/7q2Sa__pa4-rWcAVtB3Xuw...html,或者...
  • 三维重建源代码

    2020-07-19 23:34:02
    利用bundler实现三维重建的源代码,适合参考学习
  • 用matlab实现三维重建

    热门讨论 2020-07-30 23:33:23
    用matlab实现三维重建里面包含图,可调用的m文件
  • 双目立体视觉三维重建

    万次阅读 多人点赞 2020-03-01 18:12:27
    双目立体视觉的整体流程包括:图像获取、双目标定、双目矫正、立体匹配、三维重建。 Stereo Vision OpenCV+OpenGL 双目立体视觉三维重建 OpenCV 双目测距(双目标定、双目校正和立体匹配) 真实场景的双目立体...
1 2 3 4 5 ... 20
收藏数 27,545
精华内容 11,018
关键字:

三维重建