【OpenCV實現圖像:可視化目標檢測框】

文章目錄

    • 概要
    • 畫框函數
    • 代碼實現
    • 標簽美化
    • 角點美化
    • 透明效果
    • 小結

概要

目標檢測框的可視化在計算機視覺和機器學習領域中是一項重要的任務,有助于直觀地理解和評估目標檢測算法的性能。通過使用Python和相關的圖像處理庫,可以輕松實現目標檢測框的可視化。主要步驟包括讀取圖像數據、提取目標檢測框的坐標信息,然后利用可視化工具在圖像上繪制這些框。Matplotlib是一個常用的可視化庫,其pyplot模塊提供了方便的函數來繪制圖像和圖形。通過結合目標檢測算法的輸出和Matplotlib的功能,可以創建一個直觀且易于理解的圖像,展示圖像中目標的位置和邊界框。

常見的目標檢測框的輸出.
在這里插入圖片描述
左上為常用的不帶標簽的輸出框,右上為YOLO系列美化帶標簽后的矩形框,左下為四個角點美化后的矩形框,右下為帶標簽的角點美化矩形框.

畫框函數

在OpenCV中,通常使用cv2.rectangle函數來繪制矩形框,該函數的一般形式如下:

cv2.rectangle(image, start_point, end_point, color, thickness)

這里是函數的參數解釋:

image: 輸入圖像
start_point: 矩形框左上角點的坐標
end_point: 矩形框右下角點的坐標
color: 矩形框的顏色,默認使用BGR順序表示
thickness: 線的粗細,其中 -1 代表填充整個矩形

通過調用這個函數,可以在圖像上繪制矩形框,用于突顯目標或標記檢測結果。

代碼實現

用python來實現上述示例中的相應的畫框效果.

1)讀入圖像

首先我們來讀入一副彩色圖像,并畫框:

import cv2img_name = 'img_6.png'
img = cv2.imread(img_name)
box = [ 25, 43,200,180, "sdq"]
box_color = (255,0,255)
cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), color=box_color, thickness=2)
cv2.imshow('Image with Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

box = [ 20, 25,80,200, “sdq”]

在這里,box 是一個列表,包含了五個元素:

20:矩形框的左上角 x 坐標。
25:矩形框的左上角 y 坐標。
80:矩形框的右下角 x 坐標。
200:矩形框的右下角 y 坐標。
"sdq":一個標簽表示矩形框的標識或類別。

結果如下:
在這里插入圖片描述

標簽美化

接下來來給矩形框添加標簽,觀察上述畫圖函數,注意最后一個參數thickness,如果此值等于-1,那么將對矩形框執行填充效果。
標簽美化代碼


def draw_label_type(draw_img,bbox,label_color):label = str(bbox[-1])labelSize = cv2.getTextSize(label + '0', cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]if bbox[1] - labelSize[1] - 3 < 0:cv2.rectangle(draw_img,(bbox[0], bbox[1] + 2),(bbox[0] + labelSize[0], bbox[1] + labelSize[1] + 3),color=label_color,thickness=-1)                      )cv2.putText(draw_img, label,(bbox[0], bbox[1] + labelSize + 3),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0, 0, 0),thickness=1)else:cv2.rectangle(draw_img,(bbox[0], bbox[1] - labelSize[1] - 3),(bbox[0] + labelSize[0], bbox[1] - 3),color=label_color,thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] - 3),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0, 0, 0),thickness=1)

使用代碼:

import cv2def draw_label_type(draw_img, bbox, label_color):label = str(bbox[4])labelSize = cv2.getTextSize(label + '0', cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]if bbox[1] - labelSize[1] - 3 < 0:cv2.rectangle(draw_img,(bbox[0], bbox[1]),(bbox[0] + labelSize[0], bbox[1] + labelSize[1]),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] + labelSize[1]),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)else:cv2.rectangle(draw_img,(bbox[0], bbox[1] - labelSize[1] - 3),(bbox[0] + labelSize[0], bbox[1] - 3),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] - 3),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)img_name = 'img_6.png'
img = cv2.imread(img_name)
box = [25, 43, 200, 180, "sdq"]
box_color = (255, 0, 255)
cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), color=box_color, thickness=2)draw_label_type(img, box, label_color=(255, 255, 255))  # 添加標簽cv2.imshow('Image with Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述

角點美化

上述添加完標簽后,由于標簽框和目標矩形框顏色一致,邊界處不太容易區分,這里添加對角點美化的代碼。


def draw_box_corner(draw_img,bbox,length,corner_color):# Top Leftcv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0] + length, bbox[1]), corner_color, thickness=3)cv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0], bbox[1] + length), corner_color, thickness=3)# Top Rightcv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2] - length, bbox[1]), corner_color, thickness=3)cv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2], bbox[1] + length), corner_color, thickness=3)# Bottom Leftcv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0] + length, bbox[3]), corner_color, thickness=3)cv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0], bbox[3] - length), corner_color, thickness=3)# Bottom Rightcv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2] - length, bbox[3]), corner_color, thickness=3)cv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2], bbox[3] - length), corner_color, thickness=3)

相應的相應的參數含義如下:

draw_img: 輸入圖像
bbox: 目標檢測框 形式(x1,y1,x2,y2)
length: 直線長度
corner_color 直線顏色
完整融合代碼:

import cv2def draw_label_type(draw_img, bbox, label_color):label = str(bbox[4])labelSize = cv2.getTextSize(label + '0', cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]if bbox[1] - labelSize[1] - 3 < 0:cv2.rectangle(draw_img,(bbox[0], bbox[1]),(bbox[0] + labelSize[0], bbox[1] + labelSize[1]),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] + labelSize[1]),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)else:cv2.rectangle(draw_img,(bbox[0], bbox[1] - labelSize[1] - 3),(bbox[0] + labelSize[0], bbox[1] - 3),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] - 3),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)def draw_box_corner(draw_img, bbox, length, corner_color):# Top Leftcv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0] + length, bbox[1]), corner_color, thickness=3)cv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0], bbox[1] + length), corner_color, thickness=3)# Top Rightcv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2] - length, bbox[1]), corner_color, thickness=3)cv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2], bbox[1] + length), corner_color, thickness=3)# Bottom Leftcv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0] + length, bbox[3]), corner_color, thickness=3)cv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0], bbox[3] - length), corner_color, thickness=3)# Bottom Rightcv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2] - length, bbox[3]), corner_color, thickness=3)cv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2], bbox[3] - length), corner_color, thickness=3)img_name = 'img_6.png'
img = cv2.imread(img_name)
box = [25, 43, 200, 180, "sdq"]
box_color = (255, 0, 255)
cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), color=box_color, thickness=2)draw_label_type(img, box, label_color=(255, 255, 255))  # 添加標簽
draw_box_corner(img, box, length=10, corner_color=(0, 255, 0))  # 添加對角點cv2.imshow('Image with Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述

透明效果

通過cv2.rectangle 函數設置 thickness參數 ,可以得到填充后的圖像,進而利用opencv中的 cv2.add_weight 函數可以實現透明效果,自行嘗試。
利用add_weight 函數對上面兩副圖像進行加權. 如下:

alpha = 0.8
gamma = 0
out_img = cv2.addWeighted(img,alpha,draw_img,1-alpha,gamma)
完整代碼:

import cv2def draw_label_type(draw_img, bbox, label_color):label = str(bbox[4])labelSize = cv2.getTextSize(label + '0', cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]if bbox[1] - labelSize[1] - 3 < 0:cv2.rectangle(draw_img,(bbox[0], bbox[1]),(bbox[0] + labelSize[0], bbox[1] + labelSize[1]),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] + labelSize[1]),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)else:cv2.rectangle(draw_img,(bbox[0], bbox[1] - labelSize[1] - 3),(bbox[0] + labelSize[0], bbox[1] - 3),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] - 3),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)img_name = 'img_6.png'
img = cv2.imread(img_name)
box = [25, 43, 200, 180, "sdq"]
box_color = (255, 0, 255)
cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), color=box_color, thickness=2)draw_img = img.copy()
draw_label_type(draw_img, box, label_color=(255, 255, 255))  # 添加標簽alpha = 0.8
gamma = 0
out_img = cv2.addWeighted(img, alpha, draw_img, 1 - alpha, gamma)cv2.imshow('Image with Transparent Rectangle', out_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

小結

在目標檢測中,優化矩形框的標簽和角點可以提高可視化效果和用戶理解。透明效果的應用則使得目標框融入原始圖像,不影響圖像的主體內容,提高了整體呈現的美觀性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165485.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165485.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165485.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++二分算法:最多可以參加的會議數目 II

本文涉及的基礎知識點 二分查找算法合集 本題其它解法 C二分向量算法&#xff1a;最多可以參加的會議數目 II 題目 給你一個 events 數組&#xff0c;其中 events[i] [startDayi, endDayi, valuei] &#xff0c;表示第 i 個會議在 startDayi 天開始&#xff0c;第 endDay…

如何在Ubuntu 20.04.6 LTS系統上運行Selenium自動化測試

文章目錄 寫在前面一、 環境準備1.1 安裝python31.1.1 使用APT安裝Python31.1.2 使用PPA安裝較新版本的Python31.1.3 從源代碼編譯安裝Python31.2 安裝pip31.3 安裝jdk1.4 安裝運行所需瀏覽器1.4 使用Git拉取自動化測試代碼/復制自動化測試代碼到Ubuntu 20.04.6 LTS二、安裝pip…

Let’s xrOS 一款讓你優先體驗社區創作者的 visionOS App工具

Let’s xrOS Apple Vision Pro 發布預示著空間計算時代的到來&#xff0c;讓科技愛好者和開發者開始思考如何在新的交互、系統和硬件上打造獨特的三維應用。 自 WWDC 2023 的發布會后&#xff0c;社交媒體上涌現了許多精美的 visionOS App 的效果圖和演示視頻&#xff0c;然而…

Rola詳解國外住宅IP代理選擇的8個方法,穩定的海外IP哪個靠譜?

一、國外住宅IP代理是什么&#xff1f; 代理服務器充當您和互聯網之間的網關。它是一個中間服務器&#xff0c;將最終用戶與他們瀏覽的網站分開。如果您使用國外代理IP&#xff0c;互聯網流量將通過國外代理服務器流向您請求的地址。然后&#xff0c;請求通過同一個代理服務器…

常見樹種(貴州省):014槭樹、梧桐、鵝掌楸、檫木、梓木、油桐、泡桐、川楝、麻楝

摘要&#xff1a;本專欄樹種介紹圖片來源于PPBC中國植物圖像庫&#xff08;下附網址&#xff09;&#xff0c;本文整理僅做交流學習使用&#xff0c;同時便于查找&#xff0c;如有侵權請聯系刪除。 圖片網址&#xff1a;PPBC中國植物圖像庫——最大的植物分類圖片庫 一、色木槭…

java--繼承快速入門

1.什么是繼承 java中提供了一個關鍵字extends&#xff0c;用這個關鍵字&#xff0c;可以讓一個類和另一個類建立其父子關系。 2.繼承的特點 子類能繼承父類的非私有成員(成員變量&#xff0c;成員方法)。 3.繼承后對象的創建 子類的對象是由子類、父類共同完成的。 4.繼承的…

基于IDEA+HTML+SpringBoot前后端分離電子商城

基于springboot的電子商城 項目介紹&#x1f481;&#x1f3fb; ?B2C 商家對客戶 ?C2B2C 客戶對商家對客戶 1.1.1 B2C 平臺運營方即商品的賣家 小米商城 ?商品 ?用戶 1.1.2 C2B2C 平臺運營方不賣商品&#xff08;也可以賣&#xff09; 賣家是平臺的用戶 買家也是平臺用戶 ?…

『C++成長記』C++入門—— 函數重載引用

&#x1f525;博客主頁&#xff1a;小王又困了 &#x1f4da;系列專欄&#xff1a;C &#x1f31f;人之為學&#xff0c;不日近則日退 ??感謝大家點贊&#x1f44d;收藏?評論?? 目錄 一、函數重載 &#x1f4d2;1.1函數重載的概念 &#x1f4d2;1.2函數重載的種類 …

基于51單片機音樂盒設計( proteus仿真+程序+原理圖+PCB+報告+講解視頻)

音樂盒 主要功能&#xff1a;仿真原理圖PCB圖程序設計&#xff1a;設計報告實物圖資料清單&#xff08;提供資料清單所有文件&#xff09;&#xff1a;資料下載鏈接&#xff1a; 基于51單片機音樂盒仿真設計( proteus仿真程序原理圖PCB報告講解視頻&#xff09; 仿真圖proteus …

Python實現交易策略評價指標-收益率

1.收益率的定義 收益率幾乎是所有投資者都會關注的一個指標&#xff0c;收益率的高低決定了投資策略的賺錢能力&#xff0c;常見關于收益率的指標如下&#xff1a; 持有期收益率 持有期收益率 期末投資權益 ? 期初投資權益 期初投資權益 持有期收益率 \frac {期末投資權益…

GeoTrust SSL數字安全證書介紹

一、GeoTrust OV證書的介紹 GeoTrust OV證書是由GeoTrust公司提供的SSL證書&#xff0c;它是一種支持OpenSSL的數字證書&#xff0c;具有更高的安全性和可信度。GeoTrust是全球領先的網絡安全解決方案提供商&#xff0c;為各類用戶提供SSL證書和信任管理服務。GeoTrust OV證書…

docker國內鏡像加速

創建或修改 /etc/docker/daemon.json 文件&#xff0c;修改為如下形式 {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"] } Docker中國區官方鏡像htt…

51單片機應用從零開始(八)·循環語句(for循環、while 語句、do‐while 語句)

51單片機應用從零開始&#xff08;七&#xff09;循環語句&#xff08;if語句&#xff0c;swtich語句&#xff09;-CSDN博客 目錄 1. 用for 語句控制蜂鳴器鳴笛次數 2. 用while 語句控制 LED 3. 用 do‐while 語句控制 P0 口 8 位 LED 流水點亮 1. 用for 語句控制蜂鳴器鳴笛…

Kafka 控制器(controller)

Kafka 控制器&#xff08;controller&#xff09; 在kafka集群中 會存在一個或者多個broker&#xff08;一個服務器就是一個broker&#xff09;&#xff0c;其中有一個broker會被選舉為控制器 kafka controller &#xff0c;負責管理整個集群中所有副本、分區的狀態&#xff0…

多語言快速排序算法

快速排序是一種高效的排序算法&#xff0c;使用分治法策略。它的基本思想是&#xff1a;選擇一個元素作為“基準”&#xff08;pivot&#xff09;&#xff0c;重新排序數列&#xff0c;所有比基準值小的元素擺放在基準前面&#xff0c;所有比基準值大的擺在基準的后面。在這個分…

python內置模塊binascii,二進制數據和ASCII字符串之間進行轉換

一、簡介 binascii是Python標準庫中的一個模塊&#xff0c;提供了在二進制數據和ASCII字符串之間進行轉換的功能。它包含了一些用于處理二進制數據的函數&#xff0c;可以進行二進制數據的編碼、解碼和轉換。 二、方法 binascii.unhexlify(hexstr)&#xff1a;將十六進制表示…

事件循環機制及常見面試題

借鑒&#xff1a; 《Javascript 忍者秘籍》第二版&#xff0c;事件循環篇 面試 | JS 事件循環 event loop 經典面試題含答案 - 知乎 (zhihu.com) 概念 主棧隊列就是一個宏任務&#xff0c;每一個宏任務執行完就會執行宏任務中的微任務&#xff0c;直到微任務全部都執行完&a…

Python 使用XlsxWriter操作Excel

在數據處理和報告生成的領域中&#xff0c;Excel 文件一直是廣泛使用的標準格式。為了讓 Python 開發者能夠輕松創建和修改 Excel 文件&#xff0c;XlsxWriter 庫應運而生。XlsxWriter 是一個功能強大的 Python 模塊&#xff0c;專門用于生成 Microsoft Excel 2007及以上版本&a…

Vue3-provide和inject

作用和場景&#xff1a;頂層組件向任意的底層組件傳遞數據和方法&#xff0c;實現跨層組件通信 跨層傳遞普通數據&#xff1a; 1.頂層組件通過provide函數提供數據 2.底層組件通過inject函數獲取數據 既可以傳遞普通數據&#xff0c;也可以使用ref傳遞響應式數據&#xff08…

批量插入SQL 錯誤 [933] [42000]: ORA-00933: SQL 命令未正確結束

使用DBeaver向【oracle數據庫】插入大量數據 INSERT INTO Student(name,sex,age,address,birthday) VALUES(Nike,男,18,北京,2000-01-01) ,(Nike,男,18,北京,2000-01-01) ,(Nike,女,18,北京,2000-01-01) ,(Nike,女,18,北京,2000-01-01) ,(Nike,男,18,北京,2000-01-01) ,(Nike…