最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【第19節(jié)】OpenCV的層次結(jié)構(gòu)

2022-11-28 11:59 作者:海鷗之道  | 我要投稿

目標(biāo)

????現(xiàn)在我們要學(xué)習(xí)輪廓的層次結(jié)構(gòu)了,比如輪廓之間的父子關(guān)系。

原理

????????在前面的內(nèi)容中我們使用函數(shù)CV2.findContours來(lái)查找輪廓,我們需要傳入一個(gè)參數(shù):輪廓提取模式( Contour_ Retrieval Mode )。我們總是把它設(shè)置為CV2.RETR_ LIST或者是CV2.RETR_ _TREE,效果還可以。但是它們到底代表什么呢?

????????同時(shí),我們得到的結(jié)果包含3個(gè)數(shù)組,第一個(gè)圖像,第二個(gè)是輪廓,第三E

個(gè)是層次結(jié)構(gòu)。但是我們從來(lái)沒(méi)有用過(guò)層次結(jié)構(gòu)。層次結(jié)構(gòu)是用來(lái)干嘛的呢?

層次結(jié)構(gòu)與輪廓提取模式有什么關(guān)系呢?

????????這就是我們本節(jié)要講的。

1、什么是層次結(jié)構(gòu)

????????通常我們使用函數(shù)CV2.findContours在圖片中查找一個(gè)對(duì)象。有時(shí)對(duì)象可能位于不同的位置。還有些情況,一個(gè)形狀在另外-個(gè)形狀的內(nèi)部。這種情況下我們稱外部的形狀為父,內(nèi)部的形狀為子。按照這種方式分類,一幅圖像中的所有輪廓之間就建立父子關(guān)系。這樣我們就可以確定-個(gè)輪廓與其他輪廓是怎樣連接的,比如它是不是某個(gè)輪廓的子輪廓,或者是父輪廓。這種關(guān)系就成為組織結(jié)構(gòu)

????????下圖就是一個(gè)簡(jiǎn)單的例子:

????????在這幅圖像中,我給這幾個(gè)形狀編號(hào)為0-5。2和2a分別代表最外邊矩形.

的外輪廓和內(nèi)輪廓。

????????在這里邊輪廓0,1, 2在外部或最外邊。我們可以稱他們?yōu)?組織結(jié)構(gòu))

0級(jí),簡(jiǎn)單來(lái)說(shuō)就是他們屬于同一級(jí)。

????????接下來(lái)輪廓2a。我們把它當(dāng)成輪廓2的子輪廓。它就成為(組織結(jié)構(gòu))第1級(jí)。同樣輪廓3是輪廓2的子輪廓,成為(組織結(jié)構(gòu))第3級(jí)。最后輪廓4,5是輪廓3a的子輪廓,成為(組織結(jié)構(gòu))4級(jí)(最后一級(jí))。按照這種方式給這些形狀編號(hào),我們可以說(shuō)輪廓4是輪廓3a的子輪廓(當(dāng)然輪廓5也是)。

????????我說(shuō)這么多就是為了解釋層次結(jié)構(gòu),外輪廓,子輪廓,父輪廓,子輪廓等。

現(xiàn)在讓我們進(jìn)入OpenCV吧。

2、OpenCV中層次結(jié)構(gòu)

????????不管層次結(jié)構(gòu)是什么樣的,每一個(gè)輪廓都包含自己的信息:誰(shuí)是父,誰(shuí)是子等。OpenCV使用一個(gè)含有四個(gè)元素的數(shù)組表示。[Next, Previous,First_ Child, Parent]。

????????Next表示同一級(jí)組織結(jié)構(gòu)中的下一個(gè)輪廓。

????????以上圖中的輪廓0為例,輪廓1就是他的Next。同樣,輪廓1的Next是2, Next=2。那輪廓2呢?在同一級(jí)沒(méi)有Next。這時(shí)Next=-1。而輪廓4的Next為5,所以它的Next=5。

????????Previous表示同一級(jí)結(jié)構(gòu)中的前一個(gè)輪廓。與前面一樣,輪廓1的Previous為輪廓0,輪廓2的Previous為輪廓1。輪廓0沒(méi)有Previous,所以Previous=-1。

????????First Child表示它的第一個(gè)子輪廓。

????????沒(méi)有必要再解釋了,輪廓2的子輪廓為2a。所以它的First_ _Child 為2a。那輪廓3a呢?它有兩個(gè)子輪廓。但是我們只要第一個(gè)子輪廓,所以是輪廓4 (按照從上往下,從左往右的順序排序)。

????????Parent表示它的父輪廓。

????????與First_ _Child剛好相反。輪廓4和5的父輪廓是輪廓3a。而輪廓3a的父輪廓是3。

注意:如果沒(méi)有父或者子,值為-1。

????????現(xiàn)在我們了解了OpenCV中的輪廓組織結(jié)構(gòu)。我們還是根據(jù)上邊的圖片再學(xué)習(xí)一下OpenCV中的輪廓檢索模式。

????????CV2.RETR_ LIST,CV2.RETR _TREE,CV2.RETR_ CCOMP,CV2.RETR_ EXTERNAL

到底代表什么意思?

3、輪廓檢索模式

????????RETR_ LIST從解釋的角度來(lái)看,這中應(yīng)是最簡(jiǎn)單的。它只是提取所有的輪廓,而不去創(chuàng)建任何父子關(guān)系。換句話說(shuō)就是“人人平等",它們屬于同一級(jí)組織輪廓。

????????所以在這種情況下,組織結(jié)構(gòu)數(shù)組的第三和第四個(gè)數(shù)都是-1。但是,很明顯,Next和Previous要有對(duì)應(yīng)的值,你可以自己試著看看。

????????下面就是我得到的結(jié)果,每一行是對(duì)應(yīng)輪廓的組織結(jié)構(gòu)細(xì)節(jié)。例如,第一行對(duì)應(yīng)的是輪廓0。下一個(gè)輪廓為1,所以Next=1。前面沒(méi)有其他輪廓,所以Previous=0。接下來(lái)的兩個(gè)參數(shù)就是-1,與剛才我們說(shuō)的一樣。

????????如果你不關(guān)心輪廓之間的關(guān)系,這是一個(gè)非常好的選擇。

RETR_ EXTERNAL如果你選擇這種模式的話,只會(huì)返回最外邊的的輪廓,所有的子輪廓都會(huì)被忽略掉。

????????所以在上圖中使用這種模式的話只會(huì)返回最外邊的輪廓(第0級(jí)):輪廓0,1, 2。下面是我選擇這種模式得到的結(jié)果:

????????當(dāng)你只想得到最外邊的輪廓時(shí),你可以選擇這種模式。這在有些情況下很有用。

RETR_CCOMP在這種模式下會(huì)返回所有的輪廓并將輪廓分為兩級(jí)組織結(jié)構(gòu)。例如,一個(gè)對(duì)象的外輪廓為第1級(jí)組織結(jié)構(gòu)。而對(duì)象內(nèi)部中空洞的輪廓為第2級(jí)組織結(jié)構(gòu),空洞中的任何對(duì)象的輪廓又是第1級(jí)組織結(jié)構(gòu)。空洞的組織結(jié)構(gòu)為第2級(jí)。

????????想象一下一副黑底白字的圖像,圖像中是數(shù)字0。0的外邊界屬于第一級(jí)組織結(jié)構(gòu),0的內(nèi)部屬于第2級(jí)組織結(jié)構(gòu)。

????????我們可以以下圖為例簡(jiǎn)單介紹一下。我們已經(jīng)用紅色數(shù)字為這些輪廓編號(hào),并用綠色數(shù)字代表它們的組織結(jié)構(gòu)。順序與OpenCV檢測(cè)輪廓的順序一直。

????????現(xiàn)在我們考慮輪廓0,它的組織結(jié)構(gòu)為第1級(jí)。其中有兩個(gè)空洞1和2,它們屬于第2級(jí)組織結(jié)構(gòu)。所以對(duì)于輪廓0來(lái)說(shuō)跟他屬于同一級(jí)組織結(jié)構(gòu)的下一個(gè) ( Next) 是輪廓3,并且沒(méi)有Previous。 它的Fist_ _Child 為輪廓1,組織結(jié)構(gòu)為2。由于它是第1級(jí),所以沒(méi)有父輪廓。因此它的組織結(jié)構(gòu)數(shù)組為[3,-1, 1, -1]。

????????現(xiàn)在是輪廓1,它是第2級(jí)。處于同一級(jí)的下一個(gè)輪廓為2。沒(méi)有Previous,也沒(méi)有Child, (因?yàn)槭堑?級(jí)所以有父輪廓)父輪廓是0。所以數(shù)組是[2,-1, -1, 0]。

????????輪廓2:它是第2級(jí)。在同一級(jí)的組織結(jié)構(gòu)中沒(méi)有Next。Previous 為輪廓1。沒(méi)有子,父輪廓為0,所以數(shù)組是[-1, 1, -1, 0]

????????輪廓.3:它是第1級(jí)。在同一級(jí)的組織結(jié)構(gòu)中Next為5。Previous為輪廓0。子為4,沒(méi)有父輪廓,所以數(shù)組是[5,0, 4, -1]

????????輪廓4:它是第2級(jí)。在同-級(jí)的組織結(jié)構(gòu)中沒(méi)有Next。沒(méi)有Previous,沒(méi)有子,父輪廓為3,所以數(shù)組是[-1, -1,-1, 3]

下面是我得到的答案:

RETR_ TREE終于到最后一個(gè)了, 也是最完美的一個(gè)。這種模式下會(huì)返回所有輪廓,并且創(chuàng)建一個(gè)完整的組織結(jié)構(gòu)列表。它甚至?xí)嬖V你誰(shuí)是爺爺,爸.爸,兒子,孫子等。

????????還是以上圖為例,使用這種模式,對(duì)OpenCV返回的結(jié)果重新排序并分析它,紅色數(shù)字是邊界的序號(hào),綠色是組織結(jié)構(gòu)。

????????輪廓0的組織結(jié)構(gòu)為0,同一級(jí)中Next為7,沒(méi)有Previous。子輪廓是1,沒(méi)有父輪廓。所以數(shù)組是[7, -1, 1, -1]。輪廓1的組織結(jié)構(gòu)為1,同一級(jí)中沒(méi)有其他,沒(méi)有Previous。子輪廓是2,父輪廓為0。所以數(shù)組是[-1, -1, 2, 0]。剩下的自己試試計(jì)算一下吧。下面是結(jié)果:














【第19節(jié)】OpenCV的層次結(jié)構(gòu)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
正阳县| 云南省| 库尔勒市| 香格里拉县| 平湖市| 平舆县| 汽车| 林芝县| 南宁市| 金溪县| 枝江市| 安达市| 方山县| 昂仁县| 都昌县| 兰坪| 常宁市| 永康市| 且末县| 宜章县| 兴城市| 永川市| 大石桥市| 柘荣县| 调兵山市| 略阳县| 鸡西市| 伊吾县| 平阳县| 齐齐哈尔市| 贡嘎县| 盘锦市| 罗田县| 蓝田县| 抚宁县| 尤溪县| 荣昌县| 洛隆县| 积石山| 新巴尔虎左旗| 天峨县|