我在做一个项目,一些飞行物体扫描地面,以知道它的确切位置。例如,让下面的网格为地面,字母按字面意思放在地面上。网格中的每个三角形都是唯一的。你知道吗
A---B---C---D
\ / \ / \ / \
E---A---H---G
/ \ / \ / \ / \
H---F---B---E---A
飞行物体可以访问包含这些字母的文件,这些字母之间用空格隔开。零表示空节点。你知道吗
A B C D 0
E A H G 0
H F B E A
这个飞行物体拍下了地面的照片,但因为它离地面很近,所以只能看到地面的一部分。你知道吗
A---H---G
\ / \ /
B---E
飞机使用OpenCV扫描这个模式,它识别数字。它还可以在每个扫描的数字上放置一个坐标。例如,A
放在拍摄照片的坐标(100200)上,H
放在坐标(301201)上,B
放在坐标(195403)上等等。你知道吗
给定字母及其(近似)坐标(在图片上),以及图片中心的坐标,飞机如何准确地找到它在网格上的位置。如果能产生以下输出,这将是最佳的:
很抱歉,如果这是一个非常广泛的问题,我只是不知道如何解决它。我试着用subgraph isomorphism problem来表示这个问题,但是这个问题的解决方案是NP完全的。网格最多可以有200个字母。你知道吗
我目前正在用python工作,但对这个问题的任何解决方案(或想法)都表示感谢。你知道吗
编辑:问题的一部分可能有点模糊。在找到飞机飞行的顶点/边/三角形之后,我需要在给定的网格文件中找到这个顶点/边/三角形。这就是为什么我尝试子图同构问题。所以如果飞机发现它在上面盘旋:
非常感谢!你知道吗
一个问题是你把它复杂化了。子图同构比你要做的要困难得多。你知道吗
假设您能够分析图像并确定每个字母的近似坐标(在图像上)。您应该能够获取字母的点集,每个点都唯一地映射到一个字母,并进行线性搜索,以找到离图像中心最近的三个点。你知道吗
下一步是三角形查找。首先,由于网格中的每个三角形都是唯一的,您可以简单地循环遍历网格中的所有三角形,对它们进行标准化(通过规范化),然后将它们添加到字典中以提供快速查找,这一点很重要。因此,构建查找字典的代码如下所示:
下一步是确定返回的是顶点、边还是三角形。一个简单的,但相当主观的方法,相当有用,例如,如果你想偏向算法返回一个边,而不是一个顶点或三角形。你知道吗
一个更平衡,更精确的方法需要一些额外的数学。下图大致显示了如何进行。为了避免在返回顶点(a)、返回边(AB)或返回三角形(ABC)以及数学的区域之间产生混淆。顶点A标记为5,顶点B标记为6,顶点C标记为7。注意,这里的半径是L/3,其中L是边的长度。图像假设最接近中心的点是A,然后是B,然后是C。因此,点永远不会位于顶点5和8的直线右侧,因为它打破了点更接近A和B而不是C的假设
评估方法如下:
代码如下所示。代码中有一些神奇的数学函数,但用于它们的算法应该不难在网上查找。你知道吗
注:上述算法的运行时间为O(N),其中N是点集中的点数。但是,必须为每个图像运行它。因此,如果需要检查大量图像,最好尽量限制字母的数量。不过,从图像中提取字母可能需要更多的时间。虽然,由于算法只需要最接近的三个字母,它应该是最好的
相关问题 更多 >
编程相关推荐