Opencv實戰(4)詳解輪廓

輪廓

Opencv實戰系列,前文:

文章目錄

  • 輪廓
      • (1).查找繪制
        • 1.findContours()
        • 2.drawContours()
      • (2).層級結構
      • (3).篩選輪廓
      • (4).凸包

(1).查找繪制

預處理

  • 灰度化:使用cv::cvtColor()
  • 圖像去噪:使用高斯濾波cv::Gaussian()
  • 二值化:使用cv::Threshold()
  • 形態學處理:cv::morphologyEx()

其中灰度化可以將3通道圖像轉化為單通道圖像,以便進行二值化門限分割;去噪可以有效剔除圖像中的異常獨立噪點;二值化是為輪廓查找函數提供單通道圖像;形態學的某些處理通常可以剔除細小輪廓,聯通斷裂的輪廓。

1.findContours()
void cv::findContours(InputOutputArray image,OutputArrayOfArrays  contours,OutputArray  hierarchy,int  mode,int method, Point  offset = Point())   
  • contours : 輸出:檢測到的輪廓。由若干個cv::Point類型的點組成了單個輪廓std :: vector < cv :: Point >,再由若干個輪廓組成輸入圖像中的全部輪廓std::vector<std :: vector < cv :: Point >>
  • hierarchy : 輸出:輪廓級別信息。Hierarchy為可選輸出變量,是std::vector< cv::Vec4i>類型的向量(每個元素都是一個4個int值構成的向量)。它具有與輪廓數量一樣多的元素。例如,第i個輪廓, hierarchy[i][0],hierarchy[i][0],hierarchy[i][2]和hierarchy[i][3]依次為:第i個輪廓的[Next, Previous, First_Child, Parent],即輪廓i相同等級的下一輪廓、前一輪廓,第一個子輪廓和父輪廓(上一級輪廓)的索引號(即contours向量中的輪廓序號)。如果輪廓i沒有下一個,前一個,父級或嵌套輪廓,則層次結構[i]的相應元素將為負數。
2.drawContours()
void cv::drawContours(InputOutputArray  image,InputArrayOfArrays  contours,int  contourIdx,const Scalar&color,int  thickness = 1,int  lineType = LINE_8,InputArray   hierarchy = noArray(),int  maxLevel = INT_MAX, Point offset = Point() )       
  • contouridx : 待繪制輪廓序號

(2).層級結構

OpenCV中每個輪廓都有自己的信息,關于它是什么層次結構,誰是它的子輪廓,誰是它的父輪廓等.OpenCV將它表示為四個int值的數組,類型為cv::Vec4i(4個int值):

[Next,Previous,First_Child,Parent]

hierarchy數組在OpenCV中是一個四維數組,hierarchy數組的四維結構為 [輪廓索引, 輪廓信息, 關系信息]

  • Next

Next表示同一級別的下一個輪廓索引。例如,在我們的圖片中取出輪廓-0。同一水平的下一個輪廓是輪廓-1。 所以簡單地說Next = 1。類似地,對于輪廓-1,next是輪廓-2。 所以Next = 2。
輪廓-2的同一級別沒有下一個輪廓,所以輪廓-2的Next = -1。輪廓-4呢?它與輪廓-5處于同一水平。所以它的下一個輪廓是輪廓-5,所以輪廓-4的Next = 5。

  • Previous

Previous表示同一級別的上一個輪廓索引。例如,輪廓-1的上一個輪廓在同一級別中為輪廓-0。 類似地,對于輪廓-2,它的上一個輪廓是輪廓-1。而對于輪廓-0,沒有先前的,所以把它的Previous = -1。

  • First_Child

First_Child表示當前輪廓的第一個子輪廓索引。例如,對于輪廓-2,子輪廓是輪廓-2a。因此輪廓-2的First_Child為輪廓-2a的相應索引值。輪廓-3a呢?它有兩個子輪廓。但hierarchy參數只記錄第一個子輪廓,因此它是輪廓-4的索引值。因此,對于輪廓-3a,First_Child = 4。

  • Parent

Parent表示當前輪廓的父輪廓索引。對于輪廓-4和輪廓-5,它們的父輪廓都是輪廓-3a。對于輪廓-3a,它的父輪廓是輪廓-3,依此類推。

(3).篩選輪廓

首次查找輪廓有許多中間有空洞的輪廓不符合要求,下面就通過遍歷每一個輪廓的hierarchy級別參數的第3第4個參數來找到那些有子輪廓或者有父輪廓的輪廓,并刪除之。注意向量迭代器的使用,刪除后會返回下一個向量的指針;此外,contours與hierarchy元素需要同步刪除和并遞增迭代器,以保持編號對應關系,否則會刪錯。

std::vector<std::vector<cv::Point>>::iterator itc = contours.begin();
std::vector<cv::Vec4i>::iterator itc_hierarchy = hierarchy.begin();
int i = 0;
while(itc_hierarchy != hierarchy.end())
{if (hierarchy[i][2] > 0 || hierarchy[i][3] > 0){itc = contours.erase(itc);itc_hierarchy = hierarchy.erase(itc_hierarchy);}else{++i;++itc;++itc_hierarchy;}
}

(4).凸包

凸包外觀看起來與輪廓逼近相似,但并非如此(在某些情況下兩者可能提供相同的結果)。一般而言,凸曲線是始終凸出或至少平坦的曲線。如果在內部凸出,則稱為凸度缺陷。例如,檢查下面的手的圖像。紅線顯示手的凸包。雙向箭頭標記顯示凸度缺陷,這是船體與輪廓線之間的局部最大偏差。

void cv::convexHull	(InputArray points,OutputArray 	hull,bool 	clockwise = false,bool 	returnPoints = true )	
  • clockwise:方向標記。如果為True,則輸出凸包為順時針方向。否則,其方向為逆時針方向。
  • returnPoints:默認情況下為True。然后返回船體點的坐標。如果為False,則返回與船體點相對應的輪廓點的索引。

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

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

相關文章

Acwing-基礎算法課筆記之數學知識(擴展歐幾里得算法)

Acwing-基礎算法課筆記之數學知識&#xff08;擴展歐幾里得算法&#xff09; 一、擴展歐幾里得算法1、裴蜀定理2、過程模擬3、代碼模板 二、線性同余方程1、定義2、模擬過程3、結論證明 一、擴展歐幾里得算法 1、裴蜀定理 對于任意正整數 a a a&#xff0c; b b b&#xff0…

day48 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

一遍過。 當前房屋偷與不偷取決于 前一個房屋和前兩個房屋是否被偷了。所以這里就更感覺到&#xff0c;當前狀態和前面狀態會有一種依賴關系&#xff0c;那么這種依賴關系都是動規的遞推公式。 class Solution { public:int rob(vector<int>& nums) {vector<vec…

門店縱深不足、入口有遮擋影響客流準確率?近景客流幫你搞定!

為了優化運營策略、提升門店營收&#xff0c;很多店鋪和商場都會安裝客流攝像機。但是在實際應用中&#xff0c;由于門店縱深受限等原因&#xff0c;導致無法使用之前的常規客流產品。 針對這種情況&#xff0c;悠絡客最新研發了近景客流產品&#xff0c;即使存在入口被遮擋或門…

內網信息搜集

目錄 內網基礎知識 基本流程圖 怎么判斷是否在域內 常規信息類收集-應用&服務&權限等 cs信息搜集 bloodhound安裝及使用 內網基礎知識 工作組&#xff1a;將不同的計算機按照功能分別列入不同的組&#xff0c;想要訪問某個部門的資源&#xff0c;只要在【網絡】里…

pyqt教程

一、組件安裝配置 1.安裝組件 在Anaconda Prompt下進入自己的python環境 pip install PyQt5 pip install PyQt5-tools 2.vscode安裝插件 3.配置路徑 配置Pyuic:Cmd與Qtdesigner:Path路徑 1.Pyuic:Cmd路徑 一般是在你安裝的python環境下的 \Scripts\pyuic5.exe 2.Qtdesigner:P…

anaconda簡介以及安裝(Windows)

介紹 Anaconda是一個開源的Python發行版本&#xff0c;它是一個打包的集合&#xff0c;里面預裝了conda、Python、眾多packages、科學計算工具等。Anaconda的目的是方便使用Python進行數據科學研究&#xff0c;它涵蓋了數據科學領域常見的Python庫&#xff0c;并且自帶了專門用…

Python的循環結構練習

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd; 生命對某些人來說是美麗的&#xff0c…

我國每年研究生的畢業數量統計分享

本數據集詳細記錄了自1949年至2021年我國每年研究生的畢業數量&#xff08;包括碩士和博士學位的畢業生&#xff09;。在2021年&#xff0c;我國的研究生畢業生人數達到了772,761人&#xff0c;此數字比上一年度增加了44,000人。 統計的數據單位使用的是人數。 數據展示&…

mysql,for循環執行sql

遇到一個問題&#xff0c;我需要模擬上百萬數據來優化sql&#xff0c;線上數據down不下來&#xff0c;測試庫又沒有&#xff0c;寫代碼執行要么慢要么就是sql語句太長。 于是&#xff0c;直接用mysql自帶的功能去實現&#xff01; 簡單而簡單 mysql可以for循環&#xff1f;沒…

Laravel框架: Call to a member function connect() on null 異常報錯處理

Laravel框架&#xff1a; Call to a member function connect() on null 異常報錯處理 Date: 2024.03.01 21:03:11 author: lijianzhan 原文鏈接: https://learnku.com/laravel/t/63721 問題&#xff1a; local.ERROR: Call to a member function connect() on null {"…

【前端素材】推薦優質后臺管理系統 Greeva平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理網站、應用程序或系統的管理界面&#xff0c;通常由管理員和工作人員使用。它提供了訪問和控制網站或應用程序后臺功能的工具和界面&#xff0c;使其能夠管理用戶、內容、數據和其他各種功能。 2、功能需求 后臺管理系…

使用mininet快速入門ONOS路由交換技術與原理-路由篇

上篇文章 《使用mininet快速入門ONOS路由交換技術與原理-交換篇》 使用mininet搭建了一個簡單的網絡拓撲&#xff0c;并實現了同一交換機下同網段多主機的通信&#xff0c;其中涉及到的通信知識主要以二層mac地址通信為主。 但在蕓蕓網絡的世界中&#xff0c;主機間的通信除了…

【C++】數組、函數、指針

文章目錄 1.數組1.1一維數組1.2二維數組 2.函數3.指針&#xff1a;可以通過指針間接訪問內存(指針記錄地址&#xff09;3.1 指針的定義和使用3.2 指針所占用空間3.3 空指針和野指針3.4 const修飾指針3.5指針和數組3.6指針和函數3.7練習&#xff08;指針、數組、函數&#xff09…

綜合練習(二)

目錄 列出薪金比 SMITH 或 ALLEN 多的所有員工的編號、姓名、部門名稱、領導姓名、部門人數&#xff0c;以及所在部門的平均工資、最高和最低工資 補充 spool Oracle從入門到總裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 列出薪金比 SMITH 或 AL…

STM32USART串口數據包

文章目錄 前言一、介紹部分數據包兩種包裝方式&#xff08;分割數據&#xff09;HEX數據包文本數據包 數據包的收發流程數據包的發送數據包的接收固定包長的hex數據包接收可變包長的文本數據包接收 二、實例部分固定包長的hex數據包接收連接線路代碼實現 可變包長的文本數據包接…

【InternLM 實戰營筆記】基于 InternLM 和 LangChain 搭建你的知識庫

準備環境 bash /root/share/install_conda_env_internlm_base.sh InternLM升級PIP # 升級pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install a…

MySQL 多表查詢 連接查詢 外連接

介紹 MySQL 多表查詢 連接查詢 內連接 外連接分為兩種&#xff0c;左外和右外連接&#xff0c; 左外&#xff1a;相當于查詢表1(左表)的所有數據 包含 表1和表2交集部分的數據,完全包含左表的數據 右外&#xff1a;相當于查詢表2(右表)的所有數據 包含 表1和表2交集部分的數據…

比特幣暴漲逼近歷史最高點;阿里云全線降價20%丨 RTE 開發者日報 Vol.155

開發者朋友們大家好&#xff1a; 這里是 「RTE 開發者日報」 &#xff0c;每天和大家一起看新聞、聊八卦。我們的社區編輯團隊會整理分享 RTE &#xff08;Real Time Engagement&#xff09; 領域內「有話題的 新聞 」、「有態度的 觀點 」、「有意思的 數據 」、「有思考的 文…

mysql查詢某個庫下所有表的數據量

要查詢MySQL數據庫下指定數據庫的所有表的數據量&#xff08;即每個表中的記錄數&#xff09;&#xff0c;你可以使用以下步驟&#xff1a; 連接到MySQL數據庫&#xff1a;首先&#xff0c;你需要使用MySQL客戶端或任何支持MySQL連接的編程語言&#xff08;如Python, PHP, Nod…

adb命名大全

1. 獲取內部版本號&#xff1a; adb shell getprop ro.build.display.innerver 2. 獲取按鍵值&#xff1a; adb shell getevent 3. 獲取apk信息&#xff1a; adb shell dumpsys package 包名 ->info.txt 4. 獲取應用包名&#xff1a;adb shell dumpsys window windows | gre…