天天看點

OpenCV模闆比對和輪廓處理

1.模闆比對(Template Match)

(1)模闆比對介紹

模闆比對就是在整個圖像區域發現與給定子圖像比對的小塊區域,是以模闆比對首先需要一個模闆圖像T(給定的子圖像)

另外需要一個待檢測的圖像-源圖像S

工作方法,在帶檢測圖像上,從左到右,從上到下計算模闆圖像與重疊子圖像的比對度,比對程度越大,倆者相同的可能性越大

模闆比對介紹——比對算法介紹

計算(歸一化)平方不同

計算(歸一化)相關性

計算(歸一化)相關系數

(2)相關API介紹(cv::matchTemplate)

MatchTemplate(inputArray          image,//源圖像,必須是8-bit或者32-bit浮點數圖像

                          inputArray         image,//模闆圖像,類型與輸入圖像一緻

                          outputarray       result,//輸出結果,必須是單通道32位浮點數,假設源圖像wxh,模闆圖像Wxh,則結果必須為W-w+1,H-h+1的大小

                          int                     method,//使用的比對方法

                          inputarray        masknoarray()//(optional))

比對方法:

TM_SQDIFF=0,

TM_SQDIFF_NORMEO=1,

TM_CCORR=2,

TM_CCORR_NORMEO=3,

TM_CCOEFF=4,

TM_CCOEFF_NORMEO=5

2.輪廓發現(find contour)

(1)輪廓發現

輪廓發現是基于圖像邊緣提取的基礎尋找對象輪廓的方法。是以邊緣提取的門檻值標明會影響最終輪廓發現結果。

(2)API介紹

FindContours發現輪廓

DrawContours繪制輪廓

在二值圖像上發現輪廓使用API          

cv::findContours(inputOutArray      bining,//輸入圖像,非0的像素被看成1,0的像素值保持不變,8-bit

                           OutputArray         contours,//全部發現的輪廓對象

                           OutputArray         hierarchy//圖該的拓撲結構,可選,該輪廓發現算法正是基于圖像拓撲結構實作

                           Int                        mode,//輪廓傳回的方式

                           Int                       method,//發現方式

                           Point                   offset=Point()//輪廓像素的位移,預設(0,0)沒有位移)

對發現的輪廓資料進行繪制顯示

OpenCV模闆比對和輪廓處理
OpenCV模闆比對和輪廓處理

drawContours(inputoutarray          binimg,//輸出圖像

                       Outputarray            contours,//全部發現的輪廓圖像

                       Int                           contourldx//輪廓索引号

                      Const                      Scalar&color,//繪制時候顔色

                      Int                            thickness,//繪制線寬

                      Int                            lineType,//線的類型LINE_8

                      Inputarray                hierarchy,//拓撲結構圖

                      Int                            maxlevel,//最大層數,0隻會繪制目前的,1表示繪制目前及其内嵌的輪廓

                     Point                        offset=Point()//輪廓位移,可選)

(3)實作步驟:

  1. 輸入圖像轉為灰階圖像cvtColor
  2. 使用Canny進行邊緣提取,得到二值圖像
  3. 使用findContours尋找輪廓
  4. 使用drawContours繪制輪廓

3.凸包——Convex Hull

(1)概念介紹

什麼是凸包,在一個多變形邊緣或者内部任意倆個點的連線都包含在多邊形邊界或者内部

正式定義:包含點集合S中所有點的最小凸多邊形稱為凸包

(2)檢測算法:Graham掃描法

首先選擇Y方向最低的點作為起始點p0

從p0開始極坐标掃描,依次添加p1…pn(排序順序是根據極坐标的角度大小,逆時針方向)

對每個pi來說,如果添加pi點到凸包中導緻一個左轉向(逆時針方法)則添加該點到凸包,反之如果導緻一個右轉向(順時針方向)删除該點從凸包中

(3)API說明cv::convexHull

ConvexHull(inputArray             points,//輸入候選點,來自findContours

                   outputArray            hull,//凸包

                   bool                        clockwise,//default true,順時針方向

                   bool                        returnPoints)//true表示傳回點個數,如果第二個參數是vector<point>則自動忽略

(4)實作步驟:

  1. 首先把圖像從RGB轉為灰階
  2. 然後再轉為二值圖像
  3. 在通過發現輪廓得到候選點
  4. 凸包API調用
  5. 繪制顯示

4.輪廓周圍繪制矩形框和圓形框

(1)API介紹

ApproxPolyDP(inputarray         curve,

                        Outputarray     approxCure,

                        Double     epsilon,   

                        Bool          closed)

基于RDP算法實作,目的是減少多邊形輪廓點數

(2)輪廓周圍繪制矩形——API

Cv::boundingRect(inputarray       points)得到輪廓周圍最小矩形左上交點坐标和右下交點坐标,繪制一個矩形

Cv::minAreaRect(inputarray   points)得到一個旋轉的矩形,傳回旋轉矩形

(3)輪廓周圍繪制圓和橢圓——API

Cv::minEnclosingCircle(inputarray       points,//得到最小區域圓形

                                           Point2f&         center,//圓心位置

                                           Float&            radius//圓的半徑

Cv::fitElipse(inputarray        points)得到最小橢圓

(4)實作步驟:

  1. 首先将圖像變為二值圖像
  2. 發現輪廓,找到圖像輪廓
  3. 通過相關API在輪廓點上找到最小包含矩形和圓,旋轉矩形和橢圓
  4. 繪制他們

繼續閱讀