人脸检测 - 过滤重叠窗口

时间:2016-02-09 12:56:38

标签: algorithm pseudocode overlap face-detection

我正在编写人脸检测算法,现在我检测到很多窗口重叠 如果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)解决方案有点慢) 或者还有另一种方法可以改进我的算法以完美地工作?

2 个答案:

答案 0 :(得分:0)

你的算法仍然没有。

考虑这样一种情况,即您考虑的前三个矩形的位置如下图所示:

enter image description here

请注意,矩形的三个中心位于其他矩形之外,因此前三个矩形不重叠。

现在想象出第四个非常大的矩形。它的中心位于蓝色矩形中,其值非常大。然后正确的做法是删除所有最初的三个矩形,但你不会。

至于快速解决问题的方法:

  • 首先根据它们的值(降序)对所有矩形进行排序,这样如果它与已经放置的矩形重叠,你永远不会想要放置一个矩形(注意:这里我指望所有值都是不同的,但如果不是这样的话) ,那么你必须详细说明最佳解决方案是什么。)
  • 现在您的任务转换为:&#34;您按顺序迭代所有矩形并感兴趣,如果新中心恰好位于任何放置的矩形内,或者矩形本身覆盖任何中心&#34;
  • 这转变为两个问题:
    • 甲。是否有任何一组点在新给定的矩形内
    • B中。新点是否在任何给定的非交叉矩形集内。

问题如果您将已选择的中心保留在两个点列表中(每个中心都存储在两个列表中),则可以优化 。其中一个列表按照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