網站首頁 編程語言 正文
需求:
- NMS中的IOU相關,是選擇一個最大或者可信度最高的框框保留。
- 而我們現在試需要將重疊框框合并為一個大的框框,所以不能直接用上面的。
- 并且
OpenCV
的groupRectangles
在Python中我實在用不懂,而且它會把不重疊的框直接刪了。。
原理:
- 循環+遞歸,依次判斷兩個框是否有重疊。
效果:
參考代碼:
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], ...] ? ? ''' ? ? 當通過connectedComponentsWithStats找到rects坐標時, ? ? 注意前2個坐標是表示整個圖的,需要去除,不然就只有一個大框, ? ? 在執行此函數前,可執行類似下面的操作。 ? ? rectList = sorted(rectList)[2:] ? ? ''' ? ? rectList = rects.copy() ? ? rectList.sort() ? ? new_array = [] ? ? complete = 1 ? ? # 要用while,不能forEach,因爲rectList內容會變 ? ? i = 0 ? ? while i < len(rectList): ? ? ? ? # 選後面的即可,前面的已經判斷過了,不需要重復操作 ? ? ? ? j = i + 1 ? ? ? ? succees_once = 0 ? ? ? ? while j < len(rectList): ? ? ? ? ? ? boxa = rectList[i] ? ? ? ? ? ? boxb = rectList[j] ? ? ? ? ? ? # 判斷是否有重疊,注意只針對水平+垂直情況,有角度旋轉的不行 ? ? ? ? ? ? if checkOverlap(boxa, boxb): ?# intersectionBox(boxa, boxb) ? ? ? ? ? ? ? ? complete = 0 ? ? ? ? ? ? ? ? # 將合並後的矩陣加入候選區 ? ? ? ? ? ? ? ? new_array.append(unionBox(boxa, boxb)) ? ? ? ? ? ? ? ? succees_once = 1 ? ? ? ? ? ? ? ? # 從原列表中刪除,因爲這兩個已經合並了,不刪除會導致重復計算 ? ? ? ? ? ? ? ? rectList.remove(boxa) ? ? ? ? ? ? ? ? rectList.remove(boxb) ? ? ? ? ? ? ? ? break ? ? ? ? ? ? j += 1 ? ? ? ? if succees_once: ? ? ? ? ? ? # 成功合並了一次,此時i不需要+1,因爲上面進行了remove(boxb)操作 ? ? ? ? ? ? continue ? ? ? ? i += 1 ? ? # 剩餘項是不重疊的,直接加進來即可 ? ? new_array.extend(rectList) ? ? # 0: 可能還有未合並的,遞歸調用; ? ? # 1: 本次沒有合並項,說明全部是分開的,可以結束退出 ? ? 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)
原文鏈接:http://xfxuezhang.cn/index.php/archives/231/
相關推薦
- 2022-04-30 C語言實現職工工資管理系統_C 語言
- 2022-04-27 C語言陷阱與缺陷之數組越界訪問詳解_C 語言
- 2022-06-25 JetBrains公司三大編輯器迭代循環模板快捷鍵詳解_相關技巧
- 2022-04-17 Python?同級目錄(兄弟目錄)調用方式_python
- 2022-11-02 Python封裝解構以及丟棄變量_python
- 2024-02-01 前端訪問一個地址 地址上帶/api, 如何通過nginx 配置, 讓訪問后臺的時候是/而不是/api
- 2023-08-15 解決:Unexpected ‘debugger‘ statement.eslint(no-debug
- 2022-11-14 Python?查看數據類型與格式_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支