文章目錄
- 引言
- 1. Harris角點檢測原理
- 1.1 什么是角點?
- 1.2 Harris算法的核心思想
- 1.3 角點、邊緣和平坦區域的區分
- 2. OpenCV實現Harris角點檢測
- 3. 總結
引言
在計算機視覺和圖像處理中,特征點檢測(Feature Detection)是一個關鍵任務,用于識別圖像中的顯著區域(如角點、邊緣等)。Harris角點檢測(Harris Corner Detection)是一種經典的特征點檢測算法,由Chris Harris和Mike Stephens在1988年提出。它廣泛應用于圖像匹配、目標跟蹤、三維重建等領域。
1. Harris角點檢測原理
1.1 什么是角點?
角點(Corner)是圖像中兩個邊緣的交點,具有以下特點:
- 在多個方向上灰度變化明顯(與平坦區域和邊緣不同)。
- 對旋轉、光照變化具有一定魯棒性。
1.2 Harris算法的核心思想
Harris角點檢測基于局部窗口的灰度變化來判斷是否為角點。具體步驟:
-
計算圖像梯度(使用Sobel算子求 Ix和 Iy。
-
構建結構張量(Structure Tensor):
-
計算角點響應函數(Harris Response):
其中:
- det(M) = θ1 θ2(特征值的乘積)
- trace(M) = θ1+θ2(特征值的和)
- K 是經驗常數(通常取0.04~0.06)
-
篩選角點:設定閾值,保留 (R) 較大的點。
1.3 角點、邊緣和平坦區域的區分
- 角點:(R) 值大,θ1和θ2都較大。
- 邊緣:(R) 值小,θ1 >> θ2或反之。
- 平坦區域:(R) 值接近0,θ1 和 θ2 都小。
2. OpenCV實現Harris角點檢測
OpenCV提供了 cv2.cornerHarris() 函數,可以直接使用:
import cv2img = cv2.imread('huanghelou.png')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = cv2.cornerHarris(gray,blockSize=2, ksize=3, k=0.04)
# 標記檢測到的角點
img[dst > 0.01 * dst.max()] = [0,255,0]
# 這里通過對角點響應進行閾值處理,標記出檢測到的角點
# 0.05 * dst.max() 是一個閾值,大于這個值的像素點會被標記為紅色
cv2.imshow('img',img)
cv2.waitKey(0)
參數說明:
- blockSize:計算局部窗口大小(通常取2~5)。
- ksize:Sobel算子的孔徑(通常取3)。
- k:Harris響應函數中的經驗常數(0.04~0.06)。
3. 總結
- Harris角點檢測 是一種經典的特征點檢測方法,適用于角點明顯的場景。
- OpenCV實現簡單,但需調整參數(blockSize、k等)以獲得最佳效果。
- 改進方法:亞像素優化、Shi-Tomasi算法可提高精度。
- 應用廣泛:相機標定、SLAM、圖像匹配等。
希望這篇博客對你有所幫助!如果有問題,歡迎留言討論。 🚀