3D Vision--将点云投影至平面
contents
- 写在前面
- 几何原理
- python代码
- References
- 完
写在前面
1、内容:
如何将空间点投影至一个给定平面
2、环境:
open3d
2、转载请注明出处:
https://blog.csdn.net/qq_41102371/article/details/121482108
几何原理
空间点云投影到一个平面的问题,实际上就是一个点到平面的投影点问题
平面的一般方程为
Ax+By+Cz+D=0Ax+By+Cz+D=0Ax+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)以及平面外的一点P0(x0,y0,z0)P_0\ (x_0,y_0,z_0)P0 (x0,y0,z0),求P0P_0P0到平面的投影点坐标
(图片来自同济高数第七版下册P29)
过P0P_0P0作垂线NP0NP_0NP0垂直于平面α\alphaα,N(x,y,z)N(x,y,z)N(x,y,z)即为P0P_0P0在α\alphaα上的投影点,P1P_1P1是平面上的任意一点。
∵NP0→⊥α\because \overrightarrow{NP_0} \perp \alpha∵NP0⊥α
∴NP0→∥n⃗\therefore \overrightarrow{NP_0} \parallel \vec{n}∴NP0∥n
根据直线的点向式方程:
x0−xA=y0−yB=z0−zC=t\frac{x_0-x}{A}=\frac{y_0-y}{B}=\frac{z_0-z}{C}=tAx0−x=By0−y=Cz0−z=t
则可以得到直线NP0NP_0NP0的参数方程:
{x=x0−Aty=y0−Btz=z0−Ct\begin{cases} x=x_0-At\\ y=y_0-Bt\\ z=z_0-Ct \end{cases} ⎩⎨⎧x=x0−Aty=y0−Btz=z0−Ct
因为点N(x,y,z)N(x,y,z)N(x,y,z)在平面α\alphaα上,因此:
Ax+By+Cz+D=0Ax+By+Cz+D=0Ax+By+Cz+D=0
A(x0−At)+B(y0−Bt)+C(z0−Ct)+D=0A(x_0-At)+B(y_0-Bt)+C(z_0-Ct)+D=0A(x0−At)+B(y0−Bt)+C(z0−Ct)+D=0
∴\therefore∴ t=Ax0+By0+Cz0+DA2+B2+C2t=\frac{Ax_0+By_0+Cz_0+D}{A^2+B^2+C^2}t=A2+B2+C2Ax0+By0+Cz0+D
将t带入NP0NP_0NP0的参数方程:
x=x0−AAx0+By0+Cz0+DA2+B2+C2y=y0−BAx0+By0+Cz0+DA2+B2+C2z=z0−CAx0+By0+Cz0+DA2+B2+C2\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===x0−AA2+B2+C2Ax0+By0+Cz0+Dy0−BA2+B2+C2Ax0+By0+Cz0+Dz0−CA2+B2+C2Ax0+By0+Cz0+D
右侧完全已知,因此,只要知道任意空间点P0P_0P0的坐标以及给定平面α\alphaα,就能计算出P0P_0P0在α\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 cloudtgt_plane_coefficients: a given plane to projectReturns: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_coefficientsx_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 * tproject_plane[:, 1] = y_i - b * tproject_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 pointsproject_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
完
3D Vision--将点云投影至平面相关推荐
- PCL:投影滤波(一)将点云投影至平面
文章目录 1 投影至坐标平面 2 投影至参数平面 1 投影至坐标平面 将点云投影至坐标平面,只需要把某一维度的坐标值设置成 常数 即可.比如将点云投影至XOY 平面,令Z=C(C为某一常数)即可. 代 ...
- 如何将一个向量投影到一个平面上_自动驾驶视觉融合相机校准与激光点云投影...
点云PCL免费知识星球,点云论文速读. 标题:自动驾驶视觉融合-相机校准与激光点云投影 作者:williamhyin 来源:https://zhuanlan.zhihu.com/p/136263753 ...
- 点云在任意平面上获取二维投影
如有错误,恳请指出. 点云是在一个三维空间中由一堆无序的点所组成,那么在三维中理所应该可以在任意的二维平面:Ax + By + Cz + D = 0 中进行投影,获得不同平面中的二维视图.下面讲给出基 ...
- android立体3D效果_3D全息投影和平面投影有什么区别_广州全息投影
随着时代的发展.科技的进步,3D全息投影已经融入到人们的日常生活当中,给人们带来全新的视觉体验,呈现亦真亦幻的虚拟影像世界,越来越多的行业肯定及选择全息投影技术.那么与传统的平面投影相比,3D全息投影 ...
- PCL滤波--参数化模型投影点云---三维点云投影到二维平面
PCL点云滤波模块,有一种方法叫做参数化模型投影点云滤波,意思就是创建一个参数化模型(可以是平面,球体,椎体等),然后将点云投影到上面,比如说如果投影到平面上,那么就实现了三维降到二维,滤掉了一个维度 ...
- 自动驾驶视觉融合-相机校准与激光点云投影
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:william 链接:https://zhuanlan.zhihu.com/p/13626375 ...
- 多相机坐标转换_自动驾驶视觉融合 | 相机校准与激光点云投影
点击上方"AI算法修炼营",选择"星标"公众号 精选作品,第一时间送达 作者:william链接:https://zhuanlan.zhihu.com/p/13 ...
- 视觉融合-相机校准与激光点云投影
Github: 添加链接描述 像平面坐标系到像素坐标系的转换 3D空间中的点在图像平面上的投影与我们在实际的数字图像中看到的并不直接对应, 实际的数字图像由数千个图片像素组成. 因此我们需要实现从图像 ...
- PCL:投影滤波(二)将点云投影至球面
文章目录 1 PCL投影滤波器实现点云向球面投影 2 点云投影至指定球面 2.1 投影原理 2.2 代码实现 2.3 结果验证 1 PCL投影滤波器实现点云向球面投影 PCL官方文档上指出,可以使用投 ...
最新文章
- java消息服务,JMS 和 ActiveMQ
- 跟着实例学习设计模式(7)-原型模式prototype(创建型)
- mime设置 压缩html,MIME设置功能
- MySQL(五) —— 子查询
- POJ 2395 Out of Hay
- 【Spring】HttpMessageConverter的作用及替换
- Linux运维人员共用root帐户权限审计
- centos后台登录ftp_安卓TikTok无限制版、手游扫码登录更新
- ajax注册判断怎么写,ajax之判断用户名是否被注册
- 【转】android fragment 博客 学习
- 艾科思移动BI系统与钉钉集成
- 同花顺程序交易接口type-c为什么没普及?
- 让电视走向高端化,创维能否继续领跑显示行业?
- 【网页特效】12 个炫酷背景特效库
- Android 炫酷动画APP,21 款炫酷动画开源框架,照亮你的APP
- Linux系统 gcc工作流程和gcc编译参数
- 2010破局,联想笔记本用AMD芯
- Java计算机毕业设计 物业管理系统
- 【MapGIS】常见问题处理(第八期)
- 运用Python的turtle库绘制等边三角形
热门文章
- Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on
- 英菲尼迪tlme是什么意思_[FACE TIME]第9期:英菲尼迪戴雷造梦者-搜狐汽车
- html 时间戳转换年月日,时间戳与日期的转换方法
- MLA Review之五:回归
- mssql for php 安装 适用于 mssql 2005
- 网站根据不同时间段php输出不同的问候语
- iphone和mac互传文件_DeskConnect,iOS 和 Mac 间的免费文件传输工具 | App+1
- ~操作符含义及用处举例(详细易懂)
- 美通社成为2021巴塞罗那世界移动通信大会MWC官方媒体和传播合作伙伴
- layabox游戏开发经验分享3