有没有办法获取图像中特定点的特征值?

Is there a way to get eigenvalues for a particular point in an image?

我正在使用 OpenCV,里面有一个函数 goodFeaturesToTrack 可以应用 ShiTomasi 方法来寻找角点。

我们知道 Shi-Tomasi 是基于发现 eigenvalues so there is even a function in OpenCV to calculate the minimal eigenvalue of gradient matrices for corner detection called cornerMinEigenVal 以防您想自己实施:

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

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

我的问题是:

是否有一个函数(在 OpenCV 中,如果不是任何其他 C++ 库)可以找到图像的特定点 (X,Y)eigenvalues(或其最小值)(并且未在整个图像)(块大小)?

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

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

仔细查看calcMinEigenVal() and 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;

你会得到你需要的。