欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Harris 角点检测

程序员文章站 2022-06-11 18:10:08
...

角点的一个特性:向任何方向移动变化都很大。

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就行。

给出原图:

Harris 角点检测

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 角点检测
可以看见上图检测出了所有角点,但是还检测出了一些其他的点,所以可以通过不停地调参达到Harris角点检测的最好效果。

面阵摄像机的成像面以像素为最小单位。例如某CMOS摄像芯片,其像素间距为5.2微米。摄像机拍摄时,将物理世界中连续的图像进行了离散化处理。到成像面上每一个像素点只代表其附近的颜色。至于"附近"到什么程度?就很困难解释。两个像素之间有5.2微米的距离,在宏观上可以看作是连在一起的。但是在微观上,它们之间还有无限的更小的东西存在。这个更小的东西我们称它为**“亚像素”**。实际上"亚像素"应该是存在的,只是硬件上没有个细微的传感器把它检测出来。于是软件上把它近似地计算出来。

OpenCV 为我们提供了函数 cv2.cornerSubPix(),它可以提供亚像素级别的角点检测。

下面举一个例子,先找到Harris角点,然后将角点的重心传**cv2.cornerSubPix()**函数进行修正,使用这个函数的时候我们需要定义一个迭代条件,当迭代次数达到或者精度条件满足后迭代就会停止。

想了解亚像素级别的角点检测可以自行了解。