- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 3D 对象的表面上有一组随机采样点。我希望能够计算两个不同对象之间的相似度。为了做到这一点,我首先必须确保我要比较的两个对象的样本点确实具有相同的旋转和比例。我想我可以通过将主成分轴沿 x/y/z 轴定向并缩放以使最长的主成分确实具有单位长度来做到这一点。
我首先计算点集的质心,然后平移所有点,使原点成为新的质心。
我使用 CGAL linear_least_squares_fitting_3 函数进行主成分分析,它给出了通过点的最佳拟合平面。我通过计算两个基 vector 的叉积来计算这个平面的法线:
Plane plane;
linear_least_squares_fitting_3(points.begin(), points.end(),
plane, CGAL::Dimension_tag<0>());
auto dir1 = dir2vec(plane.base1().direction());
auto dir2 = dir2vec(plane.base2().direction());
auto normal = dir1 ^ dir2; // cross product
normal.normalize(); dir1.normalize(); dir2.normalize();
dir2vec
函数转换 CGAL::Direction_3
反对等效的osg::Vec3d
对象(我正在使用 OpenSceneGraph 图形引擎)。最后,我使用以下代码将所有内容旋转到单位轴:
Matrixd r1, r2, r3;
r1.makeRotate(normal, Vec3d(1,0,0));
r2.makeRotate(dir1 * r1, Vec3d(0,1,0));
r3.makeRotate(dir2 * r1 * r2, Vec3d(0,0,1));
auto rotate = [&](Vec3d const &p) {
return p * r1 * r2 * r3;
};
transform(osgPoints.begin(), osgPoints.end(), osgPoints.begin(), rotate);
在这里,osgPoints
是一个 vector<osg::Vec3d>
.出于测试目的,我将旋转点的质心平移回原始位置,因此两个点云不会重叠。
Vec3d center = point2vec(centroid);
auto tocentroid = [&](Vec3d const &v) {
return v + center;
};
transform(osgPoints.begin(), osgPoints.end(), osgPoints.begin(), tocentroid);
为了测试它,我使用了相同点集的两个拷贝,但是其中一个被转换(旋转和平移)。上面的代码应该撤消旋转,但是结果不是我所期望的:参见 this image .红线表示最佳拟合平面的基本 vector 及其法线。看起来是两次调用 linear_least_squares_fitting_3
的结果给出略有不同的答案,因为其中一个平面相对于另一个平面旋转了一点。
Here is another图像,其中两个对象的质心位于原点。现在可以清楚地看到法线和基本 vector 落在一起,但点没有。
有谁知道为什么会发生这种情况,我该如何预防?
最佳答案
将一个平面拟合到一组点会留下一个不受约束的自由度。该平面可以围绕其法线自由旋转并且拟合相等。我对 CGAL 一无所知,但我不会惊讶地发现他们在寻找拟合时只是找到了一个方便的平面(可能是距离原始空间轴最近的投影)。
如果您在点云上进行了真正的 PCA,我认为您不会遇到这个问题。或者,也许您可以沿着拟合算法发现的法线重新缩放(拉伸(stretch))您的数据,然后找到另一个拟合。如果您充分扩展数据,那么找到的第一个平面应该不如某些正交平面那么适合。
关于c++ - 使用主成分分析和 CGAL 进行点云对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5486508/
我有一些带有反应组件抽象的外部 UI,我想从试剂中重用它们,有没有什么方法可以通过从 clojurescript 传递数据来直接渲染预定义的 react 组件。我是 clojurescript 初学者
我刚刚构建了一个库(Material Components库)from source并将本地Maven存储库添加到了我的项目中。现在,我可以通过将Log调用添加到库的本地源中来成功地进行一些外行调试。
我正在尝试测试呈现 grommet 的组件菜单 组件。索环 Menu 组件将绝对定位的菜单呈现到文档的顶层,作为子级插入到 body 中。因此它呈现在包装器的范围之外。我可以使用 document.b
如何创建一个凹形的 SKPhysicsBody? 我的猜测是创建一个由多个凸体组成的复合节点。我可以用任何其他方式“粘贴”它们,从而在它们之间创建 SKPhysicsJointFixed 吗? 最佳答
我正在开发一个食谱应用程序来帮助我妻子培养她的蛋糕爱好。这个想法是创建一个食谱数据库来保存她所有的蛋糕食谱。 每个食谱都有多种成分。每种成分都会有测量值(克、毫升、茶匙等),然后是数量。 我了解如何创
我正在使用 sklearn's PCA用于对大量图像进行降维。安装 PCA 后,我想看看组件的外观。 可以通过查看 components_ 属性来做到这一点。没有意识到这是可用的,我做了其他事情: e
我是一名优秀的程序员,十分优秀!