我在OpenCV中使用cornerHarris函数。我无法理解ksize
和k
在函数中的含义。文档中提到ksize
是Aperture parameter of Sobel derivative used
,而k
是Harris detector free parameter in the equation
,但是我不确定这到底是什么意思?
有人可以帮助我理解吗?
我试图检测立方体中的角,结果是:
使用我在文档中使用的简单代码:
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,0,255]
cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
cv2.destroyAllWindows()
我尝试调整K
,但不了解它的作用,尽管我意识到将其增加到超出限制会导致检测到零角。
答案 0 :(得分:2)
Harris转角检测器用于从灰度图像中提取转角。 哈里斯探测器的工作原理是首先计算图像梯度,然后计算梯度的协方差,该协方差是局部Hessian的近似值。
它有4个主要步骤:
边缘检测(空间导数计算)-第一步是将灰度图像转换为边缘图像。有很多技术可以做到这一点,但是cv2使用了一个称为Sobel内核的过滤器,该过滤器与原始图像互相关。 ksize 参数确定Sobel内核的大小(3x3、5x5等)。随着大小的增加,每个卷积过程将包含更多像素,并且边缘将变得更加模糊。
结构张量设置-基本上,我们构造一个矩阵M,该矩阵M表示图像每个点上的梯度(边缘)的方向。然后可以使用此矩阵确定哪些边缘像素是角:
k参数可让您在此步骤中发挥影响,并权衡精度和召回率。因此,当 k较大时,您将获得较少的虚假拐角,但也会错过更多的真实拐角(高精度),而当 k较小时,您将获得更多的拐角 ,因此您不会错过真正的弯角,但会遇到很多错误的弯角(高召回率)。