目录

1、点云概述

1.1 点云的表达形式

1.2 ​​​​​​​点云的特点

2、主成分分析在点云中的应用

2.1 PCA主成分分析

2.2 Kernel PCA(升维)

2.3 PCA计算法向量程序

3、点云滤波

3.1 点云去除

3.2 降采样

3.2.1 降采样流程

3.2.2 哈希函数

3.2.3 Farthest Point Sampling(FPS)

3.2.4 Normal Space Sampling(法向量降采样)

​编辑3.2.5 Learning to Sample

3.3 上采样

3.3.1 Bilateral Filter——Gaussian Filter

3.3.2 双边滤波

3.3.3 点云上采样

1、点云概述

1.1 点云的表达形式

1.2 ​​​​​​​点云的特点

1、密度不均匀

2、不规则

3、没有纹理信息(三人成车)

4、对深度学习的特点:

无序性

旋转不变性

2、主成分分析在点云中的应用

2.1 PCA主成分分析

  • 主成分分析在点云中的作用
  1. 降维
  2. 法向量估计
  3. 分类
  • 矩阵的运算:

  • PCA :

降维和升维肯定有数据损失,所以要选取重要的主向量

PCA是线性的

  • PCA应用

第一列是输入的图像,例如30*30就是900维的矩阵,把900维的矩阵在l个主向量上投影得到l组a,第二列是计算平均值所以都一样。可以看到由6个主向量来重构图片(最后一列)可以达到识别的效果。对每组a进行聚类,传入新的图片与a对比相似度来分类

2.2 Kernel PCA(升维)

  • 点云中点的法向量

点云拟合曲面的切面的法向量,只有定义邻域才有法向量,邻域大相对平滑受个别点的影响小,邻域大比较灵敏但容易受影响。法向量是最没用的向量,所有点投影到这个向量上的值加起来最小,反应最少的特征。

C是中心点

寻找法向量的步骤:

2.3 PCA计算法向量程序

# 实现PCA分析和法向量计算,并加载数据集中的文件进行验证import open3d as o3d
import os
import numpy as np
import pandas as pd
from pyntcloud import PyntCloud# 功能:计算PCA的函数
# 输入:
#     data:点云,NX3的矩阵
#     correlation:区分np的cov和corrcoef,不输入时默认为False
#     sort: 特征值排序,排序是为了其他功能方便使用,不输入时默认为True
# 输出:
#     eigenvalues:特征值
#     eigenvectors:特征向量
def PCA(data, correlation=False, sort=True):X = np.asarray(data).T #np.array与np.asarray功能是一样的,都是将输入转为矩阵格式,再转置X_mean = np.mean(X,axis=1).reshape(3,1) #axis=1是每一行的平均值,等于0是没一列的平均值X_head = X - X_meanH = X_head.dot(X_head.T) #点乘转置eigenvalues,eigenvectors = np.linalg.eig(H) #求矩阵的特征值和特征向量#排序if sort:sort = eigenvalues.argsort()[::-1] #.argsort返回数组从小到大排序后对应的索引值eigenvalues = eigenvalues[sort]eigenvectors = eigenvectors[:, sort]return eigenvalues, eigenvectors
#```handlebars
def main():# 加载txt格式原始点云points = pd.read_csv("/home/cxl/三维点云课程资源/1点云介绍及降采样/modelnet40_normal_resampled/modelnet40_normal_resampled/car/car_0001.txt") #将读入的数据按照numpyarray的方式存储points = points.iloc[:,0:3] #iloc遍历的数数字,0:3对应0,1,和2points.columns = ["x","y","z"] #给选取到的数据 附上标题 point_cloud_pynt = PyntCloud(points) #PyntCloud python的点云处理库point_cloud_o3d = point_cloud_pynt.to_instance("open3d", mesh=False) #实例化o3d.visualization.draw_geometries([point_cloud_o3d]) # 显示原始点云# 从点云中获取点,只对点进行处理points = point_cloud_pynt.pointsprint('total points number is:', points.shape[0])# 用PCA分析点云主方向w, v = PCA(points)point_cloud_vector = v[:, 0] #点云主方向对应的向量print('the main orientation of this pointcloud is: ', point_cloud_vector)# 绘制三个主方向line_set = o3d.geometry.LineSet()line_set.points = o3d.utility.Vector3dVector([np.mean(points, axis=0), np.mean(points, axis=0) + v[:, 2], np.mean(points, axis=0) + v[:, 1], np.mean(points, axis=0) + v[:, 0]])line_set.lines = o3d.utility.Vector2iVector([[0, 1], [0, 2], [0, 3]])line_set.colors = o3d.utility.Vector3dVector([[0, 0, 1], [0, 1, 0], [1, 0, 0]])o3d.visualization.draw_geometries([point_cloud_o3d, line_set])# 循环计算每个点的法向量pcd_tree = o3d.geometry.KDTreeFlann(point_cloud_o3d) #建立KD树normals = []for point in point_cloud_o3d.points:[k, idx, _] = pcd_tree.search_knn_vector_3d(point, knn=50)#返回锚点的50个最近邻居的索引列表w,v = PCA(points.iloc[idx,:])#前面的冒号就是取行数,后面的冒号是取列数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)# 利用法向量滚球法重建表面radii = [0.005, 0.01, 0.02, 0.04]rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(point_cloud_o3d, o3d.utility.DoubleVector(radii))o3d.visualization.draw_geometries([point_cloud_o3d, rec_mesh])if __name__ == '__main__':main()

 

3、点云滤波

3.1 点云去除

划定邻域,少于一定的值就去掉。

3.2 降采样

3.2.1 降采样流程

两种选点方式:1. 一个格子中计算平均点   2. 一个格子中随机选一个点

算法步骤:第6步有四个点在0格中,三个点3格中。每个格子中可以计算平均点,也可以随机选一个点

代码小坑:1、如果小格子过多,对超过int32所表示数的范围。 2. 涉及排序不能用>=    <=

# 实现voxel滤波,并加载数据集中的文件进行验证
import sys
import open3d as o3d
import os
import numpy as np
import pandas as pd
from pyntcloud import PyntCloud# 功能:对点云进行voxel滤波
# 输入:
#     point_cloud:输入点云
#     leaf_size: voxel尺寸
def voxel_filter(point_cloud, leaf_size):filtered_points = []#三个维度最小/大值x_min, y_min, z_min = np.amin(point_cloud, axis=0)x_max, y_max, z_max = np.amax(point_cloud, axis=0)#确定每一个维度的格子数量Dx = (x_max - x_min)//leaf_size + 1    #保证0-leaf_size 在第一个格子内Dy = (y_max - y_min)//leaf_size + 1Dz = (z_max - z_min)//leaf_size + 1print("Dx x Dy x Dz is {} x {} x {}".format(Dx, Dy, Dz))dict = { }  #建立一个空的字典 放h对应点的数据index_ = { } #放h对应点的数量for i in range(len(point_cloud)):hx = (point_cloud[i, 0] - x_min)//leaf_size + 1hy = (point_cloud[i, 1] - y_min)//leaf_size + 1hz = (point_cloud[i, 2] - z_min)//leaf_size + 1h = hx + hy*Dx + hz*Dx*Dy# 如果h不相同把点放入,相同则计算平均if (h not in dict):dict[h] = point_cloud[i]index_[h] = 1else:val = dict.get(h, 0)  #先把字典中的数据取出来num = index_.get(h, 0)dict[h] = (val * num + point_cloud[i])/(num + 1) #来一次点就需要求相同h的所有点的平均index_[h] = num + 1for key,value in dict.items():#当两个参数时filtered_points.append(value)# 把点云格式改成array,并对外返回filtered_points = np.array(filtered_points, dtype=np.float64)return filtered_pointsdef main():# # 从ModelNet数据集文件夹中自动索引路径,加载点云# cat_index = 10 # 物体编号,范围是0-39,即对应数据集中40个物体# root_dir = '/Users/renqian/cloud_lesson/ModelNet40/ply_data_points' # 数据集路径# cat = os.listdir(root_dir)# filename = os.path.join(root_dir, cat[cat_index],'train', cat[cat_index]+'_0001.ply') # 默认使用第一个点云# point_cloud_pynt = PyntCloud.from_file(file_name)# 加载自己的点云文件#读取点云txt文件points = np.genfromtxt("/home/cxl/三维点云课程资源/1点云介绍及降采样/modelnet40_normal_resampled/modelnet40_normal_resampled/car/car_0001.txt", delimiter=",")points = pd.DataFrame(points[:, 0:3])points.columns = ['x', 'y', 'z']point_cloud_pynt = PyntCloud(points)# 转成open3d能识别的格式point_cloud_o3d = point_cloud_pynt.to_instance("open3d", mesh=False)# o3d.visualization.draw_geometries([point_cloud_o3d]) # 显示原始点云# 调用voxel滤波函数,实现滤波points = np.asarray(point_cloud_o3d.points)#转为矩阵格式filtered_cloud = voxel_filter(points, 0.1)point_cloud_o3d.points = o3d.utility.Vector3dVector(filtered_cloud)#将点云转换成open3d中的数据形式并用point_cloud_o3d来保存# 显示滤波后的点云o3d.visualization.draw_geometries([point_cloud_o3d])if __name__ == '__main__':main()

 

3.2.2 哈希函数

如果激光雷达线束过多,这样降采样速度会很慢,为了提升速度,这里用到哈希函数。因为哈希函数不需要排序。

但这样会出现冲突点,即两点在哈希表中一样,但并不是临近点。

3.2.3 Farthest Point Sampling(FPS)

核心思想:挑一个点距离最远的点

3.2.4 Normal Space Sampling(法向量降采样)

核心思想:保留特征突变的点,不会漏掉特征。适用于点云对齐

3.2.5 Learning to Sample

核心思想:传统方法通过几何关系找到降采样点,S-NET是根据语义关系,即经过降采样之后的点云输入网络还是能够得到同样的标签。

设定几何约束,来使降采样的点与原来的点云距离相似。

可以看到通过神经网络,1024个点降到8个点还能达到83.6的准确率,传统方法只有61.6

3.3 上采样

3.3.1 Bilateral Filter——Gaussian Filter

高斯模糊:将该像素值替换成一个范围内像素的均值,参数越大范围越大,越模糊。

3.3.2 双边滤波

为了保留边缘特征,加入了一个权重,该像素与周围像素值差距越大权重越小,差距越小权重越大。这样像素差距小的范围就会被模糊,差距大的会被保留。

3.3.3 点云上采样

激光点云是稀疏的,在传感器融合时,会造成很多像素没有深度信息,所以要对点云进行上采样。运用双边滤波来进行上采样。

三维点云课程(一)——点云基础介绍相关推荐

  1. 【阿里云课程】图神经网络基础:图的应用、表示与图卷积

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第9课中的一节,介绍如下: 图神经网络基础 本次课程是阿里天池联合有三AI推出的深度学习系列课程第9期,讲述图神经网络,图的 ...

  2. 【阿里云课程】生成模型之GAN原理与优化基础

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第11课中的一节,介绍如下: 生成对抗网络基础 本次课程是阿里天池联合有三AI推出的深度学习系列课程第11期,深度生成模型之 ...

  3. 【阿里云课程】深度生成模型基础,自编码器与变分自编码器

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第11课中两节,介绍如下: 第1节:生成模型基础 本次课程是阿里天池联合有三AI推出的深度学习系列课程第11期,深度生成模型 ...

  4. 【阿里云课程】如何基于GAN完成人脸图像超分辨任务

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为实践课中的一节,这也是本课程系列最后的一个实践课,介绍如下: GAN超分辨实践 本次课程是阿里天池联合有三AI推出的深度学习 ...

  5. 【阿里云课程】图像翻译GAN结构与应用

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第11课中的一节,介绍如下: 图像翻译GAN结构与应用 本次课程是阿里天池联合有三AI推出的深度学习系列课程第11期,深度生 ...

  6. 【阿里云课程】如何从零开始完成第一个GAN项目

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为实践课,介绍如下: 从零使用GAN进行图片生成 本次课程是阿里天池联合有三AI推出的深度学习系列课程实践课第2期,从零完成G ...

  7. 【阿里云课程】生成模型之GAN优化目标设计与改进

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第11课中的一节,介绍如下: GAN优化目标设计与改进 本次课程是阿里天池联合有三AI推出的深度学习系列课程第11期,深度生 ...

  8. 【阿里云课程】模型设计之动态网络,原理与设计

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第10课中的一节,介绍如下: 动态网络原理与设计 本次课程是阿里天池联合有三AI推出的深度学习系列课程第10期,深度学习模型 ...

  9. 【阿里云课程】注意力机制原理,应用与设计

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第10课中的一节,介绍如下: 注意力机制原理与设计 本次课程是阿里天池联合有三AI推出的深度学习系列课程第10期,深度学习模 ...

  10. 【阿里云课程】深度学习模型设计:卷积核的设计与优化

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第10课中的一节,介绍如下: 卷积核与卷积方式的设计 本次课程是阿里天池联合有三AI推出的深度学习系列课程第10期,深度学习 ...

最新文章

  1. 轻松两步,我在 SpringBoot 服务上实现了接口限流
  2. Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
  3. 参数匹配模型——Python学习之参数(二)
  4. 为什么整数在python中表示d_python 数据类型和变量
  5. js代码转python_Python和JavaScript间代码转换的4个工具
  6. html5 --- 使用canvas画一个渐变矩形
  7. war3必须安装的游戏组件_在单独的WAR组件中对SPA资源和API实现进行分区
  8. jQuery验证插件
  9. edoc2中标电子文件管理标准ERMS制定项目
  10. zynq平台交叉编译器的安装
  11. html立方体旋转展开,css3技术设计立方体旋转发光效果动图
  12. 【游戏开发实战】Unity调用谷歌Google免费翻译API(https接口),年轻人不讲武德,用多个国家语言怎么讲
  13. 数据库建模逆向工程工具
  14. 高新科技培育钻石,或掀时尚界新热潮
  15. oracle打cve补丁,Oracle多个产品高危漏洞补丁安全预警
  16. jquery点击按钮删除文本框的内容
  17. 5G+工业互联网行业解决方案
  18. 程序员小抄——GitHub 热点速览 Vol.44
  19. win7资源管理器经常崩溃shellext.dll_unloaded
  20. prophet模型预测时间序列

热门文章

  1. VMware 虚拟机Win10固定ip地址
  2. Redis与数据库数据同步解决方案
  3. lol走砍e源码_【精选】某LOL走砍E盾+VMP卡登陆解决办法
  4. Markdown基本语法介绍及cmd markdown下载
  5. 邪少微信自定义分享卡片链接的解决方案(可自定义分享标题 自定义分享链接 分享描述 分享缩略图)
  6. 支持傲腾技术的服务器主板,G4560可以用傲腾内存么
  7. C++模拟鼠标键盘操作(转)
  8. 极点五笔状态栏菜单不显示,如何再让它显示?
  9. 常见存储的串口连接管理方法
  10. 库卡机器人示教器截屏_库卡机器人示教器