为什么我的代码没有删除内部矩形

时间:2014-05-16 17:31:07

标签: python algorithm opencv cython

请将此代码检查为@Arun R在how to find area of rectangle which is covering another rectangle中告诉的算法错误

我的输出是 enter image description here

为什么不删除其他

中的矩形
cdef class Ray:
    cdef public:
        Point2D p
        Point2D q
        list points

cdef class Boundbox:
    cdef public:
        Point2D minP
        Point2D maxP
        int componentID

        int getComponentID(self):
            return self.componentID
def __numeric_compare_by_x(self,Boundbox a,Boundbox b):
    cdef Point2D tempA,tempB
    tempA=a.minP
    tempB=b.minP
    return tempA.x-tempB.x

def __numeric_compare_by_y(self,Boundbox a,Boundbox b):
    cdef Point2D tempA,tempB
    tempA=a.minP
    tempB=b.minP
    return tempA.y-tempB.y

def isBoundbox_inside(self,b1,b2):
    if((b1.minP.x<=b2.minP.x and b1.minP.y<=b2.minP.y)and(b1.maxP.x>=b2.maxP.x and b1.maxP.y>=b2.maxP.y)):
        return True
    return False

def boundboxFilter(self,boundbox):

    cdef:
        int i
        int minx,miny,maxx,maxy
        list pointList=[]
        Boundbox p,b1,b2

    #for i in xrange(len(boundbox)):
    #    pointList.append(boundbox[i])

    pointList=boundbox
    pointList.sort(cmp=self.__numeric_compare_by_x)

    stack=[]
    stack.append(pointList[0])

    for p in pointList[1:]:
        top=len(stack)-1
        b1=stack[top]
        b2=p
        if(not(self.isBoundbox_inside(b1,b2))):
            stack.append(b2)

    pointList=stack
    pointList.sort(cmp=self.__numeric_compare_by_y)

    stack=[]
    stack.append(pointList[0])
    for p in pointList[1:]:
        top=len(stack)-1
        b1=stack[top]
        b2=p
        if(not(self.isBoundbox_inside(b1,b2))):
            stack.append(b2)

    return stack

1 个答案:

答案 0 :(得分:1)

问题在于你的过滤逻辑。

outsiders = []
for rect in pointList:
    if not any(is_inside(rect, box) for box in pointlist if box is not rect):
        outsiders.append(rect)

如果is_inside位于rect内,则box为真。您需要针对所有其他矩形检查每个矩形,如果它不在其中任何一个内,则保存它。你当然可以调整性能。

另一种需要较少比较的方法是考虑整个列表,并删除在其他列表中找到的矩形。但是你必须非常小心索引,并且在列表中间弹出的东西也很昂贵。