溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python如何合并重疊矩形框

發(fā)布時(shí)間:2022-03-17 15:04:54 來源:億速云 閱讀:470 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Python如何合并重疊矩形框,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

需求:

  • NMS中的IOU相關(guān),是選擇一個(gè)最大或者可信度最高的框框保留。

  • 而我們現(xiàn)在試需要將重疊框框合并為一個(gè)大的框框,所以不能直接用上面的。

  • 并且OpenCVgroupRectangles在Python中我實(shí)在用不懂,而且它會(huì)把不重疊的框直接刪了。。

原理:

  • 循環(huán)+遞歸,依次判斷兩個(gè)框是否有重疊。

效果:

Python如何合并重疊矩形框

參考代碼:

import cv2
import numpy as np


def checkOverlap(boxa, boxb):
    x1, y1, w1, h2 = boxa
    x2, y2, w2, h3 = boxb
    if (x1 > x2 + w2):
        return 0
    if (y1 > y2 + h3):
        return 0
    if (x1 + w1 < x2):
        return 0
    if (y1 + h2 < y2):
        return 0
    colInt = abs(min(x1 + w1, x2 + w2) - max(x1, x2))
    rowInt = abs(min(y1 + h2, y2 + h3) - max(y1, y2))
    overlap_area = colInt * rowInt
    area1 = w1 * h2
    area2 = w2 * h3
    return overlap_area / (area1 + area2 - overlap_area)

def unionBox(a, b):
    x = min(a[0], b[0])
    y = min(a[1], b[1])
    w = max(a[0] + a[2], b[0] + b[2]) - x
    h = max(a[1] + a[3], b[1] + b[3]) - y
    return [x, y, w, h]

def intersectionBox(a, b):
    x = max(a[0], b[0])
    y = max(a[1], b[1])
    w = min(a[0] + a[2], b[0] + b[2]) - x
    h = min(a[1] + a[3], b[1] + b[3]) - y
    if w < 0 or h < 0:
        return ()
    return [x, y, w, h]

def rectMerge_sxf(rects: []):
    # rects => [[x1, y1, w1, h2], [x2, y2, w2, h3], ...]
    '''
    當(dāng)通過connectedComponentsWithStats找到rects坐標(biāo)時(shí),
    注意前2個(gè)坐標(biāo)是表示整個(gè)圖的,需要去除,不然就只有一個(gè)大框,
    在執(zhí)行此函數(shù)前,可執(zhí)行類似下面的操作。
    rectList = sorted(rectList)[2:]
    '''
    rectList = rects.copy()
    rectList.sort()
    new_array = []
    complete = 1
    # 要用while,不能forEach,因爲(wèi)rectList內(nèi)容會(huì)變
    i = 0
    while i < len(rectList):
        # 選後面的即可,前面的已經(jīng)判斷過了,不需要重復(fù)操作
        j = i + 1
        succees_once = 0
        while j < len(rectList):
            boxa = rectList[i]
            boxb = rectList[j]
            # 判斷是否有重疊,注意只針對(duì)水平+垂直情況,有角度旋轉(zhuǎn)的不行
            if checkOverlap(boxa, boxb):  # intersectionBox(boxa, boxb)
                complete = 0
                # 將合並後的矩陣加入候選區(qū)
                new_array.append(unionBox(boxa, boxb))
                succees_once = 1
                # 從原列表中刪除,因爲(wèi)這兩個(gè)已經(jīng)合並了,不刪除會(huì)導(dǎo)致重復(fù)計(jì)算
                rectList.remove(boxa)
                rectList.remove(boxb)
                break
            j += 1
        if succees_once:
            # 成功合並了一次,此時(shí)i不需要+1,因爲(wèi)上面進(jìn)行了remove(boxb)操作
            continue
        i += 1
    # 剩餘項(xiàng)是不重疊的,直接加進(jìn)來即可
    new_array.extend(rectList)

    # 0: 可能還有未合並的,遞歸調(diào)用;
    # 1: 本次沒有合並項(xiàng),說明全部是分開的,可以結(jié)束退出
    if complete == 0:
        complete, new_array = rectMerge_sxf(new_array)
    return complete, new_array


box = [[20, 20, 20, 20], [100, 100, 100, 100], [60, 60, 50, 50], [50, 50, 50, 50]]
_, res = rectMerge_sxf(box)
print(res)
print(box)

img = np.ones([256, 256, 3], np.uint8)
for x,y,w,h in box:
    img = cv2.rectangle(img, (x,y), (x+w,y+h), (0, 255, 0), 2)
cv2.imshow('origin', img)

img = np.ones([256, 256, 3], np.uint8)
for x,y,w,h in res:
    img = cv2.rectangle(img, (x,y), (x+w,y+h), (0, 0, 255), 2)
cv2.imshow('after', img)

cv2.waitKey(0)

看完了這篇文章,相信你對(duì)“Python如何合并重疊矩形框”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI