我正在使用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;
你会得到你需要的。