精华内容
下载资源
问答
  • 基于matlab对三维点云的法向量进行求取,并进行朝向统一。
  • 针对无任何预知信息下的散乱点云数据配准问题,提出了一种基于点云法向量信息的自动配准算法。根据点云局部法向量的变化提取特征点,通过比较特征点的直方图特征向量获得初始匹配点对;使用随机抽样一致性(RANSAC)...
  • 点云法向量的计算

    2019-02-28 07:06:57
    该代码用于点云数据中每一点的法向量的估算,计算速度较快,带测试数据
  • 利用经典的主成分分析方法来估计点的法向量,计算法向量与参考平面的夹角,利用最邻近点搜索算法,确定每个点的K 个最邻近点,并根据信息熵的定义,提出法向量夹角局部熵模型,局部熵的大小直接反映了表面的特征状况...
  • VEC = PLANENORMVEC(PT1,PT2,PT3) 计算包含三个点 PT1、PT2 和 PT3 的平面的法向量。 当平面表示为 ax + by + cz = 1 时,VEC(1) = a,VEC(2) = b,VEC(3) = c。 点应该是一个 1 x 3 的向量,为每一列指定 x、y 和 z...
  • 为了修复STL文件中的法向量错误,首先将有法向量错误的三角面片所围成的轮廓分为单个环、相连环以及环中环三种类型;然后采用如下的步骤来修复错误:找到所有有法向量错误的三角面片的边界边,找出边界边形成的封闭...
  • 点云主成分分析和法向量计算的python源代码,可下载直接应用
  • 利用Matlab计算三维点云中每个点的单位法向量与特征值。 通过计算当前点与其邻域点的协方差矩阵,进而求得法向量
  • 1、运用k-近邻点估计点云法向量; 2、同时运用matlab自带的3D-pointcloud处理函数拟合点云法向量
  • 对于三维点云的每一个点利用邻域点拟合最小二乘平面并求得法向量
  • 一些点云文件包括PCD格式和PLY格式,还有文件打开的代码和点云法向量计算代码等,直接运行可用
  • 在三维三角剖分中提取其表面三角形,求取每个三角形的法向量,作图。
  • 基于局部平面拟合求点云法向量,是我看到过的比较容易懂的,算法推导也写得很清楚
  • 此函数计算三角网格的法向量,例如 Matlab 函数 patch 使用的。 它首先计算所有面的法向量,然后根据面的角度加权的面法线计算顶点法线。 该函数既作为普通的 Matlab 函数实现,又作为 c 代码中的 mex 文件实现...
  • OSG读取模型的顶点、法向量、纹理坐标并用随机颜色绘制出来 简介 此程序是在使用OSG的过程中,需要获取模型的顶点、法向、纹理坐标等信息,然后使用不同的颜色绘制出来,以区别不同模型。为了知道模型的名称,在模型...
  • 该代码在vs2017中配置的PCL1.9.0环境中运行成功,可以求得点云的法向量和曲率,并存储在txt文件中。
  • 利用克莱姆法则实现三维空间中平面的法向量计算 取平面上三点分别为: P1(x1y1z1) P2(x2y2z2) P3(x3y3z3)求解设法向量(dxdydz)
  • 根据读取文献,自己写的一个基于法向量的点云数据精简的算法,写的比较简单,有注释也通俗易懂。可以更改REM7的取值(0),来调整精简比例。
  • 相应的博客链接:OpenGL+MFC对三维点云的法向量实现可视化 - HW140701的博客 - CSDN博客 http://blog.csdn.net/hw140701/article/details/77899725
  • 估计某个点的法向量,可以类似于点云的曲面法向量估计,将该点附近K近邻的点近似在一个局部平面上,之后就通过最小二乘法拟合该平面方程.本代码是基于PCL库,往库中添加新的法向量估计。
  • 为实现三维地形场景实时光照和阴影,采用顶点周围四点高程和GPU(显卡)寄存器绑定方法,借助顶点缓冲区和顶点着色器实时计算顶点法向量,对比主流地形着色算法,实验验证了GPU法向量实时计算效率和显卡兼容性.研究结果...
  • 本书详细介绍了深度和法向量的非线性优化具体方法及公式推导。
  • Open3D 点云法向量3种估计方法及法向量可视化

    千次阅读 热门讨论 2020-09-24 18:23:54
    该博客主要进行: (1)点云读取可视化 ...(3)法向量三种估计方式(K近邻估计,半径近邻估计,混合搜索估计) (4)点云法向量可视化 (5)点云每个点对应的法向量点存储 (6)点云法向量点可视化

    1)点云读取可视化

    原始点云:

    在这里插入图片描述

    2)下采样可视化

    下采样:

    在这里插入图片描述

    3)法向量三种估计方式(K近邻估计,半径近邻估计,混合搜索估计)

    K近邻估计法向量并可视化:

    在这里插入图片描述
    混合搜索近邻估计可视化
    在这里插入图片描述

    4)点云每个点对应的法向量点存储及可视化

    法向量对应的点可视化:

    在这里插入图片描述

    5)法向量点和原始点云同时可视化

    原始点云灰色,法向量点绿色

    在这里插入图片描述

    6)源码

    # @Description: <Open3D估计法向量,可视化,存储为文件>
    
    import open3d as o3d
    import os
    
    path = os.path.abspath(os.path.join(os.getcwd(), "../"))
    path = path + "/pcds/bunny.pcd"
    normalPath = path.replace(".pcd", "_normal.pcd")
    print(path)
    print(normalPath)
    
    print("Load a pcd point cloud, print it, and render it")
    pcd = o3d.io.read_point_cloud(path)
    pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 把所有点渲染为灰色(灰兔子)
    print(pcd)  # 输出点云点的个数
    # print(o3d.np.asarray(pcd.points))  # 输出点的三维坐标
    o3d.visualization.draw_geometries([pcd], "Open3D origin points", width=800, height=600, left=50, top=50,
                                      point_show_normal=False, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)
    
    print("Downsample the point cloud with a voxel of 0.002")
    downpcd = pcd.voxel_down_sample(voxel_size=0.002)  # 下采样滤波,体素边长为0.002m
    print(downpcd)
    o3d.visualization.draw_geometries([downpcd], "Open3D downsample points", width=800, height=600, left=50, top=50,
                                      point_show_normal=False, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)
    
    print("Recompute the normal of the downsampled point cloud")
    # 混合搜索  KNN搜索  半径搜索
    # downpcd.estimate_normals(
    #     search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=20))  # 计算法线,搜索半径1cm,只考虑邻域内的20个点
    downpcd.estimate_normals(
        search_param=o3d.geometry.KDTreeSearchParamKNN(knn=20))  # 计算法线,只考虑邻域内的20个点
    # downpcd.estimate_normals(
    #     search_param=o3d.geometry.KDTreeSearchParamRadius(radius=0.01))  # 计算法线,搜索半径1cm,只考虑邻域内的20个点
    
    o3d.visualization.draw_geometries([downpcd], "Open3D normal estimation", width=800, height=600, left=50, top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)  # 可视化法线
    print("Print a normal vector of the 0th point")
    print(downpcd.normals[0])  # 输出0点的法向量值
    
    print("Print the normal vectors of the first 10 points")
    print(o3d.np.asarray(downpcd.normals)[:10, :])  # 输出前10个点的法向量
    
    # std::vector<Eigen::Vector3d> with 381 elements. 转换为nparry 以打印访问
    # normals = o3d.np.asarray(downpcd.normals)
    # print(normals)
    
    # 可视化法向量的点,并存储法向量点到文件
    normal_point = o3d.utility.Vector3dVector(downpcd.normals)
    normals = o3d.geometry.PointCloud()
    normals.points = normal_point
    normals.paint_uniform_color((0, 1, 0))  # 点云法向量的点都以绿色显示
    o3d.visualization.draw_geometries([pcd, normals], "Open3D noramls points", width=800, height=600, left=50, top=50,
                                      point_show_normal=False, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)
    o3d.io.write_point_cloud(normalPath, normals)
    
    展开全文
  • 基于法向量密度聚类的LiDAR点云屋顶面提取.pdf
  • 计算法向量与平面的余弦值 #include #include #include #include "stdio.h" #include #define npoint 235992 double mo(double i,double j,double k) {
  • 基于法向量夹角的点云特征点提取,内含参考文献,实现代码和实验数据。
  • 这个文件我下载的程序中的一个头文件,包含bunny顶点数据和顶点法向量数据。
  • 此代码基于MFC编程,在VS2013上可以实现读取OBJ文件和显示,并绘制了3D模型的法向量,注释也清晰易懂,便于初学者学习!
  • 点云法向量

    万次阅读 多人点赞 2019-07-30 09:58:00
    一、点云法向量 法向量是点云中各点的重要属性之一。众多点云算法的实施都基于精确的法向量估计,例如许多表面重建算法、点云分割算法、点云去噪算法以及特征描述算法等。 由空间变换可知,点云中每一点的法向量...

    一、点云法向量

           法向量是点云中各点的重要属性之一。众多点云算法的实施都基于精确的法向量估计,例如许多表面重建算法、点云分割算法、点云去噪算法以及特征描述算法等。

    由空间变换可知,点云中每一点的法向量夹角及曲率值均不随物体的运动而改变,具有刚体运动不变性。

            点云法向量求解需要其邻域内点支持,而邻域的大小一般由邻域半径值或临近点个数来表示。现实中需要根据点分别率、物体细节精细程度和用途等因素来取值。过大的邻域会抹平三维结构细节使得法向量过于粗糙,而过小的邻域由于包含了太少的点受噪声干扰程度较强。

    二、法向量估计方法

    1.基于Delaunay三角分割法

           基于Delaunay三角分割法不适合有噪声的点云,无法很好的用于现场采集数据集中。

    2.基于鲁棒统计学方法

          基于鲁棒统计学的方法从原理到计算都过于复杂,因此无法直接用在大规模的点云场景中。

    3.基于局部表面拟合法

           该方法使用范围最为广泛,且适用于大规模的点云场景中,计算原理较为简单了,效率快。

    (1)原理介绍

            先对点云中的每个点p_{i}以半径A划定邻域范围或者直接选取最近邻的K个点得到邻域内点。此问题转化为使用最小二乘法为邻域内点拟合一个局部平面问题。平面方程的一般表达式为Ax+By+Cz-D=0,需要求解的四个参数中,元素不同时为0的向量\left ( A,B,C \right )的实际意义为平面方程的法向量n,而D则为原点到平面的距离。因此,根据最小二乘法推导的局部平面P_{l}拟合过程可以表示为:

                                                                                   P_{l}=arg min\sum_{i=1}^{n}\left ( \left ( x_{i}-m \right)^{T} n \right )^{2}

           观察上式,估计点的法向量又可转化为主成分分析问题。平面法向量n需要满足模为1,且k个邻域内点的质心m容易求得。
    正常情况下,我们可以将质心点m看成是某一领域中所有点的中心点:

                                                                                                 m=\frac{1}{n}\sum_{i=1}^{n}X_{i}

    同时使得y_{i}=X_{i}-m

    这样,目标函数就可以转化为如下:

                                                                                     P_{l}=min\sum_{i=1}^{n}\left ( \left y_{i}\right^{T} n \right )^{2}

    再进一步推导可以得到如下关系:

                                         P_{l}=min\sum_{i=1}^{n}\left ( \left y_{i}\right^{T} n \right )^{2}=min\sum_{i=1}^{n}n^{T}y_{i}y_{i}^{T}n=min\left [n^{T} \left ( \sum_{i=1}^{n}y_{i}y_{i}^{T} \right )n\right ]

                                               =min\left [ n^{T}\left ( YY^{T} \right ) n\right ]

    于是最终可以将优化函数简化为:

                                                                   P_{l}\left ( n \right )=min\left [f(n)\right ]=min\left [ n^{T}Sn \right ]

    其中满足S=\left ( YY^{T} \right )n^{T}n=1f(n)=n^{T}Sn的条件。

    对于上述目标函数利用拉格朗日算法进行求解:

    假设:\Gamma =f\left ( n \right )-\lambda \left ( n^{T}n-1 \right )  和\bigtriangledown \Gamma =0

    然后再对变量n,\lambda求偏导得到如下式子:

                                                                       \frac{\partial \Gamma }{\partial n}=\frac{\partial }{\partial n}f\left ( n \right )- \lambda \frac{\partial }{\partial n}\left ( n^{T} n \right )

                                                                             =\left ( S+S^{T} \right )n-\lambda \left ( I+I^{T} \right )n=2Sn-2\lambda n

                                                                             \frac{\partial \Gamma }{\partial \lambda }=n^{T}n-1

           推导出如下结果是根据矩阵转置求偏导的性质和S为协方差矩阵同时为对称矩阵的性质。

           为了求得P_{i}的最小值,所以必须满足如下关系:

                                                                          \frac{\partial \Gamma }{\partial n}=0\Leftrightarrow Sn=\lambda n

                                                                           \frac{\partial \Gamma }{\partial \lambda }=0\Leftrightarrow n^{T}n=1

           求解Sn=\lambda n为线性代数里面求解特征值和特征向量的相关公式,即λ是矩阵S的特征值,点云法向量是对应的特征向量。

    (2)求解过程

            假设局部平面附近点云数量为m,每个点云表示为\left [ X_{1},X_{2},X_{3} \right ]^{T},所有点云表示记为P_{i}=\left [ X_{1i},X_{2i},X_{3i} \right ]\left^{T} ( i=1,2,...,m \right )。所以将所有点云变量拼接成一个矩阵,如下:

                                                                               X=\begin{bmatrix} X_{11} & X_{12}& ...& X_{1m}\\ X_{21}& X_{22}& ... & X_{2m}\\ X_{31}& X_{32}& ...&X_{3m}\ \end{bmatrix}_{3\times m}

            根据上面公式推导,计算局部点云的均值,然后在原来点云矩阵上减掉对应方向上的均值\left [ X_{1m},X_{2m},X_{3m} \right ]^{T},重新构造新的点云变量矩阵,如下所示:

                                             Y=\begin{bmatrix} X_{11} & X_{12}& ...& X_{1m}\\ X_{21}& X_{22}& ... & X_{2m}\\ X_{31}& X_{32}& ...&X_{3m}\ \end{bmatrix}_{3\times m}-\begin{bmatrix} X_{1m}\\ X_{2m}\\ X_{3m} \end{bmatrix}=\begin{bmatrix} Y_{11} & Y_{12}& ...& Y_{1m}\\ Y_{21}& Y_{22}& ... & Y_{2m}\\ Y_{31}& Y_{32}& ...&Y_{3m}\ \end{bmatrix}_{3\times m}

            在统计学中,协方差用来刻画两个随机变量之间的相关性,反映的是变量之间的二阶统计特性,考虑两个随机变量X_{i}X_{j}他们的协方差矩阵定义为

                                                           cov\left ( X_{I}-X_{J} \right )=E\left [\left (X-E\left ( X_{i} \right ) \right )\left ( X-E\left ( X_{j} \right ) \right ) \right ]

          协方差为零表示两个变量之间线性不相关。n维随机变量X=\left ( X_{1},X_{2},...,X_{n} \right )^{T}的协方差矩阵定义为

                                 C\left ( X \right )=\left ( c_{ij} \right )_{n\times n}=\begin{bmatrix} cov\left ( X_{1},X_{1} \right )&cov\left ( X_{1},X_{2} \right ) &... &cov\left ( X_{1},X_{n} \right ) \\ cov\left ( X_{2},X_{1} \right )& cov\left ( X_{2},X_{1} \right ) &... &cov\left ( X_{2},X_{n} \right ) \\ & & ^{.}._{.} & \\ cov\left ( X_{n},X_{1} \right)& cov\left ( X_{n},X_{2} \right)& ... & cov\left ( X_{n},X_{n} \right} \end{bmatrix}_{n\times n}

    其中c_{ij}=cov\left ( X_{i},X_{j} \right )。显然,矩阵C是一个对称矩阵。协方差矩阵C中的对角线元素表示方差,非对角线元素表示随机X的不同分量之间的协方差。若不同分量之间的相关性越小,则C的非对角线元素的值就越小。

            经过复杂公式推导,对于拟合成局部平面的点云集之间各变量相关性的协方差矩阵存在如下关系:

                                                                                                 C=\frac{1}{m}YY^{T}

           需要注意是:协方差矩阵C是否除点云集数量m,对求解特征向量没有影响。所以基于构建点云集的协方差矩阵与第一部分原理介绍矩阵有着特征向量,就这样我们就能求出基于局部平面拟合点云的法向量。

    根据上文原理介绍,求解所有点云到拟合局部平面的最短距离可以简化为求解协方差矩阵的最小特征值,即满足Sn=\lambda n的最小特征向量,S的值为S=\frac{1}{m}\left ( YY^{T} \right ),该矩阵为一个3×3的实对称矩阵(非方阵没有特征值和特征向量)。

    特征值和特征向量求解:   Sn=\lambda nSn= \lambda n\Leftrightarrow \left ( \lambda E-S \right )n=0

    特征方程:                                          det\left ( \lambda E-S \right )=0

            使得特征方程为零,求得多个特征值,并将特征值带入到Sn=\lambda n,求解出对应是特征向量。选择最小特征值对应的特征向量,并进行单位化,则该向量为点云法向量。

           上述求解点云法向量的形式与PCA降维求解协方差矩阵的特征值和特征向量相同,于是我们可以借用PCA原理进行求解点云的法向量。需要注意是:基于PCA降维求解协方差矩阵的特征值要求越大越好,其特征向量就越能描述数据的特征,小就越不能区分样本之间的不同,也就是表征了数据中的共性。在我们的优化目标函数中,就是要为所有的邻域点寻找一个平面,使得所有的邻域点都在这个平面上,或者说所有点与该平面的距离最小,所以要求我们选择协方差矩阵的最小特征值和对应特征向量。

           在求出法向量后还需要判断法向量的方向,一般来说法向量方向的矫正没有严格的数学公式可以使用。比较简单的方法是通过视点方向进行判断。比如我的视点方向是(0,0,1),那么求出来的法向量跟(0,0,1)进行点乘,如果小于0,就将法向量取反。更复杂的方法是使用最小生成树对法向量进行方向矫正。

     

    参考文献

    1.点云法向量估计:https://blog.csdn.net/linmingan/article/details/80586214

    2.协方差矩阵推导:https://blog.csdn.net/itplus/article/details/11452743

    3.PCA估计点云法向量:https://zhuanlan.zhihu.com/p/56541912

    4.PCA原理介绍:https://zhuanlan.zhihu.com/p/37777074

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 169,785
精华内容 67,914
关键字:

法向量