python三维点云投影(一)

一、立体几何基础知识

1.1 平面表示

        三维平面的统一表示方法:Ax+By+Cz+D=0 (1)

1.2 法向量

        假设(x1, y1, z1)、(x2,y2,z2)为平面上两个点,那么可以得到:

        A(x2-x1) + B(y2-y1)+C(z2-z1)=0 (2)

        (x2-x1, y2-y1, z2-z1)是平面上的一个向量,并且根据上式可知,(A, B, C)与这个向量垂直,显然(A, B, C)为平面的法向量。

1.3 过定点且与平面垂直的直线方程

        假设(x0, y0, z0)为空间中的任意一点,它在平面上的投影坐标为(x, y, z),那么由这两个点组成的向量也是平面的法向量,则应与法向量(A, B, C)平行,从而可以得到:

        \frac{x-x0}{A}=\frac{y-y0}{B}=\frac{z-z0}{C}=t(3)

        即(直线方程的参数表达形式):

        x=At+x0;y=Bt+y0;z=Ct+z0(4)

1.4 直线与平面交点

        将上述结果带入平面方程公式(1)中可以得到:

        t =-\frac{Ax0+By0+Cz0+D}{A^{2}+B^{2}+C^{2}}(5)

        将公式(5)带回到公式(4)即可得到投影后坐标。

二、python代码

        代码以在xy投影为例,并提供矩阵计算形式。

# -*- coding: utf-8 -*-
"""
Created on Mon Apr 11 22:25:48 2022

@author: suiyingy
"""

import numpy as np

#定义平面方程Ax+By+Cz+D=0
#以z=0平面为例,即在xy平面上的投影A=0, B=0, C=1(任意值), D=0
#para[0, 0, 1, 0]
def point_project(points, para):
    x = points[:, 0]  # x position of point
    y = points[:, 1]  # y position of point
    z = points[:, 2]  # z position of point
    d = para[0]**2 + para[1]**2 + para[2]**2
    t = -(para[0]*x  + para[1]*y + para[2]*z + para[3])/d
    x = para[0]*t + x
    y = para[1]*t + y
    z = para[2]*t + z
    return np.array([x, y, z]).T

#矩阵写法
#定义平面方程Ax+By+Cz+D=0
#以z=0平面为例,即在xy平面上的投影A=0, B=0, C=1(任意值), D=0
#para[0, 0, 1, 0]
def point_project_array(points, para):
    para  = np.array(para)
    d = para[0]**2 + para[1]**2 + para[2]**2
    t = -(np.matmul(points[:, :3], para[:3].T) + para[3])/d
    points = np.matmul(t[:, np.newaxis], para[np.newaxis, :3]) + points[:, :3]
    return points
    
    
if  __name__ == '__main__':
    #定义平面方程Ax+By+Cz+D=0
    #以z=0平面为例,即在xy平面上的投影A=0, B=0, C=1(任意值), D=0
    project_pane = [0, 0, 1, 0]
    
    p0  = np.random.randint(1, 3, (2, 3))
    print('p0: \n', p0)
    
    p1 = point_project(p0, project_pane)
    print('p1: \n', p1)
    
    p2 = point_project_array(p0, project_pane)
    print('p2: \n', p2)

python三维点云投影(二)_Coding的叶子的博客-CSDN博客python点云投影样例。https://blog.csdn.net/suiyingy/article/details/124136567python三维点云研究计划_Coding的叶子的博客-CSDN博客_python 三维点云将按照以下目录持续进行更新……点云格式介绍、点云可视化、点云投影、生成鸟瞰图、生成前视图、点云配准、点云分割、三维目标检测、点云重建、深度学习点云算法……https://blog.csdn.net/suiyingy/article/details/124017716

 更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。

你可能感兴趣的:(python,三维点云,点云,三维算法,点云投影,python,点云计算)