三维点云之PCA应用下

  • 在三维点云上的应用
    • 主成分方向
    • 降维
    • 求解点云的法向量
    • 拟合平面
    • AABB框
    • 点云匹配

在三维点云上的应用

PCA 是有损的数据压缩方式,它常用于对高维数据进行降维,也就是把高维数据投影到方差大的几个主方向上,方便数据分析。

让数据集在某个基上的投影值(也是在这个基上的坐标值)越分散,方差越大,这个基保留的信息也就越多
读取点云的代码:

  # 加载原始点云,txt处理point_cloud_raw = np.genfromtxt(r"plant_0001.txt", delimiter=",")  #为 xyz的 N*3矩阵point_cloud_raw = DataFrame(point_cloud_raw[:, 0:3])  # 选取每一列 的 第0个元素到第二个元素   [0,3)point_cloud_raw.columns = ['x', 'y', 'z']  # 给选取到的数据 附上标题point_cloud_pynt = PyntCloud(point_cloud_raw)  # 将points的数据 存到结构体中point_cloud_o3d = point_cloud_pynt.to_instance("open3d", mesh=False)  # 实例化o3d.visualization.draw_geometries([point_cloud_o3d]) # 显示原始点云# 从点云中获取点,只对点进行处理print(point_cloud_o3d)              #打印点数

主成分方向

# 功能:计算PCA的函数
# 输入:
#     data:点云,NX3的矩阵
#     correlation:区分np的cov和corrcoef,不输入时默认为False  这个没用到
#     sort: 特征值排序,排序是为了其他功能方便使用,不输入时默认为True
# 输出:
#     eigenvalues:特征值
#     eigenvectors:特征向量
def PCA(data, correlation=False, sort=True):average_data = np.mean(data,axis=0)       #求 NX3 向量的均值decentration_matrix = data - average_data   #去中心化H = np.dot(decentration_matrix.T,decentration_matrix)  #求解协方差矩阵 Heigenvectors,eigenvalues,eigenvectors_T = np.linalg.svd(H)    # SVD求解特征值、特征向量#covX = np.cov(decentration_matrix.T)   #计算协方差矩阵#featValue, featVec=  np.linalg.eig(covX)  #求解协方差矩阵的特征值和特征向量if sort:sort = eigenvalues.argsort()[::-1]      #降序排列eigenvalues = eigenvalues[sort]         #索引eigenvectors = eigenvectors[:, sort]# sort = featValue.argsort()[::-1]      #降序排列# featValue = featValue[sort]         #索引# featVec = featVec[:, sort]return eigenvalues, eigenvectors
 # 用PCA分析点云主方向w, v = PCA(point_cloud_raw)        # w为特征值 v为主方向point_cloud_vector1 = v[:, 0]   #点云主方向对应的向量,第一主成分point_cloud_vector2 = v[:, 1]  # 点云主方向对应的向量,第二主成分point_cloud_vector = v[:,0:2]  # 点云主方向与次方向print('the main orientation of this pointcloud is: ', point_cloud_vector1)print('the main orientation of this pointcloud is: ', point_cloud_vector2)#在原点云中画图point = [[0,0,0],point_cloud_vector1,point_cloud_vector2]  #画点:原点、第一主成分、第二主成分lines = [[0,1],[0,2]]      #画出三点之间两两连线colors = [[1,0,0],[0,0,0]]#构造open3d中的LineSet对象,用于主成分显示line_set = o3d.geometry.LineSet(points=o3d.utility.Vector3dVector(point),lines=o3d.utility.Vector2iVector(lines))line_set.colors = o3d.utility.Vector3dVector(colors)o3d.visualization.draw_geometries([point_cloud_o3d,line_set]) # 显示原始点云和PCA后的连线
  • correlation:区分np的cov和corrcoef,不输入时默认为False
    这个参数是没有用的,尝试过使用corrcoef,结果如下所示,是不对的。分析原因是因为corrcoef计算的是相关系数表示的是单纯反应两个变量每单位变化时的相似程度,会丢失(尺度)信息?所以这个不能来进行计算特征向量,特征值的分解。
    (corrcoef相关系数是用以反映变量之间相关关系密切程度的统计指标。相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差,它消除了两个变量变化幅度的影响。简单来说,而只是单纯反应两个变量每单位变化时的相似程度。)

  • 上面代码中,svd和cov的区别:
    H = np.dot(decentration_matrix.T,decentration_matrix)没有除以样本个数直接计算的是XXTXX^TXXT而covX = np.cov(decentration_matrix.T)计算的是标准的协方差矩阵1m∗XXT\frac{1}{m}*XX^Tm1​∗XXT

以下是三个图的主成分的图示:

SVD主成分分析

COV协方差主成分分析
correlation协方差主成分分析

降维

取需要前K个需要降维的特征向量组成降维矩阵;将数据与降维矩阵进行相乘,可让数据降维。

    #将原数据进行降维度处理point_cloud_encode = (np.dot(point_cloud_vector.T,point_cloud_raw.T)).T   #主成分的转置 dot 原数据Point_Show(point_cloud_encode)#使用主方向进行升维point_cloud_decode = (np.dot(point_cloud_vector,point_cloud_encode.T)).TPoint_Cloud_Show(point_cloud_decode)point_cloud_raw1=np.asarray(point_cloud_raw)Point_Cloud_Show(point_cloud_raw1)pcd_raw = o3d.geometry.PointCloud()pcd_raw.points = o3d.utility.Vector3dVector(point_cloud_raw1)pcd_decode = o3d.geometry.PointCloud()pcd_decode.points = o3d.utility.Vector3dVector(point_cloud_decode)view_cloud(pcd_raw, pcd_decode)

降维后的图片,但是X、Y轴是没有意义的
升维后的点云图
原先点云图

在Open3d中的原先点云图和升维点云图显示:

可以很明显的看出升维后点云缺失了一个厚度的信息,如同薄薄的一张纸片一样,所以这也印证了PCA降维是有损压缩方式

求解点云的法向量

 # 循环计算每个点的法向量pcd_tree = o3d.geometry.KDTreeFlann(point_cloud_o3d)           #将原始点云数据输入到KD,进行近邻取点normals = []    #储存曲面的法向量print(point_cloud_raw.shape[0])      #打印当前点数for i in range(point_cloud_raw.shape[0]):# search_knn_vector_3d函数 , 输入值[每一点,x]      返回值 [int, open3d.utility.IntVector, open3d.utility.DoubleVector][_,idx,_] = pcd_tree.search_knn_vector_3d(point_cloud_o3d.points[i],10)      #取10个临近点进行曲线拟合# asarray和array 一样 但是array会copy出一个副本,asarray不会,节省内存k_nearest_point = np.asarray(point_cloud_o3d.points)[idx, :]  # 找出每一点的10个临近点,类似于拟合成曲面,然后进行PCA找到特征向量最小的值,作为法向量w, v = PCA(k_nearest_point)normals.append(v[:, 2])#三维点云的第三个特征向量即为其法向量;因为第三个特征向量是最无关的,即为垂直于该平面的法向量# 屏蔽结束normals = np.array(normals, dtype=np.float64)# TODO: 此处把法向量存放在了normals中point_cloud_o3d.normals = o3d.utility.Vector3dVector(normals)o3d.visualization.draw_geometries([point_cloud_o3d],point_show_normal=True)

结果:

拟合平面

AABB框

点云匹配

三维点云:PCA(下)open3d相关推荐

  1. Open3D 三维点云读取可视化、下采样、去除离群点、地面提取

    Open3D:3D数据处理的现代库,是一个开放源代码库,支持快速开发处理3D数据的软件.Open3D在C ++和Python中公开了一组精心选择的数据结构和算法.后端经过高度优化,并支持并行化. 推荐 ...

  2. 三维点云学习(1)上-PCA主成分分析 法向量估计

    三维点云学习(1)上 环境安装 1.系统环境 win10 或者 ubuntu 2. Anaconda3+python3.6 使用Anaconda创建的conda虚拟环境进行python的编写 环境安装 ...

  3. 基于三维点云数据的主成分分析方法(PCA)的python实现

    主成分分析(PCA)获取三维点云的坐标轴方向和点云法向量 # 实现PCA分析和法向量计算,并加载数据集中的文件进行验证import open3d as o3d # import os import n ...

  4. 三维点云学习(1)下-点云体素降采样

    三维点云学习(1)下 点云体素降采样(Voxel Filter Downsampling) 代码参考网址秦乐乐CSDN博客 理论参考知乎博主:WALL-E 1.方法 Centroid 均值采样 Ran ...

  5. 三维点云分割综述(下)

    本文转载自公众号@点云PCL,三维点云分割综述(下) :https://mp.weixin.qq.com/s/wjxQwD96kh7zlQ316AhRJQ 这是一篇综述性论文,以下只做概述性介绍,介绍 ...

  6. 三维点云学习(2)下-Octree

    三维点云学习(2)下-Octree Octree(八叉树)的基本结构 思想:立体空间的分割 二维平面的展示 Octree(八叉树)的构建 #extent:立方体中心点到面的距离 #Center of ...

  7. (一) 三维点云课程---PCA介绍

    三维点云课程-PCA介绍 三维点云课程---PCA介绍 三维点云课程---PCA介绍 1. 什么是PCA 2.知识铺垫 2.1 SVD分解(奇异值分解 ) 2.1 谱定理 2.2 Rayleigh商 ...

  8. 三维点云重建 — open3d python

    本文为博主原创文章,未经博主允许不得转载. 本文为专栏<python三维点云从基础到深度学习>系列文章,地址为"https://blog.csdn.net/suiyingy/ar ...

  9. 三维点云质心与三角化 — python open3d

    1 质心介绍 质心概念与重心的计算方式相同.如下所示:                                          (1) 即                           ...

最新文章

  1. UI设计培训之:5个小技巧快速学会PS抠图
  2. 在命令行导出MySQL数据到Excel
  3. CRLF line terminators导致shell脚本报错:command not found
  4. 用devc++表白_教你用C语言加图形库打造炫酷表白连连看
  5. java多态和泛型_Java面向对象(二) 接口、多态和泛型
  6. 【VS开发】【DSP开发】地址对齐
  7. 在c语言中数据类型高低,C语言的数据类型
  8. kafka和mqtt的区别和联系
  9. 欧姆龙cp1h指令讲解_欧姆龙PLC功能指令
  10. 各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
  11. 姿态估计1-02:FSA-Net(头部姿态估算)-源码训练测试-报错解决
  12. uni-app获取当前时间日期及之后7天和星期几
  13. 关于airdroid免root操作
  14. 一文读懂什么是物联网!
  15. 电脑不能开热点的一种可以尝试的解决方法
  16. java socket 长连接事例
  17. 【经典算法题-10】背包问题(Knapsack Problem)
  18. 计算机网络应用层之HTTP协议
  19. U盘格式为RAW格式,空间为0字节的解决办法
  20. Python 函数传参详解

热门文章

  1. 周鸿祎:走好创业之路第一步( 转)
  2. matlab 反复激活 许可证到期 解决方法
  3. 树莓派使用VGA显示器输出
  4. C#调用LabVIEW VI
  5. 谈谈大三下学期找实习的经历(宇视科技 亚信联创 网新恒天 虹软)
  6. deepstream源码
  7. 如何用计算机声卡,声卡是什么,教您怎么查看自己电脑的声卡
  8. W25Q128FV译文(二)
  9. Hive(数据仓库)数据压缩、数据存储格式
  10. Python中ctypes的使用整理