1. 程式人生 > >0037-OpenCV環境下用演算法moravec、harris、Shi-Tomasi進行角點檢測

0037-OpenCV環境下用演算法moravec、harris、Shi-Tomasi進行角點檢測

角點的定義
“如果某一點在任意方向的一個微小變動都會引起灰度很大的變化,那麼我們就把它稱之為角點”。角點一般反應的是影象中區域性最大值或最小值的孤立點,以角點為中心點的視窗向影象中的任意方向滑動,都會引起較大的灰度變化。

角點檢測(Corner Detection)是計算機視覺系統中用來獲得影象特徵的一種方法,廣泛應用於運動檢測、影象匹配、視訊跟蹤、三維建模和目標識別等領域中。

關於角點的具體描述還有以下幾種:
一階導數(即灰度的梯度)的區域性最大所對應的畫素點;
兩條及兩條以上邊緣的交點;
影象中梯度值和梯度方向的變化速率都很高的點;
角點處的一階導數最大,二階導數為零,指示物體邊緣變化不連續的方向。

本文給出在OpenCV環境下用演算法moravec、harris、Shi-Tomasi進行角點檢測的示例程式

,具體演算法的原理請大家自行查閱相關文件,這裡不講原理。

moravec角點檢測:
程式碼如下

程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取

執行結果截圖如下



harris角點檢測:
OpenCV提供了函式cornerHarris進行harris角點檢測。
函式cornerHarris()原型如下:
C++: void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType=BORDER_DEFAULT )
引數意義如下:


src:源影象,類要求是single-channel 8-bit 或 floating-point image.
dst:儲存角點檢測結果。資料型別是CV_32FC1,大小和源影象相同。
blockSize:演算法涉及到的鄰域大小。
ksize:Sobel核算子大小。
k:Harris演算法引數,具體什麼意義,請參考下面的公式。
borderType:邊界處理方法,具體的說明加Q2034196302獲取
這個函式在計算harris角點時,對於每一個畫素點(x,y),計算2×2的梯度方差矩陣M^(x,y),計算時的鄰域為blockSize×blockSize,然後通過下面的公式計算出角點

使用cornerHarris函式進行harris角點檢測的程式碼如下

程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取

執行結果截圖如下:

 

 


Shi-Tomasi角點檢測
OpenCV提供了函式goodFeaturesToTrack進行Shi-Tomasi角點檢測。
函式原型如下:
C++: void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04 )
引數意義如下:
image:源影象,影象型別為8-bit或floating-point 32-bit的單通道影象。
corners:角點檢測輸出。
maxCorners:返回的最大角點數。
qualityLevel:可接受的最少角點數的比例因子。如果檢測到角點數小於最佳角點數乘以qualityLevel的值,則結果被拒絕。比如如果最佳角點數為1500,qualityLevel=0.01,則當結果小於15時,這個結果被拒絕。
minDistance:對於初選出的角點而言,如果在其周圍minDistance範圍內存在其他更強角點,則將此角點刪除
mask:掩碼陣列。掩碼中的非0元素對應的影象元素將會被計算,0元素則被遮蔽不參與計算,可選引數。
blockSize:算協方差矩陣時的視窗大小
useHarrisDetector:是否使用Harris演算法函式或cornerMinEigenVal檢測角點。
k:Harris角點檢測需要的k值.

使用函式goodFeaturesToTrack進行Shi-Tomasi角點檢測的程式碼如下:

 

程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取

執行結果截圖如下