我在openCV做一个项目。然而,这种语言不是一个问题。
我说有一系列矩形。我有一个坐标为x和y的点数组。 我的问题是除了使用蛮力技术,并检查我所拥有的每个矩形的点是否有更好,更优雅的解决方案。
我在这个链接上看到了一个类似的问题,但不明白解决方案:
Check if an array of points is inside an array of rectangles?
背景资料(适用于了解图像处理的人士)
请看一下这个问题:Detecting Markers in a video Sequence 我之所以在更好的时间内要求上述原因,是因为这个原因。我想到的算法是围绕每个标记创建一个矩形,并在下一帧中搜索矩形内的标记。如果它位于一个矩形内,那么很可能它是从前一帧移动的相同标记,然后重新对齐矩形以适应新的标记位置,依此类推。有这么多帧,这个问题很可能使处理速度变慢。 谢谢和欢呼。
答案 0 :(得分:2)
改善天真方法的常用方法是使用Spatial Indexing。有几个data structures专门研究这个问题。我敢打赌,OpenCV已经为您提供了一些这样的数据结构。
如何在空间上索引场景的一个简单示例是将场景分解为网格,然后对于每个矩形,确定矩形包含或与之交叉的网格单元格。然后你确定你的点在哪个单元格,瞧,你现在可以在一个矩形列表上进行昂贵的命中测试,这个矩形希望小于天真的方法。
该算法称为空间散列,用于加速2D游戏中的碰撞检测。请注意,当所有矩形都在每个单元格中,或者当所有矩形和您的点都在同一个单元格中时,会出现此算法的最坏情况。这是一些关于它如何适用于你的粗略伪代码。我会阅读空间散列,但whole articles将描述最佳方法。
rects = array of rectangles
grid = divide scene into n x m grid
for each cell in grid do
cell.m_rects = determine_which_rects_intersect(cell, rects)
end
...
pt = some point in scene
pt_cell = grid.get_cell_for_pt(pt)
hits = empty array
for each rect in pt_cell.m_rects do
if expensive_hit_test(pt, rect) then
hits.append(rect)
end
end
return hits
答案 1 :(得分:2)
这是一个如何检查矩形内的点
的解释https://math.stackexchange.com/questions/190111/how-to-check-if-a-point-is-inside-a-rectangle
答案 2 :(得分:1)
这个问题分为两类。
哪一个对您更重要?如果它是游戏,那么时间复杂性对你来说更重要。您希望确保此算法的响应时间不仅快,而且确定性。快速很容易理解,所以我不解释它。确定性,意味着每次你运行这个算法它会在确定的时间内返回,否则你的游戏会变慢并且随着时间的推移会变得更糟。内存构建要避免。这意味着在运行此算法时无法分配/解除分配内存。
如果空间复杂性是您的问题,那么您必须按时妥协并且确定性'主义。
算法的 only 解决方案基于一个假设。矩形不随时间变化。在这种情况下,您可以为分辨率上的“每个点”创建一个布尔数组,并在背景算法(bruteforce)中确定矩形内是否有任何点。这样你的算法就是O(1)。快速和确定性。
如果你的矩形随着时间的推移而变化,那么你需要一个后台程序来预先知道矩形,然后在用你的点进行搜索之前对其进行处理。
这不是解决方案,只是提示您的问题。我希望这会有所帮助。
答案 3 :(得分:0)
步骤1:根据x和y轴对点进行排序(因此您有两个排序列表)
步骤2:对于每个矩形,在这些列表上进行二分查找并计算候选集。
步骤3:选择较小的候选集并验证另一个轴是否也包含这些点中的每一个。
此解决方案的最坏情况非常糟糕(O(mn)),但对于大多数实际情况,这应该可以正常工作。