opencv:圖像輪廓檢測與輪廓近似(附代碼)

目錄

圖像輪廓

cv2.findContours(img, mode, method)

繪制輪廓

輪廓特征與近似

輪廓特征

輪廓近似

輪廓近似原理

opencv 實現輪廓近似

輪廓外接矩形

輪廓外接圓


圖像輪廓

cv2.findContours(img, mode, method)

mode:輪廓檢索模式(通常使用第四個模式)

  • RETR_EXTERNAL: 只檢索最外面的輪廓;

  • RETR_LIST: 檢索所有的輪廓,并將其保存到一條鏈表當中;

  • RETR_CCOMP: 檢索所有的輪廓,并將他們組織為兩層:頂層是各部分的外部邊界,第二層是空洞的邊界;

  • RETR_TREE: 檢索所有的輪廓,并重構嵌套輪廓的整個層次;

method:輪廓逼近方法

  • CHAIN_APPROX_NONE: 以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點的序列)。

  • CHAIN_APPROX_SIMPLE: 壓縮水平的、垂直的和斜的部分,也就是,函數只保留他們的終點部分。

繪制輪廓

需要注意的是,當我們要進行輪廓檢測時,為了更高的準確率,使用黑白二值圖像。

輪廓特征與近似

輪廓特征

cnt = contours[0]
# 面積
cv2.contourArea(cnt)
# 周長,True 表示閉合的
cv2.arcLength(cnt, True)

輪廓近似

輪廓近似原理

如上圖,設定一個閾值 T,原曲線 AB,曲線 AB 上找一點C距離AB直線最遠,距離為d1,如果d1 < T,則曲線AB可以近似為直線 AB,如果d1 > T,則連接直線 AC 與 直線 CB,從曲線AC上找一點 D 距離直線 AC 最遠,距離為 d2,如果 d2 < T,則曲線 AC 可以近似為直線 AC,否則繼續連線。

整個過程有點類似于“二分法”。只要曲線上最遠一點小于閾值,則兩點取直線代替曲線。

通過調整閾值,我們就可以做到輪廓近似:(中間和右邊為不同閾值下的輪廓近似)

opencv 實現輪廓近似

img = cv2.imread("img1.jpg", cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# binary 為二值圖像, contours 為輪廓信息的集合, hierarchy 為輪廓層級信息
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 獲取你想要進行近似操作的輪廓
cnt = contours[0]
# 一般閾值取百分比輪廓周長
epsilon = 0.1 * cv2.arcLength(cnt, True)
# 輪廓近似化
approx = cv2.approxPolyDP(cnt, epsilon, True)
# 需要注意copy,繪制輪廓函數會改變傳入原圖
draw_img = img.copy()
# 傳入繪制圖像,輪廓,輪廓索引(-1表示全部輪廓),線條顏色,線條寬度
res = cv2.drawContours(draw_img, approx, -1, (0, 255, 0), 1)cv2.imshow("res", res)
cv2.waitKey(0)
cv2.destroyAllWindows()

原圖:

輪廓近似化后:

輪廓外接矩形

# 獲取你想要進行近似操作的輪廓
cnt = contours[0]
# 輪廓外接矩形
x, y, w, h = cv2.boundingRect(cnt)
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我們也可以算出輪廓面積與邊界矩形的比:

area = cv2.contourArea(cnt)
x, y, w, h = cv2.boundingRect(cnt)
rect_area = w * h
extent = float(area) / rect_area
print("輪廓面積與邊界矩形比",extent)

輪廓外接圓

# 獲取你想要進行近似操作的輪廓
cnt = contours[0]
# 輪廓外接圓
(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))  # 圓心
radius = int(radius)       # 半徑
img = cv2.circle(img, center, radius, (0, 255, 0), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相關文章

mtrace定位內存泄漏問題(僅限 GNU glibc 的 Linux)

一、mtrace原理 函數攔截機制&#xff1a;mtrace 利用 glibc 的內部機制&#xff0c;對 malloc() / calloc() / realloc() / free() 等內存函數進行 hook&#xff0c;記錄每一次分配和釋放行為。日志記錄&#xff1a;記錄會寫入 MALLOC_TRACE 環境變量指定的日志文件中&#xf…

高校合作 | 世冠科技聯合普華、北郵項目入選教育部第二批工程案例

近日&#xff0c;教育部學位與研究生教育發展中心正式公布第二批工程案例立項名單。由北京世冠金洋科技發展有限公司牽頭&#xff0c;聯合普華基礎軟件、北京郵電大學共同申報的"基于國產軟件棧的汽車嵌入式軟件開發工程案例"成功入選。該項目由北京郵電大學修佳鵬副…

TOMCAT筆記

一、前置知識&#xff1a;Web 技術演進 C/S vs B/S – C/S&#xff1a;Socket 編程&#xff0c;QQ、迅雷等&#xff0c;通信層 TCP/UDP&#xff0c;協議私有。 – B/S&#xff1a;瀏覽器 HTTP&#xff0c;文本協議跨網絡。 動態網頁誕生 早期靜態 HTML → 1990 年 HTTP 瀏覽…

上海一家機器人IPO核心零部件依賴外購, 募投計劃頻繁修改引疑

作者&#xff1a;Eric來源&#xff1a;IPO魔女8月8日&#xff0c;節卡機器人股份有限公司&#xff08;簡稱“節卡股份”&#xff09;將接受上交所科創板IPO上會審核。公司保薦機構為國泰海通證券股份有限公司&#xff0c;擬募集資金為6.76億元。報告期內&#xff0c;節卡股份營…

Linux810 shell 條件判斷 文件工具 ifelse

變量 條件判斷 -ne 不等 $(id -u) -eq [codesamba ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin" the user is not admin [codesamba ~]$ [ $(id -u) -eq 0] && echo "yes admin" || echo "no not " -bash: [: 缺少 …

ChatGPT 5的編程能力宣傳言過其實

2025年的8月7日&#xff0c;OpenAI 正式向全球揭開了GPT-5的神秘面紗&#xff0c;瞬間在 AI 領域乃至整個科技圈引發了軒然大波。OpenAI對GPT-5的宣傳可謂不遺余力&#xff0c;將其描繪成一款具有顛覆性變革的 AI 產品&#xff0c;尤其在編程能力方面&#xff0c;給出了諸多令人…

從MySQL到大數據平臺:基于Spark的離線分析實戰指南

引言在當今數據驅動的商業環境中&#xff0c;企業業務數據通常存儲在MySQL等關系型數據庫中&#xff0c;但當數據量增長到千萬級甚至更高時&#xff0c;直接在MySQL中進行復雜分析會導致性能瓶頸。本文將詳細介紹如何將MySQL業務數據遷移到大數據平臺&#xff0c;并通過Spark等…

Mysql筆記-存儲過程與存儲函數

1. 存儲過程(Stored Procedure) 1.1 概述 1.1.1 定義&#xff1a; 存儲過程是一組預編譯的 SQL 語句和控制流語句&#xff08;如條件判斷、循環&#xff09;的集合&#xff0c;?無返回值?&#xff08;但可通過 OUT/INOUT 參數或結果集返回數據&#xff09;。它支持參數傳遞、…

[論文閱讀] 人工智能 + 軟件工程 | LLM協作新突破:用多智能體強化學習實現高效協同——解析MAGRPO算法

LLM協作新突破&#xff1a;用多智能體強化學習實現高效協同——解析MAGRPO算法 論文&#xff1a;LLM Collaboration With Multi-Agent Reinforcement LearningarXiv:2508.04652 (cross-list from cs.AI) LLM Collaboration With Multi-Agent Reinforcement Learning Shuo Liu, …

使用OAK相機實現智能物料檢測與ABB機械臂抓取

大家好&#xff01;今天我們很高興能與大家分享來自OAK的國外用戶——Vention 的這段精彩視頻&#xff0c;展示了他們的AI操作系統在現實中的應用——在演示中&#xff0c;進行實時的自動物料揀選。 OAK相機實時自動AI物料揀選視頻中明顯可以看到我們的OAK-D Pro PoE 3D邊緣AI相…

html5和vue區別

HTML5 是網頁開發的核心標準&#xff0c;而 Vue 是構建用戶界面的JavaScript框架&#xff0c;兩者在功能定位和開發模式上有顯著差異&#xff1a; 核心定位 HTML5是 HTML標準 的第五次重大更新&#xff08;2014年發布&#xff09;&#xff0c;主要提供網頁結構定義、多媒體嵌入…

【前端八股文面試題】【JavaScript篇3】DOM常?的操作有哪些?

文章目錄&#x1f9ed; 一、查詢/獲取元素 (Selecting Elements)?? 二、修改元素內容與屬性 (Modifying Content & Attributes)&#x1f9ec; 三、創建與插入元素 (Creating & Inserting Elements)&#x1f5d1;? 四、刪除與替換元素 (Removing & Replacing)&am…

內存殺手機器:TensorFlow Lite + Spring Boot移動端模型服務深度優化方案

內存殺手機器&#xff1a;TensorFlow Lite Spring Boot移動端模型服務深度優化方案一、系統架構設計1.1 端云協同架構1.2 組件職責矩陣二、TensorFlow Lite深度優化2.1 模型量化策略2.2 模型裁剪技術2.3 模型分片加載三、Spring Boot內存優化3.1 零拷貝內存管理3.2 堆外內存模…

安全生產基礎知識(一)

本文檔圍繞安全生產基礎知識展開&#xff1a; 一、安全用電相關知識 用電安全要點 禁止用濕手觸摸燈頭、開關、插頭插座及用電器具。發現有人觸電&#xff0c;切勿用手拉扯&#xff0c;應立即拉開電源開關或用干燥木棍、竹竿挑開電線。電器通電后出現冒煙、燒焦味或著火時&…

Elasticsearch 搜索模板(Search Templates)把“可配置查詢”裝進 Mustache

1. 什么是 Search Template&#xff1f;能解決什么問題&#xff1f; 搜索模板是存儲在 ES 集群里的 Mustache 模板&#xff08;lang: mustache&#xff09;。你把一份標準 _search 請求體寫成模板&#xff0c;變量交給 params&#xff0c;每次調用只需傳參即可&#xff1a; 搜索…

cocos Uncaught TypeError: Cannot read properties of null (reading ‘SetActive‘)

報錯&#xff1a;Uncaught TypeError: Cannot read properties of null (reading SetActive) at b2RigidBody2D.setActive (rigid-body.ts:231:21) at b2RigidBody2D.onEnable (rigid-body.ts:78:14) at RigidBody2D.onEnable (rigid-body-2d.ts:551:24) at OneOffInvoker.invo…

Docker用戶組介紹以及管理策略

在Docker環境中&#xff0c;用戶組&#xff08;尤其是默認的docker組&#xff09;是管理用戶與Docker守護進程交互權限的核心機制。以下從概念介紹和具體管理操作兩方面詳細說明&#xff1a;一、Docker用戶組的核心概念 Docker守護進程&#xff08;dockerd&#xff09;默認通過…

【PyTorch】單目標檢測項目部署

【PyTorch】單目標檢測項目 兩種部署情況&#xff1a;部署在 PyTorch 數據集上&#xff0c;以及部署在本地存儲的單個映像上。 目錄 定義數據集 搭建模型 部署模型 定義數據集 詳細參照前文【PyTorch】單目標檢測項目 import torchvision import os import pandas as pd i…

Baumer高防護相機如何通過YoloV8深度學習模型實現火星隕石坑的檢測識別(C#代碼UI界面版)

《------往期經典推薦------》 AI應用軟件開發實戰專欄【鏈接】 序號 項目名稱 項目名稱 1 1.工業相機 + YOLOv8 實現人物檢測識別:(C#代碼,UI界面版) 2.工業相機 + YOLOv8 實現PCB的缺陷檢測:(C#代碼,UI界面版) 2 3.工業相機 + YOLOv8 實現動物分類識別:(C#代碼,U…

UniApp Vue3 TypeScript項目中使用xgplayer播放m3u8視頻的顯示問題

問題背景 在UniApp Vue3 TypeScript項目中使用xgplayer播放m3u8視頻時&#xff0c;遇到了一個棘手的問題&#xff1a;視頻畫面下移&#xff0c;只能聽到聲音&#xff0c;全屏后才能正常顯示。經過排查&#xff0c;發現是<video>元素在DOM渲染時被異常定位&#xff0c;導…