我正在研究使用openCV改变不同参数对Harris角点探测器误码率的影响。输入参数是窗口大小,sobel运算符的内核大小和k参数的值。我发现当我增加窗口大小时,每个角落的响应数量似乎有所增加。例如,如果每个包含一个角的窗口都用点标记,那么当我使用7x7窗口而不是2x2窗口时,所识别的角周围的点密度似乎更高。更改窗口大小似乎也会增加正确识别的角点数量。
我的编码如下,我从this示例
获得
import cv2
import numpy as np
filename = 'resized_image.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,7,3,0.015)
#result is dilated for marking the corners, not important
dst = cv2.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.05*dst.max()]=[0,0,255]
cv2.imwrite('corners3.jpg', img )
cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
cv2.destroyAllWindows()

有人可以解释一下增加窗口大小对哈里斯角探测器结果的影响。具体来说,为什么每个角落的响应数量似乎随着窗口大小的增加而增加。据我所知,该函数计算窗口梯度并使用sobel算子执行一些平滑,如果这对结果有影响的话。对不起,如果这是一个显而易见的问题,但我不熟悉计算机视觉。
答案 0 :(得分:2)
“每个角落的回复”是什么意思?在“真实”角落位置的一般附近,在探测器响应中看到多个峰值簇是正常的。之所以发生这种情况,是因为响应函数对于自然图像来说是平滑的 - 毕竟它会计算衍生产品,这会放大原始图像中的任何“随机”振荡。 Harris的所有过滤器都是为了增强这种不平滑功能“达到峰值”的区域,但即使你对图像的直觉告诉你不应该这样,峰值也可以相互接近。
解决这个问题的一个明显技巧是计算“平滑导数”(即Gx * I,而不是Ix,其中G是一个小高斯核等),但这有一些“弱”的副作用角落可能会变得平滑。
无论是否使用平滑导数,用于解决此问题并获得预期数量N“干净”角的简单算法是从响应中选择通过降低检测器响应强度排序的k * N个最强峰(用k表示,在5到10范围内),然后:
如果H(x,y)> 0,然后
将其添加到输出清洁角落列表中;
在(x,y)的小m x m邻域中将H的所有值设为0。
“群集”抑制邻域的宽度m应表示您之前关于“真实”角落应该相距多远的信息。该方法显然假设群集的“最佳”角是具有最强哈里斯滤波器响应的角。
顺便说一句,如果你是名字(或谷歌搜索),这通常被称为“非局部最大值抑制”。
BTW-2:有关查找H响应的所有局部最大值,然后按响应值等排序的详细信息,请参阅this answer。