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

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

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实现点云上采样、点云聚类、点云分割以及点云重建
13655 1
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
|
存储 数据采集 数据可视化
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
16512 1
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
|
存储 传感器 自动驾驶
几种常见的点云格式数据解析与在线预览
3D模型在线转换网站支持pcd、pts、xyz、las、laz、asc、ply等点云格式文件在线预览,同时支持将点云格式在线转换为ply、xyz等模型格式。
5808 1
|
前端开发 rax Python
Open3d系列 | 2. Open3d实现点云数据增强
Open3d系列 | 2. Open3d实现点云数据增强
3471 1
Open3d系列 | 2. Open3d实现点云数据增强
|
Shell
Ubuntu20.04安装anaconda并默认激活conda base环境(步骤详细/操作简单实用)
Ubuntu20.04安装anaconda并默认激活conda base环境方法
20121 0
|
编译器 C++
错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译
错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译
1025 0
|
12月前
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
18535 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
机器学习/深度学习 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源码为静态库,并提供了测试代码示例。
497 0
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
|
12月前
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
4030 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
12月前
|
机器学习/深度学习 人工智能 文字识别
ultralytics YOLO11 全新发布!(原理介绍+代码详见+结构框图)
本文详细介绍YOLO11,包括其全新特性、代码实现及结构框图,并提供如何使用NEU-DET数据集进行训练的指南。YOLO11在前代基础上引入了新功能和改进,如C3k2、C2PSA模块和更轻量级的分类检测头,显著提升了模型的性能和灵活性。文中还对比了YOLO11与YOLOv8的区别,并展示了训练过程和结果的可视化
17930 0