计算机视觉 (九)- 角点检测(Harris)

首先,我们为什么要检测角点。一张图片有很多的特征,这些特征决定了物体。在角点处图像的梯度会有不小的变化,所以,可以用焦点作为判定的一个依据。      

Harris Corner是最典型的角点检测子Corner Detector角点经常被检测在边缘的交界处、被遮挡的边缘、纹理性很强的部分。满足这些条件一般都是稳定的、重复性比较高的点,所以实际上他们是不是角点并不重要(因为我们的目标就是找一些稳定、重复性高的点以作为特征点)。

       Harris Corner基于二阶矩阵:

       计算机视觉 (九)- 角点检测(Harris)

        这个矩阵描述了局部邻域内梯度的分布情况。矩阵的两个特征值可以用来描述两个主要方向上信号的变化,因此特征值可以用来判决是否为特征点。Harris采用的判别方法是:

    计算机视觉 (九)- 角点检测(Harris)

       显而易见,cornerness的值越大,对应的两个特征值都应该很大,其中λ取0.04,是为了抑制比较明显的直线。最后对整幅图像得到的cornerness做一个非极大抑制,得到最后的特征点。Harris角点具有的优点是平移不变、旋转不变,能克服一定光照变化。


计算机视觉 (九)- 角点检测(Harris)

import matplotlib.pyplot as plt
import numpy as np
import cv2

img = cv2.imread('./imgs/10.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
dst = cv2.cornerHarris(gray,2,3,0.04)#使用Harris
pointdst = cv2.dilate(dst,None)

threshold = 0.1*dst.max()

for i in range(0,dst.shape[0]):
for j in range(0,dst.shape[1]):
if(dst[i,j]>threshold):
cv2.circle(img,(j,i),1,(255,0,0),2)
plt.imshow(img)
plt.show()