我在玩OpenCV中的cornerHarris函数.我不明白ksize和k在函数中的含义.文档在公式中提到ksize是所用Sobel导数的Aperture参数,k是等式中的k是无Harris检测器的参数,但是我不确定它的真正含义是什么?
有人可以帮我理解吗?
我试图检测立方体中的角,结果是:
使用我在文档中使用的简单代码:
import cv2
import numpy as np
filename = "cube.jpg"
img = cv2.imread("./images/{}".format(filename))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,12,3,0.04)
dst = cv2.dilate(dst,None)
# Threshold for an optimal value,it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,255]
cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
cv2.destroyAllWindows()
我尝试调整K,但不了解它的作用,尽管我意识到将K增加到超出限制会导致检测到零角.
最佳答案
哈里斯角落检测器用于从灰度图像中提取角落.
哈里斯探测器的工作原理是首先计算图像梯度,然后计算梯度的协方差,该协方差是局部Hessian的近似值.
哈里斯探测器的工作原理是首先计算图像梯度,然后计算梯度的协方差,该协方差是局部Hessian的近似值.
它包含四个主要步骤:
>边缘检测(空间导数计算)-第一步是将灰度图像转换为边缘图像.有很多技术可以做到这一点,但是cv2使用了一个称为Sobel内核的过滤器,该过滤器与原始图像互相关. ksize参数确定Sobel内核的大小(3×3、5×5等).随着大小的增加,每个卷积过程将包含更多像素,并且边缘将变得更加模糊.
>结构张量设置-基本上,我们构造一个矩阵M,该矩阵M表示图像每个点上的渐变方向(边缘).然后可以使用此矩阵确定哪些边缘像素是角:
>哈里斯响应计算-在此步骤中,我们计算每个边缘像素的“角分”R.想法是,仅当像素在2个垂直方向上具有较大的梯度时,才将其定义为角点,这意味着M矩阵具有2个大特征值(1个大特征值将只是一个边缘).
在这里,我们可以看到哈里斯探测器的自由参数-k.它是根据经验确定的常数,范围为[0.04,0.06]:
k参数可让您在此步骤中产生影响,权衡精度和召回率.因此,k越大,假角就越少,但真实的角也就越少(高精度),k越小,拐角就越多,因此,真角就越少,但是假角却越多错误的(高召回率).
>非最大抑制-找到每个局部区域中的角点像素最大值,其余部分被抑制.