前文中我们介绍了Harris角点检测,后来有人提出了它的改进版——Shi-Tomasi角点检测。
Harris角点检测中的响应
R
R
R计算如下:
R
=
λ
1
λ
2
−
k
(
λ
1
+
λ
2
)
2
R=\lambda_1\lambda_2-k(\lambda_1+\lambda_2)^2
R=λ1λ2−k(λ1+λ2)2
k取值为0.04-0.07。由于Harris角点检测算法的稳定性和k值有关,而k是个经验值,不好设定最佳值。
Shi-Tomasi发现,角点的稳定性其实和较小的特征值有关,于是直接用较小的那个特征值作为分数,这样就与k无关。
Shi-Tomasi响应公式如下:
R
=
m
i
n
(
λ
1
,
λ
2
)
R=min(\lambda_1,\lambda_2)
R=min(λ1,λ2)
如果该响应系数R大于设定的阈值,它就是一个角点。
具体的Opencv中涉及到的函数在此博客中查看。
C++实现的demo的代码如下:
void trackBar(int, void*);
int maxCorners = 0;
Mat src, dst;
int main()
{
src = imread("bw.png");
if (src.empty())
{
printf("can not load image \n");
return -1;
}
imshow("input", src);
cvtColor(src, dst, COLOR_BGR2GRAY);
namedWindow("output");
createTrackbar("MaxCorners:", "output", &maxCorners, 100, trackBar);
waitKey();
return 0;
}
void trackBar(int, void*)
{
src = imread("bw.png");
std::vector<Point2f> corners;
goodFeaturesToTrack(dst, corners, maxCorners, 0.01, 10);
for (int i = 0; i < corners.size(); i++)
{
circle(src, corners[i], 2, Scalar(0, 255, 255), 2);
}
imshow("output", src);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)