计算点云中每个点的法线
Computing normals at each point in a point-cloud?
我有一系列的点形成一个点云。我需要计算每个点的法向量然后从这个点向法向量的方向投射一条射线。在这种情况下,我需要用什么公式来计算法向量呢?
编辑*我有一系列的点(x, y, z)形成了一个点云(称为a),它形成了一个半球体的形状。我还有另一个点云(叫它B),我在它上面放了一个表面,形成了另一个半球体,它可以放在a里面。我想测量这些表面彼此之间的距离,所以我的计划是从a中的每个点投射一束射线到表面B,然后测量与该点的交点。我希望这个解释能使我的问题更清楚。
谢谢你的帮助!
您是否有一个网格,以便您知道一个点连接到哪些其他局部点?
在这种情况下,该点的法线是在该点相遇的每对线之间的叉积的平均值(即归一化为1的单位向量)。
我用Python开发了一个代码,它将计算点云每个点的法线。你可以把它改编成c++。
-基本上你从你的点附近的k个点计算单值分解。
它将为您提供有关方差在何处较大和较小的信息。
-然后取方差较小的方向(与最小特征值相关的特征向量)。这个特征向量是通过你的k点(包括你的点P)的平面的法线。最后,对点云的每个点重复这个。
-
能否建立两个网格之间的对应关系?也就是说,对于网格A中的每一个点,由于平移/缩放/旋转,在网格B中有一个对应的点在不同的位置。如果是这样,那么您可以使用Procustes Analysis来查找两个云之间的最佳平移/缩放/旋转转换矩阵。在OP提供的示例中,缩放矩阵可以显示两个网格之间的距离。
-
如果两个网格是任意的,那么我能想到的最好的算法是首先将两个点云放在同一个oct-tree中。从这里开始,你可以遍历网格A中的每个点,并找到网格b中最近的点。"两个网格之间的最小距离"是迭代后两个点之间的最小距离。
2的替代方法是简单的暴力迭代所有的点:
double min=BIG_NUMBER;
for(Point a : meshA)
for(Point b : meshB)
if(dist(a,b)<min) min=dist(a,b);
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- 如何计算多映射中重复对的数量