角点检测是图像特征点检测的一个重要方面。对于一张图像,我们使用一个滑窗在图像某个区域热议一个方向滑动,如果滑窗内的值都发生剧烈变化的话。这个过程我们可以使用下列公式表示:
如果我们对这个公式进行泰勒展开等一系列数学变换之后呢,我们会发现我们所求的是一个响应函数和对应的值:
在这个情况下,M矩阵特征值都比较大时,即窗口中含有角点,特征值一个较大,一个较小,窗口中含有边缘,特征值都比较小,窗口处在平坦区域。那么根据这个结论,我们可以把M矩阵简化成一个响应函数:
这样,我们只要计算R便为止设置一个阈值即可。但是可能这样检测出来有很多个相邻的角点,为了找出真正的角点,我们可以用非极大值抑制来处理。
在opencv中,我们可以使用cv2.cornerHarris函数计算角点。
cv2.cornerHarris(src=gray, blockSize, ksize, k, dst=None, borderType=None)
"""
cornerHarris参数:
src - 数据类型为 float32 的输入图像。(输入单通道图)
blockSize - 角点检测中要考虑的领域大小。也就是计算协方差矩阵时的窗口大小
ksize - Sobel求导中使用的窗口大小
k - Harris 角点检测方程中的自由参数,取值参数为 [0.04,0.06].
dst - 输出图像
borderType - 边界的类型
返回:R值构成的灰度图像
"""
import cv2
import numpy as np
filename = 'line.png'
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
dst = cv2.dilate(dst, None)
img[dst > 0.01 * dst.max()] = [0, 0, 255]
cv2.imshow('img', img)
cv2.waitKey(0)
refernce:
https://blog.csdn.net/yan_520csdn/article/details/100974130