opencv中contours的使用

一 Contour Finding

? ? Contours使用 STL-style vector<> 表示,如 vector<cv::Point>, vector<cv::Point2f>。opencv中,使用函數 cv::findContours() 尋找contours, 具體函數定義如下:

? ? void cv::findContours(cv::InputOutputArray image,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? cv::OutputArrayofArrays contours,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? cv::OutputArray hierarchy,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? int mode,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? int method,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? cv::Point offset = cv::Point());

? ?? void cv::findContours(cv::InputOutputArray image,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? cv::OutputArrayofArrays contours,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? int mode,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? int method,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? cv::Point offset = cv::Point());

? ? 參數 image 為8位單通道輸入圖像,一般情況下,該圖像可能由 cv::threshold(), cv::adaptiveThreshold 生成。當 image 由 cv::Canny() 生成時,cv::findContours() 僅當邊緣圖像為寬度為1的細區域圖像,對于閉合邊緣,可以使用內邊緣或者外邊緣代替邊緣圖像進行后續分析;但對于非閉合邊緣,個人認為?cv::Canny() 生成的邊緣圖像不適合使用?cv::findContours() 進行查找;替代方案是使用邊緣跟蹤算法,將?cv::Canny()? 生成邊緣保存在?vector<cv::Point> 中,然后使用 Contours 相關分析進行更多分析。

? ? 參數?contours 為 vector<vector<cv::Point>>,?vector<vector<cv::Point2f>>, 使用 array of arrays 結構可以同時保存多條 contours。

? ? 參數 hierarchy 為 vector<cv::Vec4i>, 每個元素對應一個 contour, 元素中4個整數表示該 contour 與其他 contour 之間的關系,具體關系如下:

? ? ? ??

? ? 其中, c 表示 contour, h 表示? hole.

? ? opencv 如何生成 contour 的 hierarchy? 個人認為(暫時沒有研究 opencv 具體實現),一種可行的思路是使用區域增長,大概流程如下:

? ? 1)將種子點設置在圖像邊角處,使用背景顏色進行區域增長,區域增長在前景處停止;

? ? 2)使用形態學算子對當前增長后區域進行 dilate 操作,使 c0, c1,... 層級上的 contours 包含在當前增長區域中;

? ? 3)繼續使用前景對圖像增長,將 h00, h01,..., h10, h11,... 等層級上的 contours 包含在當前增長區域中;

? ? 4)如此循環,即可生成 contour 的? hierarchy 結構。

? ? 要使用?vector<cv::Vec4i> 表示 以上樹形結構,每個?cv::Vec4i 元素值含義如下:

? ? 1) index 0: next contour(same level);

? ? 2) index 1: privous contour(same level);

? ? 3) index 2: first child(next level down);?

? ? 4) index 3: parent(next level up);

?? 參數 mode 表示如何提取 contours, 具體如下:

? ? 1) cv::PETR_EXTERNAL: 僅提取最外層 contour, 在以上圖例中,僅提取 c0;

? ? 2) cv::PETR_LIST: 提取所有 contours, 組成鏈表結構,在圖例中為: c010->c001->c000->h01->h00->c0;

? ? 3) cv::PETR_CCOMP: 提取所有 contours, 根據類型組成? hole list 和 contour list, 在圖例中為:c010->c001->c000->c0, h01->h00, c0->h01(此處將前兩個鏈表連接起來);

? ? 4) cv::PETR_TREE: 提取所有 contours, 建立樹形結構。

? ? 參數 method 對 contour 壓縮,以減少數據量,包括:

? ? 1) cv::CHAIN_APPROX_NONE: 不做任何壓縮;

? ? 2) cv::CHAIN_APPROX_SIMPLE: 壓縮水平,垂直,對角方向上的線段;

? ? 4) cv::CHAIN_APPROX_TC89_L1/cv::CHAIN_APPROX_TC89_KCOS: 使用曲線曲率信息做更復雜的壓縮。

? ? 參數 offset 將 contour 平移,在使用ROI進行 contour 提取時, 通過設置不同 offset 可以很方便的將 contour 繪制在原圖上。

二? Contour Drawing

? ? 使用 cv::drawContours() 在圖像上繪制 contours, 具體定義如下:

? ? void cv::drawContours(cv::InputOutputArray image,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? cv::InputArrayofArrays contours,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? int contourIdx,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? const cv::Scalar& color,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? int thickness = 1,?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? int lineType = 8,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? cv::InputArray hierarchy = noArray(),

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? int maxLevel = INT_MAX(),

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? cv::Point offset = cv::Point());

? ? 參數?image 為需要繪制 contours 圖像。

? ? 參數 contours 為?cv::findContours() 生成。

? ? 參數?contourIdx 選擇需要繪制的 contour, 如果其值為 -1, 則繪制所有 contours。

? ? 參數 color thickness lineType 分別定義線條顏色,線條寬度,線條類型(4連接 cv::LINE_4, 8連接 cv::LINE_8, 反走樣cv::LINE_AA)。

? ? 參數 hierarchy maxLevel 共同控制 contours 層級。

? ? 參數 offset 表示繪制時平移值。

三 Contour Operation

? ? 1 cv::approxPolyDP() 對? contour 進行多邊形近似,具體定義如下:

? ? void cv::approxPolyDP(cv::InputArray curve, cv::OutputArray approxCurve, double epsilon, bool closed);

? ? 參數 curve 可以是 vector<cv::Point>, vector<cv::Point2f>? 或者 arrays of size N*2, arrays of size N*1 with 2 channels。

? ? 參數 epsilon 表示近似精度,一般通過 contour 長度的百分比計算得出。

? ? 參數 closed 表示 contour 是否閉合。

? ??cv::approxPolyDP() 函數使用 Douglas-Peucker approximation,基本思路如下:

? ? 1)在 contour 上尋找距離最大的兩個點,將 contour 一分為二, 并連接兩點構成線段S;

? ? 2)? 在兩個半邊緣上分別尋找到到線段S上的最遠點,將半邊緣一分為二,連接以上四個點形成四邊形;

?? 3)繼續尋找到四邊形各條邊上的最遠點,構成多邊形,知道最遠點到對應邊上距離小于epsilon停止。

?? 2 double cv::arcLength(cv::InputArrray points, bool closed) 求 contour 長度。

?? 3 double cv::contourArea(cv::InputArray points, bool oriented = false) 使用格林公式求 contour 所圍成的面積,oriented = true 時返回帶符號面積值,該函數對復雜區域(如自交區域)將返回錯誤結果。

?? 4 cv::Rect cv::boundingRect(cv::InputArray points) 求 contour 所圍成的矩形(無旋轉矩形)。

?? 5 cv::RotateRect cv::minAreaRect(cv::InputArray points) 求 contour 所圍成的最小矩形(旋轉矩形)。

?? 6 void cv::minEnclosingCircle(cv::InputArray points, cv::Point2f& center, float& radius)?求 contour 所圍成的最小圓形。

?? 7 cv::RotateRect cv::fitEllipse(cv::InputArray points) 使用 contour 擬合橢圓(使用最小化代價函數)。

?? 8 cv::fitLine() 擬合直線,具體定義如下:

? ? void cv::fitLine(cv::InputArray points, cv::OutputArray line, int distType, double param, double reps, double aeps);

? ? 參數 points 接受二維或者三維點,擬合成二維平面直線或者三維空間直線。

? ? 參數 line 為 vec4f 或者 vec6f, 前兩個(或三個)元素給出直線方向,后兩個(或三個)給出直線上一個點。

? ? 參數? distType 表示距離度量范數,一般使用cv::DIST_L2, cv::DIST_L1。

? ? 參數 reps aeps 表示直線方向與直線點的計算精度,一般賦值為 .01 即可。

?? 9 void cv::convexHull(cv::InputArray points, cv::OutputArray hull, bool clockwise = false, bool returnPoints = true) 計算 contour 凸包,凸包點集計算比較簡單。

?? 10 bool cv::isContourConvex(cv::InputArray contour) 判斷? contour? 凸性。

?? 11 double cv::pointPolygonTest(cv::InputArray contour, cv::Point2f pt, bool measureDist) 判斷點是否在 contour 中,如果 measureDist? = true, 返回點到最近邊緣距離。

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

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

相關文章

網絡安全初級

1、docker并配置代理 &#xff08;1&#xff09;在Ubuntu中安裝docker apt-get install docker.io docker-compose &#xff08;2&#xff09;安裝完成后&#xff0c;進入/etc/systemd/system/docker.service.d/http-proxy.conf配置文件下進行代理的配置&#xff0c;配置如圖…

JetBrains IDE 性能優化指南:idea.vmoptions 核心參數解析與配置建議

文章目錄深入解析 JetBrains IDE 的 VM 選項&#xff1a;idea.vmoptions 參數詳解一、內存與垃圾回收配置二、診斷與錯誤處理三、運行時優化參數四、模塊系統與反射控制五、特殊參數說明六、配置建議指南深入解析 JetBrains IDE 的 VM 選項&#xff1a;idea.vmoptions 參數詳解…

Datawhale AI夏令營 《基于帶貨視頻評論的用戶洞察挑戰賽》Part .1.

1. 賽題 參賽者需要構建端到端的評論分析系統&#xff0c;完成三大核心任務&#xff1a; 商品識別 輸入&#xff1a;視頻描述文本(video_desc)和標簽(video_tags)輸出&#xff1a;精準識別推廣商品名稱(Xfaiyx Smart Translator/Recorder) 多維情感分析 維度&#xff1a;情感傾…

【博文匯項目全維度測試報告:功能與自動化雙軌驗證】

&#x1f308;個人主頁: Aileen_0v0 &#x1f525;熱門專欄: 華為鴻蒙系統學習|計算機網絡|數據結構與算法 ?&#x1f4ab;個人格言:“沒有羅馬,那就自己創造羅馬~” 文章目錄 項目背景:項目背景與意義&#xff1a;項目概述已實現的主要功能包括&#xff1a;當前系統存在的不足…

Java陷阱之assert關鍵字詳解

Assert.isTrue()方法用于斷言條件是否為真&#xff0c;如果條件不滿足&#xff08;即為false&#xff09;&#xff0c;則會拋出IllegalArgumentException&#xff0c;并附帶預設的錯誤信息。在示例中&#xff0c;當1.23不小于2.23時&#xff0c;方法拋出了異常&#xff0c;顯示…

mysql 散記:innodb引擎和memory引擎對比 sql語句少用函數 事務與長事務

文章目錄innodb引擎和memory引擎對比對比sql 語句&#xff1a;盡可能不使用函數條件隱式轉換隱式類型轉換隱式字符編碼轉換補充問題事務與長事務ACIDread viewMVCC 一致性視圖當前讀view 虛擬表長事務的影響與排查影響排查方法預防innodb引擎和memory引擎對比 innodb引擎是索引…

APK安裝器(安卓端)一鍵解除VX限制!輕松安裝各種手機應用

VX為了防止惡意軟件通過平臺傳播&#xff0c;保障用戶設備安全&#xff0c;會把通過VX發送的 APK 文件自動改成 “apk.1” 格式&#xff0c;這樣就能減少惡意軟件傳播的風險。我平時推薦安卓軟件的時候&#xff0c;有朋友反饋說&#xff0c;文件發到VX里就變成 “apk.1” 了&am…

Debian:從GNOME切換到Xfce

最近為20年前的T43重新安裝了Debian系統&#xff0c;但使用的gnome桌面太卡了。于是換成輕量級的Xfce系統。 1.安裝Xfce sudo apt update sudo apt install xfce4 xfce4-goodies命令中xfce4 是Xfce桌面環境的核心組件&#xff0c;xfce4-goodies 是一些額外的工具和插件&#xf…

徐州服務器租用:BGP線路的特點有哪些?

BGP的中文全稱為邊界網關協議&#xff0c;是指一種運行在傳輸控制協議上的自治系統路由協議&#xff0c;主要的功能就是可以實時控制路由的傳播&#xff0c;同時能夠幫助用戶選擇更合適的路由線路&#xff0c;保證網絡能夠穩定的運行&#xff0c;不會輕易出現網絡卡頓或故障的狀…

Java使用OSHI獲取服務器信息

OSHI可以獲取系統信息&#xff08;CPU、內存、磁盤、網絡等&#xff09;&#xff0c;純Java實現&#xff08;通過JNA訪問本地API&#xff0c;無需安裝本地庫&#xff09;&#xff0c;跨平臺支持。引入依賴<dependency><groupId>com.github.oshi</groupId><…

企業數字化資產管理安全、成本、協作困局難解?

在數字化浪潮席卷全球的今天&#xff0c;3D技術已成為驅動影視動畫、工業設計、建筑可視化等領域創新的核心動力。然而&#xff0c;隨著3D資產規模呈指數級增長&#xff0c;企業正面臨前所未有的管理挑戰&#xff1a;海量模型存儲混亂、版本迭代難以追溯、團隊協作效率低下、知…

力扣面試150題--組合總和

Day 72 題目描述&#xff08;終于理順回溯了&#xff09;思路 這里還是基于模板來說明代碼思路void backtracking(參數) {if (終止條件) {存放結果;return;}for (選擇 : 本層集合中的元素) {處理節點;backtracking(路徑, 選擇列表); // 遞歸撤銷處理; // 回溯} }對于主要函數的…

多客戶端-服務器(select,poll)

多客戶端-服務器結構總結一、普通CS架構的局限性核心問題&#xff1a;單線程中accept&#xff08;阻塞等待連接&#xff09;與read&#xff08;阻塞讀取數據&#xff09;函數互相干擾&#xff0c;無法同時處理多客戶端。本質原因&#xff1a;阻塞型函數需獨立執行&#xff0c;若…

如何使用postman做接口測試?

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 常用的接口測試工具主要有以下幾種&#xff1a;Postman: 簡單方便的接口調試工具&#xff0c;便于分享和協作。具有接口調試&#xff0c;接口集管理&#xff0c…

新型網絡架構設計助力智慧醫療降本增效

隨著智慧醫療的快速發展,越來越多的醫院開始布局“互聯網+醫療”服務,通過數字化手段提升醫療服務效率。然而,如何構建一個既穩定可靠又具備靈活擴展能力的醫療網絡,成為醫院數字化轉型中的關鍵問題。本文以某智慧醫療項目為例,探討傳統網絡與SD-WAN結合的最佳實踐。 背景…

一文讀懂現代卷積神經網絡—使用塊的網絡(VGG)

目錄 什么是使用塊的網絡&#xff08;VGG&#xff09;&#xff1f; 一、VGG 的核心思想&#xff1a;用塊&#xff08;Block&#xff09;構建網絡 二、VGG 的網絡結構 三、VGG 的優勢 1. 結構簡潔統一 2. 強大的特征表達能力 3. 小卷積核的計算效率 4. 良好的遷移學習性…

Linux的相關學習

linux 1.文件權限怎么修改 chmod [權限模式] [文件或目錄]1、**數字模式&#xff08;八進制&#xff09;**&#xff1a; chmod 755 myfile.sh # 所有者&#xff1a;rwx (7)&#xff0c;組&#xff1a;r-x (5)&#xff0c;其他用戶&#xff1a;r-x (5) 7 rwx&#xff08;讀寫…

Kotlin集合接口

Kotlin 集合概述 Kotlin 集合提供了對數據進行各種操作的便捷方式。它們實現了接口&#xff0c;因此可以操作不同類型的數據。例如&#xff0c;你可以編寫一個函數&#xff0c;同時打印 Set 和 List 的所有元素。我們來看看這是如何實現的。Iterable 接口 我們已經知道&#xf…

Git 常用操作與注意事項全攻略

1. 基本配置 git config --global user.name "你的名字" git config --global user.email "你的郵箱" git config --list # 查看當前配置建議全局配置用戶名和郵箱&#xff0c;否則提交記錄可能不規范2.倉庫操作 初始化本地倉庫 git init只在新建項目時使…

STM32-第五節-TIM定時器-1(定時器中斷)

一、定時器原理&#xff1a;1.介紹&#xff1a;對指定輸入時鐘進行計數&#xff0c;并在計數值達到設定值時觸發中斷。分類&#xff1a;基本定時器&#xff0c;通用定時器&#xff0c;高級定時器頻率&#xff1a;72MHZ2.框圖&#xff1a; &#xff08;1&#xff09;基本定時器&…