Harris 角点检测
角点的一个特性:向任何方向移动变化都很大。
Chris_Harris 和 Mike_Stephens 早在 1988 年的文章《A CombinedCorner and Edge Detector》中就已经提出了角点检测的方法,被称为Harris 角点检测。他把这个简单的想法转换成了数学形式。将窗口向各个方向移动(u,v)然后计算所有差异的总和。
这里就不详细给出及推出Harris角点检测的数学公式了,有兴趣可以自行查找资料进行学习。
OpenCV中的函数**cv2.cornerHarris()**可以用来进行角点检测。参数如下:
• img - 数据类型为 float32 的输入图像。
• blockSize - 角点检测中要考虑的领域大小。
• ksize - Sobel 求导中使用的窗口大小
• k - Harris 角点检测方程中的*参数,取值参数为 [0,04,0.06],这个直接用0.04或者0.06就行。
给出原图:
import cv2
import numpy as np
# 读入图片
img = cv2.imread('C:/Users/www12/Desktop/Photo/chessboard.jpg')
# 打印出图片的大小
print ('img.shape:',img.shape)
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 数字类型转化为float32
gray = np.float32(gray)
# Harris角点检测
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# 打印出检测之后差异组成的数组的大小
print ('dst.shape:',dst.shape)
# 一般不会确定一个值
# 找出大于最大差异的值的百分之一的点涂上红色
img[dst>0.01*dst.max()]=[0,0,255]
# 打印出图像
cv2.imshow('dst',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img.shape: (512, 512, 3)
dst.shape: (512, 512)
可以看见上图检测出了所有角点,但是还检测出了一些其他的点,所以可以通过不停地调参达到Harris角点检测的最好效果。
面阵摄像机的成像面以像素为最小单位。例如某CMOS摄像芯片,其像素间距为5.2微米。摄像机拍摄时,将物理世界中连续的图像进行了离散化处理。到成像面上每一个像素点只代表其附近的颜色。至于"附近"到什么程度?就很困难解释。两个像素之间有5.2微米的距离,在宏观上可以看作是连在一起的。但是在微观上,它们之间还有无限的更小的东西存在。这个更小的东西我们称它为**“亚像素”**。实际上"亚像素"应该是存在的,只是硬件上没有个细微的传感器把它检测出来。于是软件上把它近似地计算出来。
OpenCV 为我们提供了函数 cv2.cornerSubPix(),它可以提供亚像素级别的角点检测。
下面举一个例子,先找到Harris角点,然后将角点的重心传**cv2.cornerSubPix()**函数进行修正,使用这个函数的时候我们需要定义一个迭代条件,当迭代次数达到或者精度条件满足后迭代就会停止。
想了解亚像素级别的角点检测可以自行了解。