我正在编写人脸检测算法,现在我检测到很多窗口重叠
如果center(windowA) in windowB or center(windowB) in windowA
,我认为窗口重叠。
我的算法是:
resultList <- empty list
for each windowA detected
handled <- False
for each windowB in resultList
if windowA and windowB are overlapping
keep the window with bigger value
handled <- True
brick inner loop
if not handled
append windowA to resultList
但仍有一些重叠的窗口。所以,我把它扩展到:
resultList <- empty list
for each windowA detected
handled <- False
for each windowB in resultList
if windowA and windowB are overlapping
keep the window with bigger value
handled <- True
break inner loop
if not handled
append windowA to resultList
for each windowB in resultList, starting from after windowA
if windowA and windowB are overlapping
if windowA has bigger value
remove windowB
else
remove windowA and break
它好多了,但仍有一些重叠的窗口 有没有一种已知的算法可以快速而好地完成它? (平凡的O(n ^ 2)解决方案有点慢) 或者还有另一种方法可以改进我的算法以完美地工作?
答案 0 :(得分:0)
你的算法仍然没有。
考虑这样一种情况,即您考虑的前三个矩形的位置如下图所示:
请注意,矩形的三个中心位于其他矩形之外,因此前三个矩形不重叠。
现在想象出第四个非常大的矩形。它的中心位于蓝色矩形中,其值非常大。然后正确的做法是删除所有最初的三个矩形,但你不会。
至于快速解决问题的方法:
问题如果您将已选择的中心保留在两个点列表中(每个中心都存储在两个列表中),则可以优化 。其中一个列表按照X-cordinate排序,另一个列表按Y.你可以使用二进制搜索选择矩形的X坐标和矩形的Y坐标之间的Y坐标的中心。如果这两个集合有重叠 - 则矩形中包含一个中心(注意:我有所说的列表,实际上对于维护中心的树集实际上更合适。)
问题B: 再次在X和Y坐标上单独求解:您有兴趣知道哪些矩形的最小X和最大X之间的新点的X坐标(Y坐标相同)。在重叠的情况下 - 有一个包含新点的矩形。使用二进制索引树的自适应可以最佳地解决此任务。
请注意,我的解决方案比您提出的直接方法具有更差的算法复杂性,但我希望它们在所有现实测试案例中都会得到相当大的优化。
答案 1 :(得分:0)
我不知道问题是什么,但是使用这个新代码它也有效:
result_list = empty list
for each windowA detected
found_better = False
for each windowB in result_list
if windowA and windowB are overlap
if windowA is better
remove windowB from result_list
else (so, windowB is better)
found_better = True
break inner loop
if not found_better
append windowA to result_list