【问题标题】:Is there a way to get eigenvalues for a particular point in an image?有没有办法获取图像中特定点的特征值?
【发布时间】:2021-06-07 14:59:45
【问题描述】:

我正在使用 OpenCV,里面有函数 goodFeaturesToTrack 来应用 ShiTomasi 方法来寻找角落。

我们知道 Shi-Tomasi 是基于找到 eigenvalues 所以在 OpenCV 中甚至有一个函数可以计算用于角点检测的梯度矩阵的最小特征值,称为 cornerMinEigenVal,以防你想自己实现:

void cv::cornerMinEigenVal  (   InputArray      src,
        OutputArray     dst,
        int     blockSize,
        int     ksize = 3,
        int     borderType = BORDER_DEFAULT 
    )

然而,这个函数找到图像中所有点的最小特征值(并将结果存储在dst中)。

我的问题是:

是否有一个函数(在 OpenCV 或任何其他 C++ 库中)为图像的特定点 (X,Y) 找到 eigenvalues(或其最小值)(而不是在整个图像中评估)(使用一个块大小)?

【问题讨论】:

    标签: c++ opencv eigenvalue


    【解决方案1】:

    简答:OpenCV 中没有这样的函数来计算稀疏点的 MinEigenVals。但是,您只需稍作修改即可实现 HarrisResponses() 中的一个。

    HarrisResponses()函数用于计算稀疏点的Harris分数(在OpenCV中是静态的,不能直接调用)。

    查看calcMinEigenVal()calcHarris()的代码,你会发现它们之间唯一的区别是它们如何使用cov矩阵中的值:

    // MinEigenVal
    float a = cov[j*3]*0.5f;
    float b = cov[j*3+1];
    float c = cov[j*3+2]*0.5f;
    dst[j] = (float)((a + c) - std::sqrt((a - c)*(a - c) + b*b));
    
    // Harris
    float a = cov[j*3];
    float b = cov[j*3+1];
    float c = cov[j*3+2];
    dst[j] = (float)(a*c - b*b - k*(a + c)*(a + c));
    

    只需将this line 更改为:

    // scale_sq = scale * scale
    pts[ptidx].response = (float)((a + b)*0.5f - stb::sqrt((a - b)*(a - b)*0.25f + c*c))*scale_sq;
    

    你会得到你需要的。

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 1970-01-01
      • 2022-11-29
      • 2017-03-10
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多