- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试开发一个应用程序,它使用 ICP 算法来查找在特定区域中绘制的形状之间的相似性,但我不明白如何解释我在它结束时得到的距离。这是我使用的算法,仅从点列表开始:其中 w 是旋转角度,T=(Tx, Ty) 是平移 vector 。它们也被描述为:
其中:现在,我尝试绘制几个形状,但我异常(exception)的是,如果形状非常相似,结果将接近 0。相反,通过这些形状,我得到了 3515.334 的最终值:
有了这个,我得到了6615.08:
最后,有了这个(它们完全不同)我得到了454.54:
我是不是理解错了算法?这是实现:
private void icp (int z, ArrayList<Pair<Float,Float>> points) {
ArrayList<Pair<Float,Float>> copia = segments.get(z);
ArrayList<Pair<Float,Float>> copia2 = points;
double x_trattino = 0.0;
double y_trattino = 0.0;
double x_trattino_primo = 0.0;
double y_trattino_primo = 0.0;
for (int i=0; i<copia.size(); i++) {
x_trattino+=copia.get(i).first;
y_trattino+=copia.get(i).second;
}
x_trattino = x_trattino*((double)1/copia.size());
y_trattino = y_trattino*((double)1/copia.size());
for (int i=0; i<copia2.size(); i++) {
x_trattino_primo+=copia2.get(i).first;
y_trattino_primo+=copia2.get(i).second;
}
x_trattino_primo = x_trattino_primo*((double)1/copia2.size());
y_trattino_primo = y_trattino_primo*((double)1/copia2.size());
double Sxx = 0.0;
double Syy = 0.0;
double Sxy = 0.0;
double Syx = 0.0;
int min = 0;
if (copia.size()>copia2.size()) min = copia2.size(); else min = copia.size();
for (int i=0; i<min; i++) {
Sxx+=((copia.get(i).first-x_trattino)*(copia2.get(i).first-x_trattino_primo));
}
for (int i=0; i<min; i++) {
Syy+=((copia.get(i).second-y_trattino)*(copia2.get(i).second-y_trattino_primo));
}
for (int i=0; i<min; i++) {
Sxy+=((copia.get(i).first-x_trattino)*(copia2.get(i).second-y_trattino_primo));
}
for (int i=0; i<min; i++) {
Syx+=((copia.get(i).second-y_trattino)*(copia2.get(i).first-x_trattino_primo));
}
double rotation = Math.toDegrees(Math.atan((Sxy-Syx)/(Sxx+Syy)));
double Tx = x_trattino_primo - (x_trattino*Math.cos(rotation)-y_trattino*Math.sin(rotation));
double Ty = y_trattino_primo - (x_trattino*Math.sin(rotation)+y_trattino*Math.cos(rotation));
double eDist = 0.0;
for (int i=0; i<min; i++) {
eDist = (Math.pow(copia.get(i).first*Math.cos(rotation)-copia.get(i).second*Math.sin(rotation)+Tx-copia2.get(i).first, 2.0)+Math.pow(copia.get(i).first*Math.sin(rotation)+copia.get(i).second*Math.cos(rotation)+Ty-copia2.get(i).second, 2.0));
}
System.out.println("EDIST: "+eDist);
}
最佳答案
您假设某些“定义点”应该在两个不同的形状中匹配。这可能是代码中最大的问题之一。假设您有两条线,第一条分为两部分,而另一条则不是。像这样
.--------.---------.
.------------------.
你要比较的是形状
.--------.
.------------------.
这两个形状不会相似,因此不会给出很小的距离。这意味着您可以拥有两个看起来非常相似的形状,但您的算法不会检测到这一点。举一个更复杂的例子来说明您要匹配的内容是,如果您在两个形状中有几个像这样的点
p1--p2--p3----p4----------p5---p6
q1------q2----------------q3---q4
您要匹配的是 p1 到 q1、p2 到 q2、p3 到 q3 和 p4 到 q4。这显然不能令人满意。
选择一个形状作为源,另一个作为目标。对于每个源点,找到目标中最近的点。现在你有一对点,它们是你应该在公式中使用的匹配点 P 和 P'。请注意,源中的多个点可以与目标中的同一点配对。重复这个过程,直到误差距离没有足够的改善。
还有其他处理 ICP 的方法,并且可能会出现几个问题。需要指出的一个问题是,如果你在我给你的直线示例中使用上述方法,误差距离可能不会变小,因为中点不靠近另一个形状中的任何点。所以上面的建议并没有穷尽所有可以做的事情,但至少我已经给了你一个开始。
关于java - 如何解释迭代最近点 (ICP) 算法的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57513196/
我正在学习如何将 ICP 与 PCL 结合使用。因此,我编写了一个从给定文件夹中读取一系列 .pcd 文件的函数。 //Reads all PCD files in a folder. Specify
这是调用 registerModelToScene() 的最小示例, 包含在类 cv::ppf_match_3d::ICP 中OpenCV贡献模块表面匹配的: #include #include
我有两个要匹配的点云。但对齐后,我只得到输入云,而不是合并的两个点云。可能是什么问题? 我已经更新了我的代码,但它仍然根本不对齐 pcl::PCDReader reader; pcl::P
我正在尝试开发一个应用程序,它使用 ICP 算法来查找在特定区域中绘制的形状之间的相似性,但我不明白如何解释我在它结束时得到的距离。这是我使用的算法,仅从点列表开始:其中 w 是旋转角度,T=(Tx,
有人有 Iterative Closest Point (ICP) 的实现吗? R中二维(2D)的算法? 这是在 c# 中的尝试 Iterative Closest Point Implementat
我最近一直在寻找 ICP 算法在 python 中的实现,但没有结果。 根据维基百科文章http://en.wikipedia.org/wiki/Iterative_closest_point ,算法
我已经安装了点云库(PCL)package对于使用迭代最近点 (icp),我的问题是:这个包是否可以用于 2D 数据?我想对齐两个 TSNE 数据,它们是 2D。 Link of the icp me
我想开始在 Eclipse 中编写 JADE。为此,我添加了 Java Agent Development Framework - Eclipse and Maven integration 提供的以
一 概念介绍 Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式。 a 当关闭ICP时,index
我正在尝试使用点云库 (PCL) 中集成的迭代最近点 (ICP) 算法对齐 2 组点云。我收到一个错误报告,说找不到足够的对应点。我已经放宽了参数的条件:setEuclideanFitnessEpsi
看起来问题是由于CNI(印花棉布)引起的,但不确定ICP中的修复程序是什么(请参见下面的journalctl -u kubelet日志) ICP安装程序日志: FAILED! => {"attempt
我是一名优秀的程序员,十分优秀!