《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测

10.2 Shi-Tomasi角点检测

10.2.1 Shi-Tomasi角点检测:goodFeaturesToTrack()函数

1.定义:
  Harris算法改进,若矩阵M行列式的值与M的迹中较小的一个大于最小阈值,则会得到强角点
2.作用:
  确定图像的强角点,可用来初始化一个基于点的对象跟踪操作
3.函数原型:

void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04)

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);
}

运行效果:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ccchenxi/article/details/86497729