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

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

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三维点云投影(一)

目录
相关文章
二维坐标系空间变换(详细解读,附MATLAB代码)
二维坐标系空间变换(详细解读,附MATLAB代码)
609 0
二维坐标系空间变换(详细解读,附MATLAB代码)
|
2月前
|
算法 图形学
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
98 2
|
2月前
|
图形学 计算机视觉
GEE错误——如何将原有矢量将维度转化为地理坐标系,重投影坐标坐标无法实现?
GEE错误——如何将原有矢量将维度转化为地理坐标系,重投影坐标坐标无法实现?
44 0
|
定位技术
ArcGIS:如何对栅格图像进行地理配准和定义投影?
ArcGIS:如何对栅格图像进行地理配准和定义投影?
1173 0
|
7月前
|
数据采集 数据管理 大数据
真正用起来,二维比三维更重要
今天这篇文章起这个标题似乎有点逆潮流,但是这确实是开发的表达,同时也是我这两天和开发交流之后最直接的感受,当然这个开发的群体是有一定的限定的,就是时空大数据的开发团队主管,但是这些经验对于建设其他数字孪生类的应有也有着很好的借鉴和参考意义。(本人工作于交通行业,现在本人单位也在建设数字孪生相关内容,有感而发故此想谈谈感受)
二维平面的欧几里得距离
二维平面的欧几里得距离
|
前端开发 图形学
二维空间下的向量旋转
向量运算是计算机图形学的数学基础,而向量的旋转是向量的一种常见操作,本文将详细讲解向量在二维空间下的旋转原理。
709 0
二维空间下的向量旋转
|
算法
【平面解析几何】直线方程的表示形式
【平面解析几何】直线方程的表示形式
192 0
基础|什么是张量、数据立体、矩阵、向量和纯数
来源:云栖社区 作者:码府 张量就是一个变化量。 张量有零阶、一阶、二阶、三阶、四阶等等。 零阶张量是纯量(数值) 一阶张量是向量(数值和方向的组合) 二阶张量是矩阵(向量的组合) 三阶张量是数据立体(矩阵的组合) 四阶张量(数据立体的组合) 等等。
1631 0

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19