輪廓屬性
二值圖像分析最常見的一個(gè)主要方式就是輪廓發(fā)現(xiàn)與輪廓分析,其中輪廓發(fā)現(xiàn)的目的是為輪廓分析做準(zhǔn)備,經(jīng)過輪廓分析我們可以得到輪廓各種有用的屬性信息、常見的如下:
輪廓面積
輪廓周長
輪廓幾何矩
輪廓的最小外接矩形
輪廓的最大外接矩形
輪廓的最小外接圓
輪廓的最小外接三角形
輪廓擬合(支持?jǐn)M合直線、橢圓、圓)
輪廓的凸包
輪廓層次信息提取
多邊形逼近
計(jì)算歐拉數(shù)
函數(shù)介紹
OpenCV中提供大量輪廓分析函數(shù),通過這些函數(shù)我們可以方便快捷的得到輪廓的各種有用屬性信息、高效完成各種二值圖像分析需求,下面是我總結(jié)的一些常用的函數(shù)列表與說明。
OpenCV中輪廓發(fā)現(xiàn)函數(shù)如下:
voidcv::findContours( InputArrayimage, OutputArrayOfArrayscontours, OutputArrayhierarchy, intmode, intmethod, Pointoffset=Point() )
參數(shù)解釋如下:
image: 輸入圖像、八位單通道的,背景為黑色
contours: 得到的輪廓圖像
hierarchy: 層次圖像,根據(jù)需要提取輪廓層次信息
mode: 決定提取到層次信息內(nèi)容,是多層還是單層
method: 每個(gè)輪廓的編碼信息
offset: 表示輪廓偏移,默認(rèn)為0
輪廓分析相關(guān)的常用函數(shù)
//計(jì)算輪廓面積 doublecv::contourArea( InputArraycontour, booloriented=false ) //計(jì)算輪廓周長 doublecv::arcLength( InputArraycurve, boolclosed ) //計(jì)算幾何矩與中心距 Momentscv::moments( InputArrayarray, boolbinaryImage=false ) //計(jì)算最小外接矩形 RotatedRectcv::minAreaRect( InputArraypoints ) //計(jì)算最大外接矩形 Rectcv::boundingRect( InputArrayarray ) //計(jì)算最小外接圓/擬合圓 voidcv::minEnclosingCircle( InputArraypoints, Point2f¢er, float&radius ) //計(jì)算最小外接三角形/擬合三角形 doublecv::minEnclosingTriangle( InputArraypoints, OutputArraytriangle ) //擬合直線 voidcv::fitLine( InputArraypoints, OutputArrayline, intdistType, doubleparam, doublereps, doubleaeps ) //擬合橢圓 RotatedRectcv::fitEllipse( InputArraypoints ) //計(jì)算凸包 voidcv::convexHull( InputArraypoints, OutputArrayhull, boolclockwise=false, boolreturnPoints=true ) //多邊形逼近-逼近真實(shí)形狀 voidcv::approxPolyDP( InputArraycurve, OutputArrayapproxCurve, doubleepsilon, boolclosed )
靈活使用上述輪廓屬性信息,可以實(shí)現(xiàn)對(duì)二值圖像的幾何形狀判別、測量、面積過濾、獲取每個(gè)對(duì)象的幾何屬性包括面積、周長、編碼點(diǎn)、形狀、層次/位置信息、歐拉數(shù)、中心位置、傾斜角度。
綜合運(yùn)用代碼演示
2020年 以前我分享過一些綜合使用的例子,列表如下(都看過你就贏了):
二值圖像分析案例精選
OpenCV二值圖像案例分析精選 | 第二期
OpenCV輪廓層次分析實(shí)現(xiàn)歐拉數(shù)計(jì)算
OpenCV尋找復(fù)雜背景下物體的輪廓
如何識(shí)別出輪廓準(zhǔn)確的長和寬
OpenCV中幾何形狀識(shí)別與測量
OpenCV中BLOB特征提取與幾何形狀分類
OpenCV直線擬合檢測
OpenCV中實(shí)現(xiàn)曲線與圓擬合
這里再分享一個(gè)硬幣計(jì)數(shù)的例子!
原圖如下:
代碼如下:
//加載圖像 Matimg=imread("D:/CoinsB.png"); imshow("OriginalImage",img); //閾值化操作 Matgray,binary; cvtColor(img,gray,COLOR_BGR2GRAY); floatt=threshold(gray,binary,0,255,THRESH_BINARY|THRESH_OTSU); imshow("binary",binary); imwrite("D:/binary1.png",binary); //形態(tài)學(xué)操作 Matse=getStructuringElement(MORPH_RECT,Size(3,3)); morphologyEx(binary,binary,MORPH_OPEN,se,Point(-1,-1)); //輪廓發(fā)現(xiàn) vectorhireachy; vector >contours; bitwise_not(binary,binary); findContours(binary,contours,hireachy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point()); Matresult=img.clone(); Point2fcenter; floatradius; //輪廓分析 for(size_tt=0;t
審核編輯:彭靜
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62618 -
二值圖像
+關(guān)注
關(guān)注
0文章
14瀏覽量
8735 -
輪廓分析
+關(guān)注
關(guān)注
0文章
2瀏覽量
6098
原文標(biāo)題:OpenCV | 二值圖像分析的技巧都在這里
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論