10.2 Shi-Tomasi角点检测
10.2.1 Shi-Tomasi角点检测:goodFeaturesToTrack()函数
1.定义:
Harris算法改进,若矩阵M行列式的值与M的迹中较小的一个大于最小阈值,则会得到强角点
2.作用:
确定图像的强角点,可用来初始化一个基于点的对象跟踪操作
3.函数原型:
4.参数说明:
(1)输入图像,8位或浮点型32位单通道图像
(2)检测到的角点输出向量
(3)角点最大数量
(4)角点检测可接受的最小特征值为qualityLevel与图像中最大特征值的乘积,qualityLevel通常取0.1或0.01
(5)角点之间的最小距离,返回的角点之间距离不小于minDistance个像素
(6)可选参数,表示感兴趣区域,默认noArray(),参数非空则指定角点检测区域
(7)计算导数自相关矩阵时指定的范围,默认3
(8)指示是否使用Harris角点检测,默认false
(9)用于设置Hessian自相关矩阵行列式的相对权重的权重系数,默认0.04
10.2.2 综合示例
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//定义辅助宏
#define WINDOW_NAME "【Shi-Tomasi角点检测】"
//全局变量
Mat g_srcImage, g_grayImage,g_dstImage;
int g_maxCornerNumber = 33;//角点检测最大数量
int g_maxTrackbarNumber = 500;
RNG g_rng(12345);
//全局函数
void on_GoodFeaturesToTrack(int, void*);
int main()
{
cout << "\n\n\t欢迎来到【Shi-Tomasi角点检测】示例程序\n" << endl;
//载入原图像
g_srcImage = imread("1.jpg", 1);
cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
imshow(WINDOW_NAME, g_srcImage);
//创建滑动条,回调函数初始化
createTrackbar("最大角点数", WINDOW_NAME, &g_maxCornerNumber, g_maxTrackbarNumber, on_GoodFeaturesToTrack);
on_GoodFeaturesToTrack(0, 0);
waitKey(0);
return 0;
}
void on_GoodFeaturesToTrack(int, void*)
{
//对变量小于等于1时的处理
if (g_maxCornerNumber <= 1) { g_maxCornerNumber = 1; }
//Shi-Tomasi算法的参数准备
vector<Point2f>corners;
double qualityLevel = 0.01;//角点检测可接受最小特征值
double minDistance = 10;//角点之间最小距离
int blockSize = 3;//计算导数自相关矩阵时指定的邻域范围
double k = 0.04;//权重系数
Mat g_dstImage = g_srcImage.clone();
//进行Shi-Tomasi角点检测
goodFeaturesToTrack(g_grayImage, corners, g_maxCornerNumber, qualityLevel, minDistance, Mat(), blockSize, false, k);
//输出文字信息
cout << "\t>此次检测到的角点数量为:" << corners.size() << endl;
//绘制检测到的角点
int r = 4;
for (int i = 0; i < corners.size(); i++)
{
//以随机的颜色绘制出角点
circle(g_dstImage, corners[i], r, Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)), -1, 8, 0);
}
//显示窗口
imshow(WINDOW_NAME, g_dstImage);
}
运行效果: