1. 角点定义
角点检测又称为特征点检测,是图像处理和计算机视觉中用来获取局部特征点的一类方法,广泛应用于运动检测、图像匹配、视频跟踪等领域。角点可以简单地定义为轮廓之间的交点,严格地定义是在两个主方向上的特征点,即在两个方向上灰度变化剧烈。通常具有以下特征:
角点附近的像素点不论在梯度方向上还是梯度幅值上都存在着较大的变化
对于某一场景,当视角发生变化时,其任具备稳定性质的特征
2.算法原理
角点检测的基本思想就是用固定窗口在图像上沿各个方向进行滑动,比较滑动前后窗口中像素点的灰度变化,如果在任意方向上滑动窗口内都存在较大的灰度变化,则认为该窗口中存在角点;如果任何方向上都不变化,则是均匀区域;如果灰度只在一个方向上变化,则可能是图像边缘。
可以通过下面这张图来解释
- 左图表示一个平坦区域,在各方向移动,窗口内像素值均没有太大变化;
- 中图表示一个边缘特征,如果沿着水平方向移动(梯度方向),像素值会发生跳变;如果沿着边缘移动(平行于边缘) ,像素值不会发生变化;
- 右图表示一个角,不管你把它朝哪个方向移动,像素值都会发生很大变化。
3.算法流程
- 滤波、平滑,避免出现阶跃函数。
- 计算图像梯度。
- 计算每个像素位置的Harris矩阵M。
- 计算每个像素位置的角点响应函数R。
- 设置门限R,寻找响应函数的局部最大值(非最大抑制)。
4.算法实现
函数原型:cv2.
cornerHarris(src, blockSize, ksize, k, dst=None, borderType=None):
参数说明:
src: 输入图像,须为float型的单通道8位图像
blockSize: 邻域大小,即滑动窗口的尺寸
ksize: Sobel求导中使用的窗口大小,注意必须为奇数
k: Harris角点检测方程中的自由参数
import cv2
img = cv2.imread('E:\picture\car.png')
print ('img.shape:',img.shape)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
print ('dst.shape:',dst.shape)
img[dst>0.01*dst.max()]=[0,0,255]#阈值 为Red
cv2.imshow('dst',img)
cv2.waitKey()
cv2.destroyAllWindows()