一、Harris角点检测
- 基本原理
人眼对角点的识别常在一个局部小区域完成,这个区域内的像素的灰度积分为判断标准。
灰度变化平缓区域,窗口内像素灰度积分近似保持不变: Flat
边缘区域,仅沿边缘方向,灰度积分近似不变,沿其余任意方向,均剧烈变化: Edge
角点处,沿任意方向移动,灰度积分均会剧烈变化: Corner
灰度积分变化E(u,v)当u,v很小时经过推导得:
M为海森矩阵,M存在着两个特征值,由于E为常数时,第一个式子近似为椭圆,而M的两个特征值的导数的平方根为半长轴和半短轴,决定了椭圆的扁率和尺寸,进而:
边缘:一个特征值大,另一个特征值小->自相关函数值在某一方向上大,在其他方向上小
平面:两个特征值都小,且近似相等->自相关函数数值在各个方向上都小
角点:两个特征值都大,且近似相等->自相关函数在所有方向都增大
实际不必求这两个特征值,可以使用角点响应函数R:
其中k=0.04~0.06,为经验常数,判断依据如下:
边缘:R<0
平面:R>0
角点:|R|小
- 测试代码
import cv2
import numpy as np
img=cv2.imread('har.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray=np.float32(gray)
dst=cv2.cornerHarris(gray,2,3,0.04)#角点检测
dst = cv2.dilate(dst,None)#膨胀,提升后续图像角点标注的清晰准确度
cv2.imshow('img',img)
img[dst>0.01*dst.max()]=[0,0,255]#设定一个阈值,当大于这个阈值分数的都可以判定为角点
while True:
cv2.imshow('corners',img)
if cv2.waitKey(50) & 0xff ==ord('q'):