点云在任意平面上获取二维投影

简介: 点云在任意平面上获取二维投影

1. 基础知识


这里的立体几何基础理论详细见参考资料

image.png


2. 手动推导


这个问题其实可以简化为,点P在任意平面上的投影坐标,推导过程如下所示:


181433a3cb65b16fb7fc5de6858663d.png

总结:根据坐标(x0, y0, z0),即可求出参数t,随后便可求出在新平面上的投影坐标


3. 代码验证


参考代码:

"""
代码功能: 将3d点云投影到xyz等不同平面上
"""
import numpy as np
import mayavi.mlab as mlab
# 参数说明:
# - points:点云数据
# - flat:3d平面的参数,Ax+By+Cz+D=0,参数即为(A,B,C,D)
#         xy平面:(0 0 1 0) | xz平面:(0 1 0 0) | yz平面:(1 0 0 0)
def project_2d(points, flat):
    # 点云投影平面
    A, B, C, D = flat
    distance = A**2 + B**2 + C**2
    t = -(A*points[:, 0] + B*points[:, 1] + C*points[:, 2] + D)/distance
    x = A*t + points[:, 0]
    y = B*t + points[:, 1]
    z = C*t + points[:, 2]
    project_point = np.array([x, y, z]).T
    print(project_point.shape)
    # 投影展现
    mlab.figure(bgcolor=(0, 0, 0), size=(640, 640))
    mlab.points3d(x, y, z, y, mode='point', colormap='spectral')
    mlab.show()
if __name__ == '__main__':
    txt_path = r"E:\workspace\PointCloud\Pointnet2\data\modelnet40_normal_resampled\airplane\airplane_0001.txt"
    points = np.loadtxt(txt_path, delimiter=',')
    project_2d(points, (0, 0, 1, 0))


  • 1)在xy平面上的投影
project_2d(points, (0, 0, 1, 0))
mlab.points3d(x, y, z, y, mode='point', colormap='spectral')


结果展示:

image.png

  • 2)在xz平面上的投影
project_2d(points, (0, 1, 0, 0))
mlab.points3d(x, y, z, x, mode='point', colormap='spectral')


结果展示:

image.png


  • 3)在yz平面上投影
project_2d(points, (1, 0, 0, 0))
mlab.points3d(x, y, z, y, mode='point', colormap='spectral')


结果展示:

image.png

ps:这里的平面设置可以是任意平面,点云可以在任意平面上投影


参考资料:

1. python三维点云投影(一)

目录
相关文章
|
机器学习/深度学习 存储 编解码
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
14254 1
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
|
机器学习/深度学习 自然语言处理 数据可视化
UNet家族最强系列 | UNet、UNet++、TransUNet与SWin-UNet究竟哪个更强!!!
UNet家族最强系列 | UNet、UNet++、TransUNet与SWin-UNet究竟哪个更强!!!
3203 0
|
前端开发 rax Python
Open3d系列 | 2. Open3d实现点云数据增强
Open3d系列 | 2. Open3d实现点云数据增强
3739 1
Open3d系列 | 2. Open3d实现点云数据增强
|
存储 数据采集 数据可视化
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
17088 1
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
|
9月前
|
算法
一次推理,实现六大3D点云分割任务!华科发布大一统算法UniSeg3D,性能新SOTA
华中科技大学研究团队提出了一种名为UniSeg3D的创新算法,该算法通过一次推理即可完成六大3D点云分割任务(全景、语义、实例、交互式、指代和开放词汇分割),并基于Transformer架构实现任务间知识共享与互惠。实验表明,UniSeg3D在多个基准数据集上超越现有SOTA方法,为3D场景理解提供了全新统一框架。然而,模型较大可能限制实际部署。
724 15
|
11月前
|
机器学习/深度学习 分布式计算 并行计算
《构建高效K近邻算法:降低计算复杂度的策略与实践》
K近邻(KNN)算法在机器学习中广泛应用,但面临计算复杂度高的问题。为提高效率,可通过以下方法优化: 1. **数据预处理**:降维(如PCA、LDA)和标准化,减少维度和尺度差异。 2. **优化距离度量**:选择合适的距离函数或自适应调整,提升相似性判断。 3. **加速搜索**:使用KD树、球树、LSH等数据结构,减少搜索范围。 4. **近似最近邻**:随机投影、基于聚类的近似算法,降低计算成本。 5. **并行与分布式处理**:利用多核、GPU或分布式框架加速计算。 6. **融合其他算法**:结合神经网络或聚类算法,先提取特征或聚类再应用KNN。
416 13
|
编译器 C++
错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译
错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译
1403 0
|
10月前
YOLOv11改进策略【Head/分割头】| 结合CVPR-2024 中的DynamicConv 动态卷积 改进分割头, 优化模型(独家改进)
YOLOv11改进策略【Head/分割头】| 结合CVPR-2024 中的DynamicConv 动态卷积 改进分割头, 优化模型(独家改进)
781 8
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
671 0
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
21712 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)