有没有办法获取图像中特定点的特征值?
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;
你会得到你需要的。
我正在使用 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;
你会得到你需要的。