精华内容
参与话题
问答
  • 三维重建技术综述

    万次阅读 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

     

    展开全文
  • 三维重构步骤 最近有人在Twitter上问我,如果不理解代码的工作原理,如何重构。 我回答说 ,这是“通过重构学习”。 然后我尝试用Google搜索它,却一无所获 。 我很惊讶。 对我来说,重构似乎是研究源代码的最有效...

    三维重构步骤

    最近有人在Twitter上如果不理解代码的工作原理,如何重构。 回答说 ,这是“通过重构学习”。 然后我尝试用Google搜索它,却一无所获 我很惊讶。 对我来说,重构似乎是研究源代码的最有效,最明显的方法。 这是我通常的九个面向对象步骤。

    理查德·谢泼德(Dom Hemingway)(2013)

    根据Wikipedia的说法, 代码重构是“重构现有计算机代码的过程-更改因子分解-而无需更改其外部行为。” 重构的目的是使代码更具可读性并适合于修改。

    这是我不知道代码但需要修改时通常要执行的操作。 从最简单的技术开始,按照复杂性的顺序对这些技术进行排序。

    删除IDE红色斑点

    当我使用自定义settings.jar在IntelliJ IDEA中打开Cactoos的源代码时,我看到的是这样的:

    当我打开诸如Spring Boot的源代码时,我看到类似这样的内容(它是osbImageBanner它是从一千个看起来非常相似的其他类中随机选择的): 看到不同?

    当我看到别人的代码时,我要做的第一件事是使它对我的IDE来说是“红色斑点”。 这些红色斑点中的大多数很容易消除,而其他一些将需要一些时间进行重构。 在这样做的同时,我学到了很多关于 废话 我必须处理的程序。

    删除空行

    我前段时间写道 ,方法主体中的空行是不好的事情。 它们是冗余复杂度的明显指标。 程序员倾向于将它们添加到他们的方法中以简化内容。

    这是来自Apache Maven代码RepositoryUtils一种方法(随机选择类RepositoryUtils ,但是几乎所有其他类的格式都相同):
    <
    除了“全红”之外,他们的代码还充满了空行。 删除它们可以使代码更具可读性,也可以帮助我理解代码的工作原理。 较大的方法将需要重构,因为如果没有空行,它们将几乎变得完全不可读。 因此,我主要通过将它们分解为更小的方法来压缩,理解并缩小它们。

    使名字更短

    我通常赞成对变量使用简短的一名词名称,对于方法使用简短的一动词名称。 认为较长的“复合”名称表明不必要的代码复杂性。

    例如,我在Spring Boot的osbweuUndertowServletWebServerFactory类中找到了方法registerServletContainerInitializerToDriveServletContextInitializers (69个字符!)。 我不知道为什么笔者跳过couldYouPlease前缀和otherwiseThrowAnException后缀。

    除了笑话,这么长的方法名称清楚地表明代码太复杂了,无法用简单的register甚至registerContainer来解释。 似乎有许多不同的容器,初始化程序,servlet和其他生物需要以某种方式进行注册。 当我加入一个项目并看到一个使用该名称的方法时,我正为大麻烦做准备。

    当开始使用外部代码或旧代码时,使名称更短是我必须执行的重构步骤。

    添加单元测试

    大多数类(和方法)都没有任何文档,尤其是当我们谈论的是闭源商业代码时。 如果这些班级或多或少具有描述性的名称并且规模小且具有凝聚力,我们将很幸运。

    但是,我更喜欢处理单元测试,而不是文档。 他们更好地解释了代码并证明它有效。 当我不了解类的工作原理时,我会尝试为其编写单元测试。 在大多数情况下,由于许多原因,这是不可能的。

    删除多个退货

    之前写过 ,在单个方法中存在多个return语句并不是鼓励面向对象的编程。 相反,方法必须始终具有单个出口点,就像函数编程中的那些函数一样。

    从Spring Boot的osbcpbBinder类中查看此方法(那里有很多类似的示例,我随机选择了一个):

    这么小的方法有五个return语句。 对于面向对象的代码来说太多了。 程序代码没关系,我有时也会写。 例如,我们的这个Groovy脚本也有五个return关键字:

    但这是Groovy,不是一门课。 这只是一个过程,一个脚本。

    重构和删除多个return语句绝对有助于使代码更整洁。 通常是因为没有它们,有必要使用if/then/else语句的更深层嵌套,然后代码开始看起来很难看,除非您将其分解为较小的部分。

    摆脱NULL

    是邪恶的 ,这是众所周知的事实。 但是,它们仍然无处不在。 例如,Spring Boot v2.0.0.RELEASE和243K LoC中有4,100个Java文件,其中包含null关键字7,055次。 这意味着每35行大约有一个null

    相反,我几年前创建的Takes Framework具有771个Java文件,15.4万个LoC和58个null关键字。 每2700行大约是一个null 看到不同?

    当您删除NULL时,代码会变得更整洁,但这并不是那么容易。 有时甚至是不可能的。 这就是为什么我们在Takes中仍然有58个null情况。 我们根本无法删除它们,因为它们来自JDK。

    使对象不变

    正如我前段时间所展示的不变性有助于缩小对象。 我在处理的外部代码中看到的大多数类都是可变的。 和大。

    如果查看jpeek分析的任何工件,您会发现在大多数对象中,大约80%的类是可变的。 从可变性到不变性是面向对象编程中的一大挑战,如果解决,它将带来更好的代码。

    使事物不可变的重构步骤纯粹是有利可图的。

    移除静电

    如果您是过程程序员,则静态方法和属性很方便。 如果您的代码是面向对象的,则它们必须消失 在Spring Boot中,有7,482个static关键字,这意味着每32行代码需要一个。 相反,在Takes中,我们有310个static -s,每496行是一个。

    将这些数字与有关NULL的统计数据进行比较,您会发现摆脱static是一项更为复杂的任务。

    应用静态分析

    这是最后一步,也是最复杂的一步。 这很复杂,因为我将静态分析仪配置为最大潜力甚至更高。 我正在使用Qulice ,它是Checkstyle,PMD和FindBugs的聚合器。 这些家伙本身很坚强,但Qulice使他们变得更坚强 ,增加了几十个定制支票。

    我用于静态分析的原理是0/100。 这意味着要么整个代码库都是干净的,没有Qulice投诉,要么是肮脏的。 中间没有东西。 这不是查看静态分析的非常典型的方法。 大多数程序员使用这些工具只是为了收集有关其代码的“意见”。 我将它们用作重构的指南。

    观看此视频,该视频演示了Qulice对Spring Boot中的spring-boot-project/spring-boot子模块的投诉(视频无休止,因为我在等待中失去了耐心):

    当Qulice说一切都干净时,我认为代码库已准备就绪,可以进行维护和修改。 至此重构已经完成。

    翻译自: https://www.javacodegeeks.com/2018/04/nine-steps-of-learning-by-refactoring.html

    三维重构步骤

    展开全文
  • Matlab将二维图像三维重构

    热门讨论 2010-06-06 10:49:19
    Matlab将二维图像三维重构源代码,把下面的代码写成m文件,运行就可以了。具体你要看到什么样的三维模型,你可以在此基础上修改。
  • CSDN中关于立三维重构的介绍层出不穷,CNKI中也有各类综述对三维重构进行总结,撰写这篇博客仅作为本人对该类博客、论文的总结学习,加深自身学习的印象、作为学习的笔记。如有错误的地方,欢迎指正。   1、三维...

    CSDN中关于立三维重构的介绍层出不穷,CNKI中也有各类综述对三维重构进行总结,撰写这篇博客仅作为本人对该类博客、论文的总结学习,加深自身学习的印象、作为学习的笔记。如有错误的地方,欢迎指正。

     

    1、三维重构

    1.1、三维重构到底是什么?

      首先要了解立体匹配算法,首先要知道立体匹配算法主要具体应用于什么方向。

    三维重构又被称为三维重建,百度百科中对它的定义为:指对三维物体建立适合计算机表示和处理的数学模型,是在计算机环境下对其进行处理、操作和分析其性质的基础,也是在计算机中建立表达客观世界的虚拟现实的关键技术。 

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

      个人认为,三维重构就是通过计算机视觉技术,将现实世界中物体的三维信息获取到计算机中的过程,使物体的三维信息能够通过点云、网格等形式,显示或是储存在计算机中。(如点云的pcd格式文件保存形式、以及利用Gemagic等软件进行点云的可视化处理等。)

    三维数据需要通过三维重建技术获得。广义三维重建是指通过测量工具与解算方法,获取目标局部点、三维坐标、面三维结构乃至整体三维模型;狭义三维重建指通过重建技术,获取包括结构、纹理、尺度等的目标完整三维信息。

    1.2、三维重构具体有什么用?

      在阅读文献的过程中,文献提到了三维重构被广泛应用于无人驾驶、物体导航、无人机避障、医学诊断、逆向工程、文物保护、精密仪器测量等方面。提到的这些方面的应用虽然能够给人一种模糊的印象,但是还是不够具体。因此在此,我想尝试揭开他的神秘面纱。

    1.2.1、无人机避障与无人驾驶

      三维重构在这两种领域的应用主要在于三维地图的构建,具有代表性的是SLAM中的建图、以及视觉测距等。(SLAM,即定位与地图构建。问题可描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边移动一边逐步绘制出此环境完全的地图,所谓完全的地图(a consistent map)是指不受障碍行进到房间可进入的每个角落。)其中机器人的主体由无人机、无人汽车、移动机器人等替换。

      其中一种解决无人机避障问题的方法是对无人机到障碍物的距离进行测量。 其中可运用视觉避障方法从二维的图像中获取三维信息,获得障碍物的深度图像。在避障的过程中,利用SLAM获得了场景模型,在机载计算机里用算法去搜索优化的避障路径。

    其中无人机的避障方式可参考博客:https://blog.csdn.net/weixin_42229404/article/details/81227148

    三维重建在SLAM中主要是视觉SLAM应用,主要利用外部传感器获知环境信息。其中相机是常用的传感器之一,相机又分为三种,分别为:单目相机、双目相机、RGB-D相机等。

    单目相机对于三维信息的提取效果较差,因此主要使用双目相机与RGB-D相机。其中双目相机则是通过左右眼图像的差异来判断场景中物体的远近,能直接提取完整的特征数据,但是计算量复杂。而RGB-D相机,可同时获取图像彩色信息和深度信息,是一种实用的获取三维信息的工具。视觉传感器很好地利用了丰富的环境信息,实现了从早期二维地图到三维地图的转化,丰富了地图信息,但是在现实环境下还存在很大的鲁棒性和高适应能力技术挑战。

    1.2.2、医学诊断

    医学图像三维重建技术主要应用于面绘制、体绘制、医学三维可视化系统等方面。主要是计算机断层扫描(CT)、核磁共振(MRI)、超声波等医学成像技术的发展,使得感兴趣区域CT、MRI图像的三维重建成为可能。

    利用重建软件,如中国科学院开发的一款用于医学图像数据的分析和处理的软件3DMed,可以处理各种医学图像,包括计算机断层扫描图像,磁共振成像和原始格式图像。以MRI为例,如可以通过研究对获取的MRI图像进行分割、三维建模和显示,可以辅助医生对疾病的判断和制定治疗的方案。与双目视觉重构相比,获取图像的方式较为不同。

    1.2.3、三维测量

    运用在测量的三维重构方法属于非接触式测量方法,比起三坐标测量机等接触式测量方法更能满足各类不同的测量需求。其中三维重构方法又分为主动式测量与被动式测量方法。主动式测量是利用投射结构光等(如编码结构光、散斑等),运用直接三角法进行重构测量。而被动式测量法可基于不同视角的测量法,通过不同角度获取图像,根据视差恢复待测物体的三维信息,其基本原理是双目交会测量。

    双目交会测量使用两台相机从不同角度对待测目标进行拍摄,在相机内、外参数标定基础上,通过对匹配点对进行空间立体交会,获得目标点云,进而进行相关测量。目前图像匹配方法发展成熟,因此双目交会对材质、颜色等物面性质及背景光等环境因素要求较低,适合对大型三维物体如建筑物等的测量。双目交会测量精度主要受匹配精度、基高比、相机标定精度等因素制约,因此测量精度较低,同时难以实现实时测量,重建与测量范围不能覆盖整个待测物体,目前只有在一些特定场合得到应用。

    1.3、三维重构的步骤

    三维重构的步骤主要分为:图像获取、摄像机标定、特征提取、立体匹配、三维重构等方面。

    (1)图像获取

    在进行图像处理之前,要使用摄像机获取三维物体的二维图形。光照条件、相机的几何特性等对后续的图像处理造成很大的影响。其中,摄像机的传感器又分为CMOS与CCD,CCD传感器的成像质量比CMOS的更好,但是成本更高。

    首先要对相机进行二次开发,而后搭建出双目视觉平台,而双目相机的关系又主要分为平行光轴与相交光轴两种,将在之后对它们进行讨论。

    (2)摄像机标定

    通过摄像机标定来建立有效的成像模型,求解出摄像机的内外参数,这样就可以结合图像的匹配结果得到空间中的三维点坐标,从而达到进行三维重建的目的。目前最常使用棋盘格,利用张氏标定法进行标定。

    (3)特征提取

    特征主要包括特征点、特征线和区域。大多数情况下都是以特征点为匹配基元,特征点以何种形式提取与用何种匹配策略紧密联系。因此在进行特征点的提取时需要先确定用哪种匹配方法。匹配算法又包括全局立体匹配算法与局部立体匹配算法。之后会进行讨论。

    (4)立体匹配

    立体匹配是指根据所提取的特征来建立图像对之间的一种对应关系,也就是将同一物理空间点在两幅不同图像中的成像点进行一一对应起来。在进行匹配时要注意场景中一些因素的干扰,比如光照条件、噪声干扰、景物几何形状畸变、表面物理特性以及摄像机机特性等诸多变化因素。

    (5)三维重建

    有了比较精确的匹配结果,结合摄像机标定的内外参数,就可以恢复出三维场景信息。由于三维重建精度受匹配精度,摄像机的内外参数误差等因素的影响,因此首先需要做好前面几个步骤的工作,使得各个环节的精度高,误差小,这样才能设计出一个比较精确的立体视觉系统。

    之后可以对重构输出的点云数据进行后处理,如去噪处理、表面重建等。

     

     

     

      

      

    展开全文
  • 多视图三维重构算法与软件实现,有具体的算法和内容。
  • matlab三维重构代码

    2018-06-06 16:53:01
    一个关于matlab进行三维图像重构的小例子,初学者可以用以借鉴。
  • 三维重构的一点实践

    2020-06-30 21:30:12
    最近听了一个公开课,将一个立体物体不同角度的图片进行傅里叶变换后,放置于三维数组中,再进行反傅里叶变换,可以得到物体的3维数据集(照片是二维3通道)。 所用图片: #所引用的图片为某公开课ppt中的截图: ...

    最近听了一个公开课,将一个立体物体不同角度的图片进行傅里叶变换后,放置于三维数组中,再进行反傅里叶变换,可以得到物体的3维数据集(照片是二维3通道)。

    所用图片:
    他人ppt中的图片,仅供研究,代号1
    他人ppt中的图片,仅供研究,代号2
    他人ppt中的图片,仅供研究,代号3

    #所引用的图片为某公开课ppt中的截图: 
    import cv2 
    import numpy as np
    #对图像预处理,转换为单通道图像d
    def preprocess(img):
    	return 0.2126 * img[:,:,0] + 0.7152 * img[:,:,1] + 0.0722 * img[:,:,2]
    p1=cv2.imread("1.png")
    p2=cv2.imread("2.png")
    p3=cv2.imread("3.png")
    p1=preprocess(p1)
    p2=preprocess(p2)
    p3=preprocess(p3)
    #傅里叶变换,同时将高频和低频调换位置
    def fftchange(img,size):    
    	img=cv2.resize(img,size)    
    	f=np.fft.fft2(img)    
    	f_shift=np.fft.fftshift(f)   
    	f_l=np.log(1+np.abs(f_shift))
    	return f_l
    a1=fftchange(p1,(250,250))
    a2=fftchange(p2,(250,250))
    a3=fftchange(p3,(250,250))
    #创建空数组按照ppt中的示意图将傅里叶变换后的图片放入空数组的对应位置
    zeroc=np.zeros((250,250,250))
    zeroc[:,:,125]+=a1
    zeroc[:,125,:]+=a2
    zeroc[125,:,:]+=a3
    #对数组做反傅里叶变换
    ifft = np.fft.ifft2(zeroc)     
    #暂时没找到绘三维矩阵图像方法,求分享
    展开全文
  • 三维重建

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

    千次阅读 2018-10-25 01:46:32
    三维重建 最近在写毕业论文,研究了下三维重建的一些东西,记录下来,以备留存。另外有其他的问题的朋友可以留言。 这篇博文分两个部分: 三维重建方法-  SFM MVS 开源工具-  VisualSFM+PMVS +Mes...
  • 6种常见的三维重建方式

    千次阅读 2019-06-10 19:52:26
    用XYZ个平面在任一点切物体得到个切面,而且X/Y/Z个轴可以任意旋转 2 最大密度投影(MIP maximum intensity projection) 最大密度投影是将一定厚度(即CT层厚)中最大CT值的体素投影到背景平面上,以...
  • 三维重构

    千次阅读 2016-05-21 13:14:57
    视差用于双目的三维重建中,双目三维重建包括以下几步:1、摄像机标定(求取两个摄像头的内外参数),MATLAB中有这个工具包;2、利用摄像头标定得到的内外参数进行图像矫正和校正,校正后的两幅图像对应特征点的纵...
  • 利用sfs算法对目标在不同角度的拍摄图像进行三维重构的MATLAB代码
  • CT扫描三维重构软件说明书,叫你如何真确的使用CT扫描三维重构软件,一步到位非常简洁,你一定会喜欢的
  • PCL系列——三维重构之泊松重构

    万次阅读 热门讨论 2016-04-01 09:35:09
    PCL系列 PCL系列——读入PCD格式文件操作 PCL系列——将点云数据写入PCD格式文件 PCL系列——拼接两个点云 ...PCL系列——三维重构之泊松重构 说明通过本教程,我们将会学会: 如果通过泊松算法进行三
  • 图像测距与三维重构

    千次阅读 2014-05-24 10:58:51
    由于图像是三维景物的二维投影,一幅图像本身不具备复现三维景物的全部几何信息的能力,很显然三维景物背后部分信息在二维图像画面上是反映不出来的。因此,要分析和理解三维景物必须作合适的假定或附加新的测量,...
  • 基于双目视觉和三维重构的三维书写系统

    万次阅读 热门讨论 2010-12-31 23:53:00
    最近在做双目视觉和三维重构,这是这段时间的劳动成果,放上来与大家分享,算是给大家新年的祝福,新年快乐!   这是一组工具,可以一步步实现一个不成熟的三维书写系统。 因为有一组视频数据,所以放到了Google...
  • 基于单目视觉图像序列的三维重构。。。。。。。。。。。。
  • OpenCV三维重构代码

    2018-05-17 20:48:27
    环境OpenCV3.3.0,标定双目相机,用OpenCV写的三维重构的代码,
  • 文章目录基本步骤相机标定图像采集立体校正匹配算法三维重构点云去噪点云显示总结 前面多多少少记录一些相关知识,由于相关工作还在继续,加上网上的教程总不是十分完善。这里做一个总结,希望自己能够加深对这个...
  • 利用双目视觉来构建一个书写系统, 涉及到相机的标定, 图像处理, 重构等相关内容, 自己对这方面也比较感兴趣, 于是就将他的代码git clone 下来做了研究, 这里给出一些研究的相关记录 同时, 我将自己根据源...

空空如也

1 2 3 4 5 ... 20
收藏数 20,751
精华内容 8,300
关键字:

三维重构