1

我正在研究使用openCV改变不同参数对哈里斯角点检测器的错误率的影响。输入参数是窗口大小,sobel运算符的内核大小和k参数的值。我发现,当我增加窗口大小时,每个角落的响应数量似乎有所增加。例如,如果每个包含一个角的窗口都用一个点标记,那么当我使用7x7窗口而不是2x2窗口时,在标识的角落周围出现密度较高的点。更改窗口大小似乎也会增加正确识别的角点数量。窗口大小对openCV中哈里斯角点检测器的结果有什么影响

我的编码如下,这是我从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()

可能有人请解释对Harris角点检测的结果增加了窗口大小的影响。具体为什么每个角落的响应数量随着窗口大小的增加而增加。我的理解是,这个函数计算窗口梯度,并使用sobel运算符执行一些平滑处理,如果这对结果有影响的话。对不起,如果这是一个明显的问题,但我只是新的计算机视觉。

+0

这是奇怪的...你能请出示你的代码的相关部分? – sansuiso

回答

2

你是什么意思的“每角落响应”?在“真实”拐角位置的一般附近看到探测器响应中出现多个峰值簇是很正常的。发生这种情况是因为响应函数对于自然图像而言是平滑的 - 毕竟它计算的是衍生物的产物,它放大了原始图像中的任何“随机”振荡。哈里斯的所有过滤器都是为了找到这样一些地方,这个不平滑的函数强烈地尖峰化,但是即使你对图像的直觉告诉你他们不应该,峰值也可以彼此接近。为了解决这个问题,一个明显的技术是计算“平滑导数”(即Gx * I,而不是Ix,其中G是一个小的高斯内核等),但这有副作用,即一些“弱“角落可能会变得平滑。不管是否使用平滑衍生物,用于解决这个问题并获得期望的N个“干净”角的简单算法是从响应中选择通过减少检测器响应排序的k * N个最强峰值强度(以k表示,在5至10范围内),然后:

  1. 从列表中选择下一个峰值。
  2. 在其位置(x,y)查找Harris探测器响应值H(x,y)。
  3. 如果H(x,y)> 0,将它添加到输出干净的角点列表中,然后在(x,y)的一个小的m×m邻域中将H(u,v)的所有值设置为0。
  4. 否则跳过这个高峰。
  5. 如果输出列表的大小小于N并且还有任何峰值,则转到1。

“聚类”抑制邻域的宽度m应该表示您先前的信息,说明“真实”角点应该相距多远。这种方法显然假设群集的“最佳”角落是具有最强哈里斯滤波器响应的角落。

顺便说一句,如果你的名字(或谷歌搜索),这通常被称为“非局部极大值抑制”。

BTW-2:见this answer的详细信息,发现为H响应的所有局部最大值,待再由响应值等来分类

相关问题