早在 1988 年,Chris_Harris 和 Mike_Stephens在文章《A Combined Corner and Edge Detector》提出了角点检测的算法,该方法被命名为Harris角点检测。
具体原理可以参考各种文献资料,是一种很经典的算法。
个人感觉,Harris这个人真的是个天才。
Opencv中的函数 cv2.cornerHarris()用来进行角点检测,其参数说明如下所示:
img:数据类型为float32的输入图像
blockSize:角点检测过程中所使用的邻域大小(blockSize*blockSize)
ksize:sobel求导中所使用的窗口大小
k : Harris 角点检测方程中的自由参数,取值参数范围为 [0,04,0.06].
附代码如下所示:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('4.jfif') #原图为彩色图,可将第二个参数变为0,为灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04) #输入图像的数据类型必须为float32,
dst = cv2.dilate(dst,None) #放大标记角点,利于显示
img[dst>0.01*dst.max()]=[0,0,255]#最佳值的阈值选用0.01*dst.max(),可能会根据图像而有所不同。
cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
cv2.destroyAllWindows()
运行结果如下所示: