opencv - window size对openCV中harris corner detector的结果有什么影响

标签 opencv computer-vision feature-detection corner-detection

我正在使用 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 运算符执行一些平滑。对不起,如果这是一个明显的问题,但我只是计算机视觉的新手。

最佳答案

“每个角的响应数”是什么意思?在“真实”角位置附近的检测器响应中看到多个峰值簇是正常的。发生这种情况是因为响应函数对于自然图像来说一点也不平滑——毕竟它计算的是导数的乘积,这会放大原始图像中的任何“随机”振荡。所有 Harris 过滤器所做的就是增强这种不平滑函数的“尖峰”区域,但尖峰可以彼此靠近,即使您对图像的直觉告诉您它们不应该如此。

解决这个问题的一个明显技术是计算“平滑导数”(即 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 x m 小邻域中的所有 H 值设置为 0。

  4. 否则跳过这个高峰。
  5. 如果输出列表的大小小于 N 并且还有剩余的峰值,则转到 1。

“簇”抑制邻域的宽度 m 应该表达您关于“真实”角彼此之间应该相距多远的先验信息。这种方法显然假设簇的“最佳”角是哈里斯滤波器响应最强的角。

顺便说一句,如果您喜欢名字(或用谷歌搜索它们),这通常称为“非局部最大值抑制”。

顺便说一句 - 2:参见 this answer有关查找 H 响应的所有局部最大值的详细信息,然后按响应值等进行排序。

关于opencv - window size对openCV中harris corner detector的结果有什么影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29484472/

相关文章:

c++ - 无法使用 openCv 从 D-Link DCS 932L 获取视频源

python - 如何使用 opencv 制作剪切图/使图像背景透明?

python - 使用 OpenCV 进行圆检测

c - 如何从c语言程序中调用LSD(LineSegmentDetector)?

opencv - 将直方图与卡方距离进行比较

python - 我可以对一批数据使用cv2.cvtColor(image,cv2.COLOR_GRAY2RGB)吗?

opencv - 将一幅图像中的像素重新投影到另一幅图像中

c++ - 鱼眼畸变校正

c++ - 计算二维平面上单应性的精度

javascript - 为一个 Javascript 特征创建特征检测(intersectionObserver)