2016-06-16 2 views
0

После исследования я наткнулся на несколько вопросов, подобных этому: OpenCV groupRectangles - getting grouped and ungrouped rectangles (большинство из них находятся на C++). Однако ни одна из них не является твердой. Я хочу объединить перекрывающиеся прямоугольники в один. ImageОбъединить перекрывающиеся прямоугольники (python)

Мой прогресс:

for cnt in large_contours: 
    x,y,w,h = cv2.boundingRect(cnt) 
    mec=x,y,w,h 
    rectVec=cv2.rectangle(img_and_contours,(x,y),(x+w,y+h),(0,255,0),2) 
    #cv2.rectangle(img_and_contours, cv2.boundingRect(large_contours[cnt]),(0,255,0)); 
    rectList, weights = cv2.groupRectangles(mec, 3,0.2) 

Я только отправил часть моего code.I надеялся groupRectangle бы делать то, что я хотел, но ничего не сделал, и вместо этого дает мне ошибку

rectList,weights = cv2.groupRectangles(mec,3,0.2) TypeError: rectList Blockquote

ответ

0

Существует алгоритм, называемый **Non max suppression**. Функция принимает массив прямоугольников в качестве входных данных и выводит максимальный прямоугольник. Вот код:

def non_max_suppression_fast(boxes, overlapThresh): 
    # if there are no boxes, return an empty list 
    if len(boxes) == 0: 
     return [] 

    # if the bounding boxes integers, convert them to floats -- 
    # this is important since we'll be doing a bunch of divisions 
    if boxes.dtype.kind == "i": 
     boxes = boxes.astype("float") 
# 
    # initialize the list of picked indexes 
    pick = [] 

    # grab the coordinates of the bounding boxes 
    x1 = boxes[:,0] 
    y1 = boxes[:,1] 
    x2 = boxes[:,2] 
    y2 = boxes[:,3] 

    # compute the area of the bounding boxes and sort the bounding 
    # boxes by the bottom-right y-coordinate of the bounding box 
    area = (x2 - x1 + 1) * (y2 - y1 + 1) 
    idxs = np.argsort(y2) 

    # keep looping while some indexes still remain in the indexes 
    # list 
    while len(idxs) > 0: 
     # grab the last index in the indexes list and add the 
     # index value to the list of picked indexes 
     last = len(idxs) - 1 
     i = idxs[last] 
     pick.append(i) 

     # find the largest (x, y) coordinates for the start of 
     # the bounding box and the smallest (x, y) coordinates 
     # for the end of the bounding box 
     xx1 = np.maximum(x1[i], x1[idxs[:last]]) 
     yy1 = np.maximum(y1[i], y1[idxs[:last]]) 
     xx2 = np.minimum(x2[i], x2[idxs[:last]]) 
     yy2 = np.minimum(y2[i], y2[idxs[:last]]) 

     # compute the width and height of the bounding box 
     w = np.maximum(0, xx2 - xx1 + 1) 
     h = np.maximum(0, yy2 - yy1 + 1) 

     # compute the ratio of overlap 
     overlap = (w * h)/area[idxs[:last]] 

     # delete all indexes from the index list that have 
     idxs = np.delete(idxs, np.concatenate(([last], 
     np.where(overlap > overlapThresh)[0]))) 

    # return only the bounding boxes that were picked using the 
    # integer data type 
    return boxes[pick].astype("int") 

Надеюсь, он может вам помочь.

+0

благодарит за комментарии. Предположим, у меня есть массив [[351, 544, 9, 5], [514, 540, 8, 6], [467, 539, 8, 7], [409, 538, 13, 11], [201 , 538, 17, 8], [64, 538, 15, 11], [314, 537, 23, 10], [398, 534, 3, 9] .... 256 координат], как бы я позвонил функция non_max_suppression_fast? – skyrocket

+0

@skyrocket Преобразуйте его в список – VICTOR

+0

Im получение TypeError: non_max_suppression_fast() принимает 2 позиционных аргумента, но 3 дано –

Смежные вопросы