Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
Python 确定中心点和路径的快速方法_Python_Algorithm_Opencv - Fatal编程技术网

Python 确定中心点和路径的快速方法

Python 确定中心点和路径的快速方法,python,algorithm,opencv,Python,Algorithm,Opencv,我有下面的灰色图像。我可以使用np.transpose(np.nonzero(tmpData))找到点的位置。我最初的想法是计算所有点的欧几里德距离,以检查重复出现的点。根据这个想法,找出哪个路径与这个中心点相关 然而,这种方法相当缓慢。我需要2个循环来计算欧几里德距离。1个用于查找中心点的循环。和1个用于确认其方向的回路 有没有更快的方法找到中心点和路径 点位置: [ 74 374] [ 20 440] [149 325] [269 52] [242 149] [252 254] [209

我有下面的灰色图像。我可以使用
np.transpose(np.nonzero(tmpData))
找到点的位置。我最初的想法是计算所有点的欧几里德距离,以检查重复出现的点。根据这个想法,找出哪个路径与这个中心点相关

然而,这种方法相当缓慢。我需要2个循环来计算欧几里德距离。1个用于查找中心点的循环。和1个用于确认其方向的回路

有没有更快的方法找到中心点和路径

点位置:

[ 74 374]
[ 20 440]
[149 325]
[269  52]
[242 149]
[252 254]
[209 329]
[349 256]
[449 252]
[549 245]
[649 241]
[732 258]
[780 316]

我能想到的一件事是使用。我曾经用它从点云重建三维实体。由于您的示例是二维的,它将重复拾取2个随机点,并检查有多少点在可以从这2个点构造的线的某个阈值内。该算法理想情况下会找到3条线,近似于您所说的“路径”。这些线的交点将很好地指示您应该在哪里寻找中心点

编辑:要获得三条线,可以从数据集中删除点。因此,首先它会找到最佳拟合,然后删除该拟合阈值内的点。在这之后,它会寻找下一个最合适的,等等。您可以使用while循环来实现这一点,条件是剩余的点数。要通过您的示例更清楚地说明这一点,请执行以下操作:

这是您找到的第一行:

现在,从拟合直线的集中删除点,然后继续,这是第二条直线:

从第二行中删除点,然后将最后一行拟合到左侧的点:

没有留下合适的点,因此这意味着您的交叉口应该位于这3个交叉点附近:

你可以考虑把你的数据放在一个树形结构中,以寻找这3个交点的共同最接近的邻居。 使用RANSAC,您可能会得到比您想要的更少或更多的线路,或者线路不正确。这一切都取决于参数(您可以通过反复试验来优化这些参数)和数据


注意:上面的例子只是我用matplotlib做的一个演示,我没有使用RANSAC算法,但结果会有些相同。

您是否将中心点定义为“在某个距离内有最多点的点”或“在每个点的某个距离内查看时最常出现的点”?很难说你的意思是什么(有可能两者是等效的,但我还不确定)我的定义是点连接2个或更多不同的路径。在上图中,您可以看到存在3条不同的路径。它们都与中心点(红色圆圈内)相关。我同意我可以看到不同的路径,但不清楚计算机是如何知道的。例如,可以从任意点到中心绘制一条线;您的程序如何知道,比如说,底部路径上的任何点都应该沿着路径走?我不确定它是否适用于您的任何用例,但是如果您可以缩小通常看起来如此好的图片范围,那么欧几里德最小生成树应该给出您正在寻找的确切树,并且最大节点(大多数边)将是中心。IIRC MST是线性的,
O(n)
。您能提供更多的示例图像吗?请同时显示您的代码。Ransac的可靠使用!你能提供更多的信息吗?我知道RANSAC可以找到一条适合所有点的最佳线路。但如何获得3条不同的线路?运行算法三次?