OpenCV与角点检测

Harris角点检测原理

Harris角点检测的基本原理:类似于边缘检测,只不过边缘检测只判断单个方向的梯度,而角点检测判断多个方向的梯度/相似性。

对于一张灰度图,计算在点(x, y)处平移(Δx, Δy)后的自相似性c:

W(x, y)表示以点(x, y)为中心的窗口;而w(x, y)是每个像素的权重,既可以是常数,也可以是高斯加权函数;P(u, v)表示坐标为(u, v)的像素值。上述公式表示计算窗口滑动前后,窗口中的每个像素及其对应像素的差值加权总和。

对平移后的像素点进行泰勒一阶展开,可得:

于是相似性c简化后如下,此时可以看出这是一个椭圆函数:

其中

经过对角化消除C后得:

可以看出λ越大,表示平移前后的滑窗灰度值差别越大。λ1大表示在横坐标上相差较大,λ2大表示在纵坐标上相差较大。当λ1和λ2的值都很大且值相近时,判断(x, y)为物体角点。

image.png

于是可以通过计算角点响应值R来判断该点是否为角点。

其中k为系数,通常取值0.04 ~ 0.06。R>>0表示该点为角点,R≈0表示该点为平坦区,R<<0表示该点为边界。

OpenCV

1
cv2.cornerHarris(img, blockSize, ksize, k)
  • img:输入图像;
  • blockSize:滑动窗口的大小;
  • ksize:Sobel求导中使用的矩阵大小;
  • k:计算角点响应值的系数。

检测结果:

image.png

-------------本文结束感谢您的阅读-------------