【第17節(jié)】OpenCV輪廓初識(shí)
目標(biāo)
1、什么是輪廓
????????輪廓可以簡(jiǎn)單認(rèn)為成將連續(xù)的點(diǎn)(連著邊界)連在- -起的曲線,具有相同的顏色或者灰度。輪廓在形狀分析和物體的檢測(cè)和識(shí)別中很有用。
為了更加準(zhǔn)確,要使用二值化圖像。在尋找輪廓之前,要進(jìn)行閾值化處理或者Canny邊界檢測(cè)。
查找輪廓的函數(shù)會(huì)修改原始圖像。如果你在找到輪廓之后還想使用原始圖像的話,你應(yīng)該將原始圖像存儲(chǔ)到其他變量中。
在OpenCV中,查找輪廓就像在黑色背景中超白色物體。你應(yīng)該記住,要找的物體應(yīng)該是白色而背景應(yīng)該是黑色。
????????讓我們看看如何在一個(gè)二值圖像中查找輪廓:
????????函數(shù)CV2.findContours() 有三個(gè)參數(shù),第一個(gè)是輸入圖像,第二個(gè)是輪廓檢索模式,第三個(gè)是輪廓近似方法。返回值有三個(gè),第一個(gè)是圖像,第二個(gè)是輪廓,第三個(gè)是(輪廓的)層析結(jié)構(gòu)。輪廓(第二個(gè)返回值)是一個(gè)Python列表,其中存儲(chǔ)這圖像中的所有輪廓。每一個(gè)輪廓都是一個(gè)Numpy數(shù)組,包含對(duì)象邊界點(diǎn)(x, y )的坐標(biāo)。
2、怎樣繪制輪廓
????????函數(shù)CV2.drawContours(可以被用來(lái)繪制輪廓。它可以根據(jù)你提供的邊界點(diǎn)繪制任何形狀。它的第一個(gè)參數(shù)輪廓,一個(gè)Python列表;第二個(gè)參數(shù)是輪廓的索引(在繪制獨(dú)立輪廓是很有用,當(dāng)設(shè)置為-1時(shí)繪制所有輪廓)。接下來(lái)的參數(shù)是輪廓的顏色和厚度等。
????????在一幅圖像.上繪制所有的輪廓:
結(jié)果:

3、輪廓的近似方法
????????這是函數(shù)CV2.findCountours()的第三個(gè)參數(shù)。它到底代表什么意思呢?
????????上邊我們已經(jīng)提到輪廓是一個(gè)形狀具有相同灰度值的邊界。它會(huì)存貯形狀邊界上所有的(x,y)坐標(biāo)。但是需要將所有的這些邊界點(diǎn)都存儲(chǔ)嗎?這就是這個(gè)參數(shù)要告訴函數(shù)CV2.findContours的。這個(gè)參數(shù)如果被設(shè)置為CV2.CHAIN APPROX NONE,所有的邊界點(diǎn)都會(huì)被存儲(chǔ)。但是我們真的需要這么多點(diǎn)嗎?例如,當(dāng)我們找的邊界是一條直線時(shí)。你用需要直線上所有的點(diǎn)來(lái)表示直線嗎?不是的,我們只需要這條直線.的兩個(gè)端點(diǎn)而已。這就是CV2.CHAIN APPROX_ SIMPLE要做的。它會(huì)將輪廓_上的冗余點(diǎn)都去掉,壓縮輪廓,從而節(jié)省內(nèi)存支。
?