4.RV1126-OPENCV 圖像輪廓識別

一.圖像識別API

1.圖像識別作用

????????它常用于視覺任務、目標檢測、圖像分割等等。在 OPENCV 中通常使用 Canny
函數、findContours 函數、drawContours 函數
結合在一起去做輪廓的形檢測。

2.常用的API?

  • findContours 函數:用于尋找圖片的輪廓,并把所有的數據存儲在向量里面? ? ? ? ? ? ? ? ? ??

????????CV_EXPORTS_W void findContours( InputOutputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset = Point());

    第一個參數:image 輸入的二值圖像,這個圖像通常是用在邊緣檢測、閾值處理等等
    第二個參數:contours 輸出的輪廓集合,每一個輪廓都是由點組成,通常用vector<vector<Point>>來表示

    第三個參數:hierarchy 輸出的輪廓層次結構,這通常表示輪廓之間的父子關系,這個是可選參數,通常用 vector<Vec4i> hierarchy來表示。比方說,第 i 個輪廓,hierarchy[i][0]、hierarchy[i][1]、hierarchy[i][2]、hierarchy[i][3], 依次為第 i 個輪廓[Next、Pervious、First_Child,Parent], 這表示的是相同等級下的下一輪廓、前一輪廓,第一個子輪廓和父輪廓的索引號。若輪廓 i 沒有下一個,前一個或者父級輪廓,則層次相應的元素是負數。如下圖:

    第四個參數:mode 輪廓檢索模式,通常有以下選項,分別是:RETR_EXTERNAL(只檢測最外層輪廓)、RETR_LIST(檢測所有輪廓,包括內圍、外圍輪廓,但都是同等級的)、RETR_CCOMP(檢測所有輪廓,但是所有的輪廓只建立兩個等級關系,一個外層,一個內層(不管內層有多少個,都屬于內層))、RETR_TREE(檢測所有輪廓并建立輪廓樹,這個模式下外圍輪廓包含內層輪廓,內層還可以繼續嵌套)。

    第 五 個 參 數 : method 輪 廓 近 似 方 法 , 通 常 有 以 下 的 幾 種 方 法 , 分 別 是 CHAIN_APPROX_NONE( 存 儲 所 有 頂 點 ) 、CHAIN_APPROX_SIMPLE(僅存儲輪廓的拐點信息,并把所有輪廓拐點處的點保存到向量里面)、CHAIN_APPROX_TC89_L1(使用TEH_CHAIN 近似算法)。
    第六個參數:offset 輪廓點偏移量,默認(0,0)

    • drawContours 函數:用于繪制圖像的輪廓,配合findContours 函數使用,用findContours 函數獲取輪廓,用drawContours 函數畫輪廓。

    ?????????CV_EXPORTS_W void 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() );

    第一個參數:image 輸出圖像,即繪制輪廓后的圖像
    第二個參數:contours 輪廓的集合,它是由一系列的點組成
    第三個參數:contourIdx、輪廓索引數組,指定要繪制哪些輪廓
    第四個參數:contourColor,輪廓顏色,使用 Scalar 類型表示
    第五個參數:thickness,輪廓線寬,默認 1
    第六個參數:lineType ,輪廓線類型,默認為 LINE_8

    第七個參數:hierarchy ,輪廓層次結構,用于繪制輪廓的父子關系。默認為 noArray()
    第八個參數:maxLevel ,表示繪制輪廓的最大層級數量。若 maxLevel 為 0,則只繪制指定的輪廓;若 maxLevel 為 1,則繪制輪廓極其所有嵌套輪廓;若 maxLevel 為 2,則繪制輪廓、所有嵌套輪廓、所有嵌套到嵌套的輪廓。
    第九個參數:輪廓點的偏移量,默認為(0,0)?

    • Canny 函數:用于邊緣檢測計算。效果如下:

    ? ? ? ? ?工作原理:就是一系類數學處理方法。高斯濾波(將圖像轉換為灰度圖像,高斯濾波作用是平滑圖像,讓 Canny 檢測的時候準確率更高)、梯度強度和方向的計算(計算圖像中每個像素的強度和方向、強度表示像素點的邊緣強度、梯度表示的是邊緣方向這里的梯度需要用到 sobel 因子)、非極大抑制(經過 NMS 操作后,會除去一些不是邊緣的像素點)、雙閾值處理(給出一個閾值,若超過這個閾值的邊緣則會被保留)、邊緣鏈接(經過雙閾值處理過后,強邊緣則會留下來,弱邊緣則會被抑制,并會把所有的強邊緣全部連接起來)。

    ?????????工作原理白話文:把3通道圖片(也就是彩色圖片)轉化成雙通道圖片(也就是灰色圖像),然后用高斯濾波去除細小雜物讓它更好識別輪廓;梯度強度和方向的計算,就是不同程度掃描輪廓,掃描很多輪廓;非極大抑制,去除邊邊角角不是邊緣的像素點;雙閾值處理,就是在之前掃描不同程度輪廓上設置兩個閾值(Max,Min),大于Max值被認為是輪廓保留下來,小于Min被認為不是輪廓去除掉,在兩值中間的是邊緣保留,不是去掉;邊緣鏈接,就是一個完整輪廓。

    ????????CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,double threshold1, double threshold2,int apertureSize = 3, bool L2gradient = false );?

    第一個參數:image 輸入的圖像,這個圖像一定要單通道灰度圖
    第二個參數:edges 輸出的邊緣圖像,這個圖像也必須是單通道黑白圖
    第三個參數:threshold1 第一個滯后性閾值,低閾值,小于低閾值則認為是弱邊緣,就是需要拋棄的邊緣。
    第四個參數:threshold2 第二個滯后性閾值,高閾值,大于高閾值被認為強邊緣,需要保留的邊緣
    第五個參數:apertureSize 指的是 Sobel 算子大小,這個值默認為 3,代表的是 3*3 的矩陣大小。
    第六個參數:L2gradient 是計算圖像梯度幅度值的情況,這個值默認為 False;若選擇 True,則使用更精確的 L2 范數進行計算

    二. 代碼實戰掃描物體輪廓

    1.掃描輪廓步驟

    ????????分別是 imread 讀取圖片(這個圖片默認是 3 通道)、利用 cvtColor 把 8VU3 的三通道圖片轉換成灰度圖(8VU1)、調用 Canny 對灰度圖像進行邊緣檢測、調用 findContours 去查找輪廓、循環輪廓數量然后調用 drawContours 進行畫框操作。

    2.代碼

    #include <opencv2/opencv.hpp>
    #include <opencv2/dnn.hpp>
    #include <opencv2/imgcodecs.hpp>
    #include <opencv2/imgproc.hpp>
    #include <iostream>using namespace cv;
    using namespace std;int main()
    {//讀取圖片Mat img = imread("zjl.jpg");//彩色圖片轉化灰度圖片Mat imgGray;cvtColor(img, imgGray, COLOR_RGB2GRAY);//灰度圖片邊緣檢測輪廓Mat imgCanny;Canny(imgGray, imgCanny, 25, 75); //Canny對圖像進行邊緣檢測,弱閾值25,強閾值75//查詢輪廓vector<vector<Point>> contours; //定義輪廓vector<Vec4i> hierarchy; //定義層次結構findContours(imgCanny, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE); //查詢輪廓,RETR_EXTERNAL表示只檢測外部輪廓,CHAIN_APPROX_NONE表示存儲所有的輪廓點//繪制輪廓Mat drawing = Mat::zeros(imgCanny.size(), CV_8UC3);//創建一個空白圖像,用于繪制輪廓for (int i = 0; i < contours.size(); i++)   //遍歷所有輪廓{Scalar color = Scalar(255, 255, 0); //隨機生成顏色drawContours(drawing, contours, i, color, 1, 8, hierarchy); //對圖像輪廓進行畫框}//顯示圖像imwrite("zjl1.jpg", drawing);return 0;
    }

    3.效果

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

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

    相關文章

    Qt多線程訪問同一個數據庫源碼分享(基于Sqlite實現)

    Qt多線程訪問同一個數據庫源碼分享&#xff08;基于Sqlite實現&#xff09; 一、實現難點線程安全問題死鎖風險連接管理問題數據一致性性能瓶頸跨線程信號槽最佳實踐建議 二、源碼分享三、測試1、新建一個多線程類2、開啟多線程插入數據 一、實現難點 多線程環境下多個線程同時…

    雙空間知識蒸餾用于大語言模型

    Dual-Space Knowledge Distillation for Large Language Models 發表&#xff1a;EMNLP 2024 機構&#xff1a;Beijing Key Lab of Traffic Data Analysis and Mining 連接&#xff1a;https://aclanthology.org/2024.emnlp-main.1010.pdf 代碼&#xff1a;GitHub - songmz…

    貪心算法應用:多重背包啟發式問題詳解

    貪心算法應用&#xff1a;多重背包啟發式問題詳解 多重背包問題是經典的組合優化問題&#xff0c;也是貪心算法的重要應用場景。本文將全面深入地探討Java中如何利用貪心算法解決多重背包問題。 多重背包問題定義 **多重背包問題(Multiple Knapsack Problem)**是背包問題的變…

    ES6 Promise 狀態機

    狀態機&#xff1a;抽象的計算模型&#xff0c;根據特定的條件或者信號切換不同的狀態 一、Promise 是什么&#xff1f; 簡單來說&#xff0c;Promise 就是一個“承諾對象”。在ES6 里&#xff0c;有些代碼執行起來需要點時間&#xff0c;比如加載文件、等待網絡請求或者設置…

    【Docker管理工具】部署Docker可視化管理面板Dpanel

    【Docker管理工具】部署Docker可視化管理面板Dpanel 一、Dpanel介紹1.1 DPanel 簡介1.2 主要特點 二、本次實踐規劃2.1 本地環境規劃2.2 本次實踐介紹 三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本 四、下載Dpanel鏡像五、部署Dpanel…

    最新研究揭示云端大語言模型防護機制的成效與缺陷

    一項全面新研究揭露了主流云端大語言模型&#xff08;LLM&#xff09;平臺安全機制存在重大漏洞與不一致性&#xff0c;對當前人工智能安全基礎設施現狀敲響警鐘。該研究評估了三大領先生成式AI平臺的內容過濾和提示注入防御效果&#xff0c;揭示了安全措施在阻止有害內容生成與…

    docker中,容器時間和宿機主機時間不一致問題

    win11下的docker中有個mysql。今天發現插入數據的時間不正確。后來發現原來是docker容器中的時間不正確。于是嘗試了各種修改&#xff0c;什么run -e TZ"${tzutil /g}"&#xff0c;TZ"Asia/Shanghai"&#xff0c;還有初始化時帶--mysqld一類的&#xff0c;…

    uniapp實現的簡約美觀的星級評分組件

    采用 uniapp 實現的一款簡約美觀的星級評分模板&#xff0c;提供絲滑動畫效果&#xff0c;用戶可根據自身需求進行自定義修改、擴展&#xff0c;純CSS、HTML實現&#xff0c;支持web、H5、微信小程序&#xff08;其他小程序請自行測試&#xff09; 可到插件市場下載嘗試&#x…

    go語言的鎖

    本篇文章主要講鎖&#xff0c;主要會涉及go的sync.Mutex和sync.RWMutex。 一.鎖的概念和發展 1.1 鎖的概念 所謂的加鎖和解鎖其實就是指一個數據是否被占用了&#xff0c;通過Mutex內的一個狀態來表示。 例如&#xff0c;取 0 表示未加鎖&#xff0c;1 表示已加鎖&#xff…

    Ubuntu 服務器軟件更新,以及常用軟件安裝 —— 一步一步配置 Ubuntu Server 的 NodeJS 服務器詳細實錄 3

    前言 前面&#xff0c;我們已經 安裝好了 Ubuntu 服務器系統&#xff0c;并且 配置好了 ssh 免密登錄服務器 &#xff0c;現在&#xff0c;我們要來進一步的設置服務器。 那么&#xff0c;本文&#xff0c;就是進行服務器的系統更新&#xff0c;以及常用軟件的安裝 調整 Ubu…

    如何從零開始建設一個網站?

    當你沒有建站的基礎和建站的知識&#xff0c;那么應該如何開展網站建設和網站管理。而今天的教程是不管你是為自己建站還是為他人建站都適合的。本教程會指導你如何進入建站&#xff0c;將建站的步驟給大家分解&#xff1a; 首先我們了解一下&#xff0c;建站需要那些步驟和流程…

    網絡可靠性的定義與核心要素

    網絡可靠性&#xff08;Network Reliability&#xff09;是指網絡系統在特定時間范圍內持續提供穩定、無中斷、符合預期性能的服務能力。其核心目標是確保數據能夠準確、完整、及時地傳輸&#xff0c;即使在部分故障或異常情況下仍能維持基本功能。 1. 網絡可靠性的核心指標 衡…

    GpuGeek如何成為AI基礎設施市場的中堅力量

    AI時代&#xff0c;算力基礎設施已成為支撐技術創新和產業升級的關鍵要素。作為國內專注服務算法工程師群體的智算平臺&#xff0c;GpuGeek通過持續創新的服務模式、精準的市場定位和系統化的生態建設&#xff0c;正快速成長為AI基礎設施領域的中堅力量。本文將深入分析GpuGeek…

    【Qt】Bug:findChildren找不到控件

    使用正確的父對象調用 findChildren&#xff1a;不要在布局對象上調用 findChildren&#xff0c;而應該在布局所在的窗口或控件上調用。

    【Linux網絡編程】傳輸層協議TCP,UDP

    目錄 一&#xff0c;UDP協議 1&#xff0c;UDP協議的格式 2&#xff0c;UDP的特點 3&#xff0c;面向數據報 4&#xff0c;UDP的緩沖區 5&#xff0c;UDP使用注意事項 6&#xff0c;基于UDP的應用層協議 二&#xff0c;對于報文的理解 三&#xff0c;TCP協議 1&…

    Neo4j 數據可視化與洞察獲取:原理、技術與實踐指南

    在關系密集型數據的分析領域,Neo4j 憑借其強大的圖數據模型脫穎而出。然而,將復雜的連接關系轉化為直觀見解,需要專業的數據可視化技術和分析方法。本文將深入探討 Neo4j 數據可視化的核心原理、關鍵技術、實用技巧以及結合圖數據科學庫(GDS)獲取深度洞察的最佳實踐。 Ne…

    樹莓派超全系列教程文檔--(55)如何使用網絡文件系統NFS

    如何使用網絡文件系統NFS 網絡文件系統 (NFS)設置基本 NFS 服務器Portmap 鎖定&#xff08;可選&#xff09; 配置 NFS 客戶端端口映射鎖定&#xff08;可選&#xff09; 配置復雜的 NFS 服務器組權限DNS&#xff08;可選&#xff0c;僅在使用 DNS 時&#xff09;NIS&#xff0…

    無法運用pytorch環境、改環境路徑、隔離環境

    一.未建虛擬環境時 1.創建新項目后&#xff0c;直接運行是這樣的。 2.設置中Virtualenv找不到pytorch環境&#xff1f;因為此時沒有創建新虛擬環境。 3.選擇conda環境&#xff08;全局環境&#xff09;時&#xff0c;是可以下載環境的。 運行結果如下&#xff1a; 是全局環境…

    HTML5+CSS3+JS小實例:具有粘性重力的磨砂玻璃導航欄

    實例:具有粘性重力的磨砂玻璃導航欄 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width…

    NodeJS全棧WEB3面試題——P8項目實戰類問題(偏全棧)

    &#x1f4e6; 8.1 請描述你做過的 Web3 項目&#xff0c;具體技術棧和你負責的模塊&#xff1f; 我主導開發過一個基于 NFT 的數字紀念平臺&#xff0c;用戶可以上傳照片并生成獨特的紀念 NFT&#xff0c;結合 IPFS 和 ERC-721 實現永存上鏈。 &#x1f527; 技術棧&#xf…