有没有一种方法可以获得图像中特定点的特征值



我正在使用OpenCV,其中有一个函数goodFeaturesToTrack,用于应用ShiTomasi方法来查找角点。

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

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

然而,该函数找到图像中ALL点的最小特征值(并将结果存储在dst中(。

我的问题是:

是否有函数(在OpenCV中,或者如果没有任何其他C++库的话(来找到图像(未在整个图像中评估((具有块大小(的特定点(X,Y)eigenvalues(或其最小值(?

简单回答:OpenCV中没有这样的函数可以计算稀疏点的最小特征值。但是,您可以通过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));

只需将此行更改为:

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

你会得到你需要的。

相关内容

  • 没有找到相关文章

最新更新