最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV實現輪廓檢測與繪制

 更新時間:2021年06月23日 09:59:31   作者:我有一個夢想  
這篇文章主要為大家詳細介紹了OpenCV實現輪廓檢測與繪制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

圖像的輪廓不僅能夠提供物體的邊緣,而且還能提供物體邊緣之間的層次關系以及拓撲關系。

帶有結構關系的邊緣檢測,這種結構關系可以表明圖像中連通域或者某些區(qū)域之間的關系。

圖為一個具有4個不連通邊緣的二值化圖像,由外到內依次為0號、1號、2號、3號條邊緣。為了描述不同輪廓之間的結構關系,定義由外到內的輪廓級別越來越低,也就是高一層級的輪廓包圍著較低層級的輪廓,被同一個輪廓包圍的多個不互相包含的輪廓是同一層級輪廓。例如在圖中,0號輪廓層級比1號和第2號輪廓的層及都要高,2號輪廓包圍著3號輪廓,因此2號輪廓的層級要高于3號輪廓。

常用4個參數來描述不同層級之間的結構關系:同層下一個輪廓索引、同層上一個輪廓索引、下一層第一個子輪廓索引上層父輪廓索引。

上圖中0號輪廓沒有同級輪廓和父輪廓需要用-1表示,其第一個子輪廓為1號輪廓,因此可以用描述該輪廓的結構。1號輪廓的下一個同級輪廓為2號輪廓但是沒有上一個同級輪廓用-1表示,父輪廓為0號輪廓,第一個子輪廓為3號輪廓,因此可以用描述該輪廓結構。2號輪廓和3號輪廓同樣可以用這樣的方式構建結構關系描述子。圖中不同輪廓之間的層級關系可以用圖表示。

在二值圖像中檢測圖像中所有輪廓并生成不同輪廓結構關系描述子:

void findContours( InputOutputArray image, OutputArrayOfArrays contours,
                              OutputArray hierarchy, int mode,
                              int method, Point offset = Point());
  • image:輸入圖像,數據類型為CV_8U的單通道灰度圖像或者二值化圖像。
  • contours:檢測到的輪廓,每個輪廓中存放著像素的坐標。
  • hierarchy:輪廓結構關系描述向量。
  • mode:輪廓檢測模式標志,可以選擇的參數在表7-2給出。
  • method:輪廓逼近方法標志,可以選擇的參數在表7-3給出。
  • offset:每個輪廓點移動的可選偏移量。這個參數主要用在從ROI圖像中找出輪廓并基于整個圖像分析輪廓的場景中。

該函數主要用于檢測圖像中的輪廓信息,并輸出各個輪廓之間的結構信息。

函數的第一個參數是待檢測輪廓的輸入圖像,從理論上講檢測圖像輪廓需要是二值化圖像,但是該函數會對非0像素視為1,0像素保持不變,因此該參數能夠接受非二值化的灰度圖像。由于該函數默認二值化操作不能保持圖像主要的內容,因此常需要對圖像進行預處理,利用threshold()函數或者adaptiveThreshold()函數根據需求進行二值化。

第二個參數用于存放檢測到的輪廓,數據類型為vector,每個輪廓中存放著屬于該輪廓的像素坐標。
函數的第三個參數用于存放各個輪廓之間的結構信息,數據類型為vector,數據的尺寸與檢測到的輪廓數目相同,每個輪廓結構信息中第1個數據表示同層下一個輪廓索引、第2個數據表示同層上一個輪廓索引、第3個數據表示下一層第一個子輪廓索引、第4個數據表示上層父輪廓索引。

函數第四個參數是輪廓檢測模式的標志,可以選擇的參數及含義在表7-2給出。
函數第五個參數是選擇輪廓逼近方法的標志,可以選擇的參數及含義在表7-3給出。
函數最后一個參數是每個輪廓點移動的可選偏移量。這個函數主要用在從ROI圖像中找出輪廓并基于整個圖像分析輪廓的場景中。

只需要檢測圖像的輪廓,并不關心輪廓之間的結構關系信息

void findContours( InputOutputArray image, OutputArrayOfArrays contours,
                              int mode, int method, Point offset = Point());
  • image:輸入圖像,數據類型為CV_8U的單通道灰度圖像或者二值化圖像。
  • contours:檢測到的輪廓,每個輪廓中存放著像素的坐標。
  • mode:輪廓檢測模式標志,可以選擇的參數在表7-2給出。
  • method:輪廓逼近方法標志,可以選擇的參數在表7-3給出。
  • offset:每個輪廓點移動的可選偏移量。這個函數主要用在從ROI圖像中找出輪廓并基于整個圖像分析輪廓的場景中。

繪制輪廓函數:

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:要繪制的輪廓的數目,如果是負數,則繪制所有的輪廓。
  • color:繪制輪廓的顏色。
  • thickness:繪制輪廓的線條粗細,如果參數為負數,則繪制輪廓的內部,默認參數值為1.
  • lineType:邊界線連接的類型,可以選擇參數在表7-4給出,默認參數值為LINE_8。
  • hierarchy:可選的結構關系信息,默認值為noArray()。
  • maxLevel:表示用于繪制輪廓的最大等級,默認值為INT_MAX。
  • offset:可選的輪廓偏移參數,按指定的移動距離繪制所有的輪廓。

該函數用于繪制findContours()函數檢測到的圖像輪廓。
函數的第一個參數為繪制輪廓的圖像,根據需求該參數可以是單通道的灰度圖像或者三通道的彩色圖像。
第二個參數是所有將要繪制的輪廓,數據類型為vector。
第三個參數是要繪制的輪廓數目,該參數的數值與第二個參數相對應,應小于所有輪廓的數目,如果該參數值為負數,則繪制所有的輪廓。
第四個參數是繪制輪廓的顏色,對于單通道的灰度圖像用Scalar(x)賦值,對于三通道的彩色圖像用Scalar(x,y,z)賦值。
第五個參數是邊界線的連接類型,可以選擇的參數在表7-4給出,默認參數值為LINE_8。
第六個參數是可選的結構關系信息,默認值為noArray()。
第七個參數表示繪制輪廓的最大等級,參數值如果為0,則僅繪制指定的輪廓;如果為1,則該函數繪制輪廓和所有嵌套輪廓;如果為2,則該函數繪制輪廓以及所有嵌套輪廓和所有嵌套到嵌套輪廓的輪廓,以此類推,默認值為INT_MAX。函數最后一個參數是可選的輪廓偏移參數,按指定的移動距離繪制所有的輪廓。

簡單示例

//
// Created by smallflyfly on 2021/6/22.
//
 
#include "opencv2/opencv.hpp"
#include <iostream>
 
using namespace std;
using namespace cv;
 
int main() {
    Mat im = imread("rice.jfif");
    resize(im, im, Size(0, 0), 0.5, 0.5);
    Mat gray;
    cvtColor(im, gray, CV_BGR2GRAY);
 
    Mat imBin;
    threshold(gray, imBin, 125, 255,THRESH_BINARY);
 
    vector<vector<Point>> contours;
    findContours(imBin, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    vector<Vec4i> hierarchy;
    findContours(imBin, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);
 
    drawContours(im, contours, -1, Scalar(0, 0, 255));
 
    for (auto & i : hierarchy) {
        cout << i << endl;
    }
 
    imshow("im", im);
 
    waitKey(0);
    destroyAllWindows();
 
    return 0;
 
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C語言進階之內存操作函數詳解

    C語言進階之內存操作函數詳解

    這篇文章主要為大家學習介紹了C語言中內存操作函數(memcpy、memmove和memcmp)的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-07-07
  • 利用C++實現獲取文件夾下所有文件名

    利用C++實現獲取文件夾下所有文件名

    這篇文章主要為大家詳細介紹了如何利用C++實現獲取文件夾下所有文件名,文中的示例代碼講解詳細,對我們學習C++有一定幫助,需要的可以參考一下
    2022-09-09
  • C語言近萬字為你講透棧和隊列

    C語言近萬字為你講透棧和隊列

    對于線性表,我們可能要執(zhí)行下列操作:訪問表的第k個結點、在k這個結點之前或者之后插入一個新結點,抑或是刪除第k個結點等等操作,其中我們會遇到值對第一個或者最后一個結點插入、刪除、和訪問值的線性表,我們給它們以特殊的名稱:棧、隊列、雙端隊列
    2022-05-05
  • C語言單鏈表實現學生管理系統

    C語言單鏈表實現學生管理系統

    這篇文章主要為大家詳細介紹了C語言單鏈表實現學生管理系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++ 之explicit關鍵字

    C++ 之explicit關鍵字

    今天我們來談談C++中的explicit關鍵字,這篇文章詳細介紹了C語言的關鍵字explicit關鍵字,本文有詳細的代碼實例,感興趣的同學可以借鑒參考
    2023-04-04
  • 詳解C++實現拓撲排序算法

    詳解C++實現拓撲排序算法

    拓撲排序是對一個有向無環(huán)圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u在線性序列中出現在v之前。本文將對其原理進行講解,并且用C++進行實現
    2021-06-06
  • Visual?Studio?2019?Qt?QML?項目環(huán)境搭建常見問題處理

    Visual?Studio?2019?Qt?QML?項目環(huán)境搭建常見問題處理

    本文主要介紹了Visual?Studio?2019?Qt?QML?項目環(huán)境搭建常見問題處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • C++構造和解析Json的使用示例

    C++構造和解析Json的使用示例

    今天小編就為大家分享一篇關于C++構造和解析Json的使用示例,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++中的繼承問題(繼承基本概念、菱形虛擬繼承的對象模型)

    C++中的繼承問題(繼承基本概念、菱形虛擬繼承的對象模型)

    這篇文章主要介紹了C++中的繼承問題(繼承基本概念、菱形虛擬繼承的對象模型),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言鏈表實現商品庫存管理系統

    C語言鏈表實現商品庫存管理系統

    這篇文章主要為大家詳細介紹了C語言鏈表實現商品庫存管理系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

蒙山县| 临朐县| 武定县| 洛阳市| 离岛区| 北票市| 九龙城区| 台南市| 古交市| 托里县| 棋牌| 临江市| 威宁| 射洪县| 大厂| 大埔县| 兴宁市| 漠河县| 镇康县| 当雄县| 闽清县| 正蓝旗| 酉阳| 长垣县| 柘城县| 明光市| 汉中市| 白朗县| 浏阳市| 三明市| 贞丰县| 南乐县| 那曲县| 定兴县| 景洪市| 房山区| 泰安市| 台安县| 礼泉县| 棋牌| 黑龙江省|