【第18節(jié)】OpenCV圖片輪廓特征
目標(biāo)
查找輪廓的不同特征,例如面積、周長(zhǎng)、中心、邊界框等
你會(huì)學(xué)到很多輪廓相關(guān)函數(shù)
1、矩
????????圖像的矩可以幫助我們計(jì)算圖像的質(zhì)心、面積等。
函數(shù)CV2.moments()會(huì)將計(jì)算得到的矩以一個(gè)字典的形式返回。
根據(jù)這些矩的值,我們可以計(jì)算出對(duì)象的重心:
2、輪廓面積
????????輪廓的面積可以使用函數(shù)CV2.contourArea()計(jì)算得到,也可以使用矩(0階矩),M[‘m00’]。
3、輪廓周長(zhǎng)
????????也被稱為弧長(zhǎng)??梢允褂煤瘮?shù)CV2.arcLength()計(jì)算得到。這個(gè)函數(shù)的第二參數(shù)可以用來(lái)指定對(duì)象的形狀是閉合的(True),還是打開(kāi)的(一條曲線)。
4、輪廓近似
????????將輪廓形狀近似到另外一種由更少點(diǎn)組成的輪廓形狀,新輪廓的點(diǎn)的數(shù)目由我們?cè)O(shè)定的準(zhǔn)確度來(lái)決定。為了幫助理解,假設(shè)我們要在一幅圖像中查找一個(gè)矩形,但是由于圖像的
種種原因,我們不能得到一個(gè)完美的矩形,而是一個(gè)“壞形狀"(如下圖所示)?,F(xiàn)在你就可以使用這個(gè)函數(shù)來(lái)近似這個(gè)形狀()了。這個(gè)函數(shù)的第二個(gè)參數(shù)叫epsilon,它是從原始輪廓到近似輪廓的最大距離。它是一個(gè)準(zhǔn)確度參數(shù)。選擇一個(gè)好的epsilon對(duì)于得到滿意結(jié)果非常重要。
下邊,第二幅圖中的綠線是當(dāng) epsilon = 10% 時(shí)得到的近似輪廓,第三幅圖是當(dāng) epsilon = 1% 時(shí)得到的近似輪廓。第三個(gè)參數(shù)設(shè)定弧線是否閉合。

5、凸包
????????凸包與輪廓近似相似,但不同,雖然有些情況下它們給出的結(jié)果是一樣的。函數(shù)CV2.convexHullO可以用來(lái)檢測(cè)一個(gè)曲線是否具有凸性缺陷,并能糾正缺陷。一般來(lái)說(shuō),凸性曲線總是凸出來(lái)的,至少是平的。如果有地方凹進(jìn)去了就被叫做凸性缺陷。例如下圖中的手。紅色曲線顯示了手的凸包,凸性缺陷被雙箭頭標(biāo)出來(lái)了。

函數(shù)原型:
參數(shù):
points我們要傳入的輪廓
hull輸出,通常不需要
clockwise方向標(biāo)志,如果設(shè)置為True,輸出的凸包是順時(shí)針?lè)较虻?,否則為逆時(shí)針?lè)较颉?/p>
returnPoints默認(rèn)值為True。它會(huì)返回凸包上點(diǎn)的坐標(biāo),如果設(shè)置為False,就會(huì)返回與凸包點(diǎn)對(duì)應(yīng)的輪廓上的點(diǎn)。
????????要獲得上圖的凸包,可以用下面命令:
????????但是如果你想獲得凸性缺陷,需要把returnPoints設(shè)置為False。以上面矩形為例,首先我們找到他的輪廓從cnt?,F(xiàn)在把returnPoints設(shè)置為True查找凸包,得到的就是矩形的四個(gè)角點(diǎn)。把returnPoints設(shè)置為False,得到的是輪廓點(diǎn)的索引。
6、凸性檢測(cè)
????????函數(shù)CV2.isContourConvex()可以檢測(cè)一個(gè)曲線是不是凸的。它只能返回True或者False。
7、邊界矩形
直邊界矩形,一個(gè)直矩形,沒(méi)有旋轉(zhuǎn)。不會(huì)考慮對(duì)象是否旋轉(zhuǎn)。所以邊界矩形的面積不是最小的??梢允褂煤瘮?shù)CV2.boundingRect()查找得到。
(x,y)為矩形左上角的坐標(biāo),(w,h)是矩形的寬和高
旋轉(zhuǎn)的邊界矩形,這個(gè)邊界矩形是面積最小的,因?yàn)樗紤]了對(duì)象的旋轉(zhuǎn)。用函數(shù)CV2.minAreaRect()。返回的是一個(gè)Box2D結(jié)構(gòu),其中包含矩形最上角角點(diǎn)坐標(biāo)(x,y)矩形的寬和高(w,h)以及旋轉(zhuǎn)角度。但是要繪制這個(gè)矩形需要矩形的4個(gè)角點(diǎn),可以通過(guò)函數(shù)CV2.boxPoints()獲得。
其中綠色的為直矩形,紅色為旋轉(zhuǎn)矩形。
