Python合并重疊矩形框
需求:
- NMS中的IOU相關(guān),是選擇一個(gè)最大或者可信度最高的框框保留。
- 而我們現(xiàn)在試需要將重疊框框合并為一個(gè)大的框框,所以不能直接用上面的。
- 并且
OpenCV
的groupRectangles
在Python中我實(shí)在用不懂,而且它會(huì)把不重疊的框直接刪了。。
原理:
- 循環(huán)+遞歸,依次判斷兩個(gè)框是否有重疊。
效果:
參考代碼:
import cv2 import numpy as np def checkOverlap(boxa, boxb): ? ? x1, y1, w1, h1 = boxa ? ? x2, y2, w2, h2 = boxb ? ? if (x1 > x2 + w2): ? ? ? ? return 0 ? ? if (y1 > y2 + h2): ? ? ? ? return 0 ? ? if (x1 + w1 < x2): ? ? ? ? return 0 ? ? if (y1 + h1 < y2): ? ? ? ? return 0 ? ? colInt = abs(min(x1 + w1, x2 + w2) - max(x1, x2)) ? ? rowInt = abs(min(y1 + h1, y2 + h2) - max(y1, y2)) ? ? overlap_area = colInt * rowInt ? ? area1 = w1 * h1 ? ? area2 = w2 * h2 ? ? 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, h1], [x2, y2, w2, h2], ...] ? ? ''' ? ? 當(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)
到此這篇關(guān)于Python合并重疊矩形框的文章就介紹到這了,更多相關(guān)Python合并矩形框內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于ResNeXt網(wǎng)絡(luò)的pytorch實(shí)現(xiàn)
今天小編就為大家分享一篇關(guān)于ResNeXt網(wǎng)絡(luò)的pytorch實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01教你怎么用PyCharm為同一服務(wù)器配置多個(gè)python解釋器
當(dāng)我們?cè)诜?wù)器上創(chuàng)建了多個(gè)虛擬環(huán)境時(shí),也可以在 PyCharm 中配置這些虛擬環(huán)境,方便不同的項(xiàng)目使用不同的環(huán)境,然而按照網(wǎng)上教程添加多個(gè)python解釋器后,PyCharm會(huì)自動(dòng)幫我們創(chuàng)建多個(gè)重復(fù)的服務(wù)器,本文主要給出該問題的解決方法,同時(shí)也對(duì)添加解釋器做一個(gè)詳細(xì)的講解2021-05-05Python3實(shí)現(xiàn)爬取指定百度貼吧頁面并保存頁面數(shù)據(jù)生成本地文檔的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)爬取指定百度貼吧頁面并保存頁面數(shù)據(jù)生成本地文檔的方法,涉及Python基于urllib模塊的頁面爬取與文件讀寫相關(guān)操作技巧,需要的朋友可以參考下2018-04-04Django關(guān)于admin的使用技巧和知識(shí)點(diǎn)
在本篇文章里小編給大家整理的是關(guān)于Django的admin簡(jiǎn)單使用的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以跟著學(xué)習(xí)下。2020-02-02解決Django transaction進(jìn)行事務(wù)管理踩過的坑
這篇文章主要介紹了解決Django transaction進(jìn)行事務(wù)管理踩過的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04Python在Console下顯示文本進(jìn)度條的方法
Python是一門與php有點(diǎn)像的編輯語言了,下文來給各位在利用Python實(shí)現(xiàn)進(jìn)度條了,對(duì)Python在Console下顯示文本進(jìn)度條的方法相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-02-02