Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 比较三维结构_Algorithm_Math_Hash_3d_Geometry - Fatal编程技术网

Algorithm 比较三维结构

Algorithm 比较三维结构,algorithm,math,hash,3d,geometry,Algorithm,Math,Hash,3d,Geometry,我需要通过查找和比较适当的几何散列来评估两组3d点是否相同(忽略平移和旋转)。我做了一些关于几何散列技术的论文研究,我发现了一些算法,但是这些算法往往会因“视觉需求”(如2d到3d、遮挡、阴影等)而变得复杂 此外,如果这两种几何体略有不同,那么散列也不会有很大的不同 有谁知道一些适合我需要的算法,并能提供一些链接供进一步研究 谢谢对我来说似乎是一个数值优化问题。您希望找到变换的参数,该参数将一组点变换为尽可能接近另一组点。定义一些残差或“能量”,当这些点重合时,将其最小化,并将其丢弃在一些最小二

我需要通过查找和比较适当的几何散列来评估两组3d点是否相同(忽略平移和旋转)。我做了一些关于几何散列技术的论文研究,我发现了一些算法,但是这些算法往往会因“视觉需求”(如2d到3d、遮挡、阴影等)而变得复杂

此外,如果这两种几何体略有不同,那么散列也不会有很大的不同

有谁知道一些适合我需要的算法,并能提供一些链接供进一步研究


谢谢

对我来说似乎是一个数值优化问题。您希望找到变换的参数,该参数将一组点变换为尽可能接近另一组点。定义一些残差或“能量”,当这些点重合时,将其最小化,并将其丢弃在一些最小二乘优化程序或类似程序上。如果它成功地将分数优化为零(或在给定浮点错误的情况下尽可能接近预期值),则分数相同

谷歌搜索

least squares rotation translation
找到了很多基于这种技术的论文(例如)


更新以下评论:如果分数之间的一对一对应关系未知(如上述论文所假设的),那么您只需确保最小化分数与分数顺序无关。例如,如果您将这些点视为小质量(有限半径球体,以避免零距离爆炸),并通过优化平移和旋转参数来最小化系统的总重力能量,这应该是可行的。

有一系列SIGGRAPH出版物,可能会对您有所帮助

e、 g.Brown和Rusinkiewicz的“三维扫描的全局非刚性对齐”:

可以让您开始的常规搜索:


是一种方法。

您的第一个想法可能是试图找到将一个对象映射到另一个对象的旋转,但这是一个非常复杂的主题。。。事实上,这是没有必要的!你不是在问如何最好地匹配两者,你只是在问它们是否相同

通过列出所有插入点距离来确定模型的特征。按该距离对列表进行排序。现在比较每个对象的列表。它们应该相同,因为插入点距离不受平移或旋转的影响

三个问题:

1) 如果点数很大,那是一个很大的对列表(N*(N-1)/2)。在这种情况下,您可以选择只保留最长的顶点,或者更好地为每个顶点保留1或2个最长的顶点,以便模型的每个部分都有一些贡献。然而,删除这样的信息会使问题变得概率性而非确定性

2) 这仅使用顶点定义形状,而不使用边。这可能很好(实际上也很好),但如果您希望图形具有相同的顶点但不同的连接边。如果是,首先测试顶点相似性。如果通过,则使用排序后的距离为每个顶点指定唯一的标签。最长边有两个顶点。对于每个顶点,查找具有最长(剩余)边的顶点。标记第一个顶点0和下一个顶点1。按顺序对其他顶点重复此操作,您将获得与平移和旋转无关的指定标记。现在,您可以精确地比较边拓扑(检查对象1中两个顶点之间的每条边,在对象2中相同的两个顶点之间是否有对应的边)注意:如果您有多个相同的插入点距离,那么这将变得非常复杂,因此需要进行分段比较,以使分配稳定且唯一

3) 有可能两个图形具有相同的边长度总体,但它们不完全相同。。当一个对象是另一个对象的镜像时,这是正确的。这是相当恼人的检测!一种方法是使用四个非共面点(可能是上一步标记为0到3的点)并比较它们定义的坐标系的“利手性”。如果用手习惯不匹配,则对象为镜像

注意:距离列表使您可以轻松拒绝不相同的对象。它还允许您通过允许订单中出现一定数量的错误来添加“模糊”接受。也许将两个列表之间的均方根差作为“相似性度量”会很有效

编辑:看起来您的问题是没有边的点云。那么边对应(2)这一恼人的问题甚至不适用,可以忽略!不过,你还是要小心镜像问题

  • 如果要估计刚性 在两个相似的 点云可以使用 公认的 迭代最近点法。这个方法从一个粗略的开始 对变换和变换的估计 然后迭代优化 变换,通过计算最近距离 邻域与极小化 关联成本函数。可能是 有效实施(甚至 实时)并且有可用的 可用于 Matlab,C++…这种方法已被广泛采用 扩展并具有多个变体, 包括估算非刚性 如果你感兴趣的话 在扩展中,您应该查看 计算机图形学论文解答 扫描注册问题,在哪里 你的问题是关键的一步。对于 起点见 这有几个好的外部条件 链接。只是一张来自设计用于匹配点云的背景图片:
    (来源:)

    调整后,你可以进入决赛 误差测量值表示的相似程度如何 两点云是,但这是 这是一个非常临时的解决方案 应该是更好的

  • 使用形状描述符可以 计算形状的指纹 通常是不变的 平移/旋转。在大多数情况下,它们是