Programming 4

Harris Corner Detection

Goal

作業環境

硬體規格:

CUP:12th Gen Intel(R) Core(TM) i5-12400   2.50 GHz

RAM:32G

 

軟體規格:

作業系統:Windows 10 專業版

C++ IDE:Visual Studio Community 2022 (64 位元) 版本 17.5.1

OpenCV:4.7.0/vc16

初始設定



主程式



CommandLineParser 是 OpenCV 提供的一個類別,可以用來解析命令列參數。 

createTrackbar 是 OpenCV 中用來創建一個滑動條的函數,用於在視窗中調整某個變量的值,通常應用在圖像處理中對閥值或者其他參數進行調節。

cornerHarris_demo函式

主程式執行

調整Thresh,降低最後被視為角點的最低閥值。(直接顯示於原圖,並且改為紅圈,比較好觀察)

調整blocksize(將Thresh固定在150較好觀察)

調整ksize

調整經驗參數k

For the Matlab code 

FilterSize: 3,kernel大小為3。

K: 0.04,Harris角點響應中的 k 值為0.04。

NumOctaves: 1,金字塔的層數為1。

ROI:整個圖像,不設定感興趣區域。

MinQuality: 0.01,角點最小品質為0.01。

FilterCoefficients:濾波器係數,自動計算。

代碼段解釋

points 中得到所有角點的座標,儲存在 centers 中。

使用 repmat 函數將半徑設為 5,存在 radii 中。

使用 viscircles 函數在影像上繪製紅色圓圈,以標示出所有角點的位置。 

接著設定了 MinQuality 值從原本的默認 0.01 改為 0.1 和 0.5,此值在 Matlab 中指的是角點的"最低品質",類似OpenCV的閥值,在這範圍為0~1。

Matlab 和 OpenCV 結果比較

Matlab

OpenCV

結果分析

我將兩個程式碼分別調整成相近的設定,由於 Matlab 的 detectharrisfeatures 函數沒有 blockSize 參數能夠設置,以及閥值設定有所不同,造成的結果有些差異,但這也有可能是 OpenCV 的 cornerHarris 函式以 Sobel 為濾波方式,而 Matlab 的 detectharrisfeatures 則是以高斯為濾方式而成為差異的因素

而另外,在觀察完所有結果時發現此實驗的正確性似乎不夠高,在許多應該為明顯角點的地方並未偵測出來,這或許是我挑選了一張不適合進行此實驗的影像,由於影像中的雜訊和細節太多了,導致正確性降低。