3D Vision--将点云投影至平面

写在前面

1、内容:
如何将空间点投影至一个给定平面
2、环境:
open3d
2、转载请注明出处:
https://blog.csdn.net/qq_41102371/article/details/121482108

几何原理

空间点云投影到一个平面的问题,实际上就是一个点到平面的投影点问题
平面的一般方程为
A x + B y + C z + D = 0 Ax+By+Cz+D=0 Ax+By+Cz+D=0
其法向量为
n ⃗ = ( A , B , C ) \vec{n}=(A,B,C) n =(A,B,C)
现已知平面 α : ( A , B , C , D ) \alpha:(A,B,C,D) α:(A,B,C,D)以及平面外的一点 P 0   ( x 0 , y 0 , z 0 ) P_0\ (x_0,y_0,z_0) P0 (x0,y0,z0),求 P 0 P_0 P0到平面的投影点坐标
在这里插入图片描述
(图片来自同济高数第七版下册P29)
P 0 P_0 P0作垂线 N P 0 NP_0 NP0垂直于平面 α \alpha α N ( x , y , z ) N(x,y,z) N(x,y,z)即为 P 0 P_0 P0 α \alpha α上的投影点, P 1 P_1 P1是平面上的任意一点。
∵ N P 0 → ⊥ α \because \overrightarrow{NP_0} \perp \alpha NP0 α
∴ N P 0 → ∥ n ⃗ \therefore \overrightarrow{NP_0} \parallel \vec{n} NP0 n
根据直线的点向式方程:
x 0 − x A = y 0 − y B = z 0 − z C = t \frac{x_0-x}{A}=\frac{y_0-y}{B}=\frac{z_0-z}{C}=t Ax0x=By0y=Cz0z=t
则可以得到直线 N P 0 NP_0 NP0的参数方程:
{ x = x 0 − A t y = y 0 − B t z = z 0 − C t \begin{cases} x=x_0-At\\ y=y_0-Bt\\ z=z_0-Ct \end{cases} x=x0Aty=y0Btz=z0Ct
因为点 N ( x , y , z ) N(x,y,z) N(x,y,z)在平面 α \alpha α上,因此:
A x + B y + C z + D = 0 Ax+By+Cz+D=0 Ax+By+Cz+D=0
A ( x 0 − A t ) + B ( y 0 − B t ) + C ( z 0 − C t ) + D = 0 A(x_0-At)+B(y_0-Bt)+C(z_0-Ct)+D=0 A(x0At)+B(y0Bt)+C(z0Ct)+D=0
∴ \therefore t = A x 0 + B y 0 + C z 0 + D A 2 + B 2 + C 2 t=\frac{Ax_0+By_0+Cz_0+D}{A^2+B^2+C^2} t=A2+B2+C2Ax0+By0+Cz0+D
将t带入 N P 0 NP_0 NP0的参数方程:
x = x 0 − A A x 0 + B y 0 + C z 0 + D A 2 + B 2 + C 2 y = y 0 − B A x 0 + B y 0 + C z 0 + D A 2 + B 2 + C 2 z = z 0 − C A x 0 + B y 0 + C z 0 + D A 2 + B 2 + C 2 \begin{aligned} x & =& x_0-A\frac{Ax_0+By_0+Cz_0+D}{A^2+B^2+C^2}\\\\ y & =& y_0-B\frac{Ax_0+By_0+Cz_0+D}{A^2+B^2+C^2}\\\\ z & = & z_0-C\frac{Ax_0+By_0+Cz_0+D}{A^2+B^2+C^2} \end{aligned} xyz===x0AA2+B2+C2Ax0+By0+Cz0+Dy0BA2+B2+C2Ax0+By0+Cz0+Dz0CA2+B2+C2Ax0+By0+Cz0+D

右侧完全已知,因此,只要知道任意空间点 P 0 P_0 P0的坐标以及给定平面 α \alpha α,就能计算出 P 0 P_0 P0 α \alpha α上的投影点坐标 N ( x , y , z ) N(x,y,z) N(x,y,z)

python代码

def project_points2plane(src_npy, tgt_plane_coefficients):
    """
    Args:
        src_npy: numpy form of a point cloud
        tgt_plane_coefficients: a given plane to project

    Returns:
        numpy form of points that projected to the given plane: n x 3

	# @Author  : Carlos_Lee
	# @Blog    :https://blog.csdn.net/qq_41102371/article/details/121482108
	# References:
	# https://www.cnblogs.com/nobodyzhou/p/6145030.html
	# https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_plane
    """
    project_plane = copy.deepcopy(src_npy)
    a, b, c, d = tgt_plane_coefficients
    x_i = project_plane[:, 0]
    y_i = project_plane[:, 1]
    z_i = project_plane[:, 2]

    t = (a * x_i + b * y_i + c * z_i) / (a * a + b * b + c * c)
    project_plane[:, 0] = x_i - a * t
    project_plane[:, 1] = y_i - b * t
    project_plane[:, 2] = z_i - c * t
    '''
    if we project a group of points to a plane, 
    some points will be projected to a same point on the plane, resulting in duplicate points,
    we need to remove them
    '''
    # to remove the repeat points
    project_plane = np.unique(project_plane, axis=0)
    return project_plane

完整测试代码在GitHub:
https://github.com/Noel-Gallagher-Highflyingbirds/geometry

References

计算点在平面上的投影坐标: https://www.cnblogs.com/nobodyzhou/p/6145030.html
https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_plane
高等数学(第七版)(下册).高等教育出版社
https://zhuanlan.zhihu.com/p/267722955

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺有缸的高飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值