首先,我们为什么要检测角点。一张图片有很多的特征,这些特征决定了物体。在角点处图像的梯度会有不小的变化,所以,可以用焦点作为判定的一个依据。
Harris Corner是最典型的角点检测子Corner Detector。角点经常被检测在边缘的交界处、被遮挡的边缘、纹理性很强的部分。满足这些条件一般都是稳定的、重复性比较高的点,所以实际上他们是不是角点并不重要(因为我们的目标就是找一些稳定、重复性高的点以作为特征点)。
Harris Corner基于二阶矩阵:
这个矩阵描述了局部邻域内梯度的分布情况。矩阵的两个特征值可以用来描述两个主要方向上信号的变化,因此特征值可以用来判决是否为特征点。Harris采用的判别方法是:
显而易见,cornerness的值越大,对应的两个特征值都应该很大,其中λ取0.04,是为了抑制比较明显的直线。最后对整幅图像得到的cornerness做一个非极大抑制,得到最后的特征点。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()