2016-06-16 31 views
0

調査した後、私はOpenCV groupRectangles - getting grouped and ungrouped rectangles(ほとんどがC++である)のようないくつかの質問に出くわしました。しかし、どれも堅実ではありません。重なり合う矩形を一つにまとめたい Imageオーバーラップする矩形を組み合わせる(Python)

私の進捗状況:私は唯一の代わりgroupRectangleは私が望んでいたが、何もしなかった何を望んとされた私のcode.Iの作品を掲載

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) 

は私にエラーを与える

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

私はTypeErrorを取得しています:non_max_suppression_fast()は2つの位置引数をとりますが、3つは与えました –

関連する問題