33 Opencv ShiTomasi角点检测

发布于:2024-12-23 ⋅ 阅读:(11) ⋅ 点赞:(0)

goodFeaturesToTrack 算子

goodFeaturesToTrack(src,corners,maxCorners,quality_level,min_distance,Mat(),block_size,use_harris,k);
1.src:输入图像,输入的图像必须是8位或32位单通道图像
2.corners:输出的角点使用vector<Point2f>存储
3.maxCorners:最大角点数目,也就是corners集合中能存放的最大交点数,也就是最强的前corners个角点
4.quality_level:质量水平系数,是0.01~1之间的系数,其中系数越大检测到的角点就越少,反之亦然
5.min_distance:角点之间的最小距离,小于此距离的角点会被忽略,距离越大有可能检测到的角点就越少
6.Mat()掩码,mask=0忽略,基础用法忽略即可
7.block_size:Sobel算子,使用的邻域,四邻域,八邻域等 357
9.user_harris:是否使用harris检测,true是,false否
10.k:harris角点检测时使用一般为0.04,user_harris=false时此参数会被忽略

示例

#include <opencv2/opencv.hpp> // 包含OpenCV库的主要头文件
#include <iostream>           // 包含标准输入输出流的头文件

using namespace cv;           // 使用cv命名空间,避免每次调用OpenCV函数时都得加上cv::
using namespace std;          // 使用std命名空间,避免每次调用C++标准库函数时都得加上std::

int num_corners = 25;         // 设置初始要检测的角点数量为25个
int max_corners = 200;        // 设置可检测的最大角点数量为200个
const char* output_title = "ShiTomasi Detector"; // 定义输出窗口的标题
void ShiTomasi_Demo(int, void*); // 声明回调函数,用于更新角点检测结果

Mat src, gray_src;            // 定义两个矩阵变量,src用于存储原始彩色图像,gray_src用于存储灰度图像
RNG rng(12345);               // 创建一个随机数生成器,用于给角点标记颜色

// 主函数
int main(int argc, char** argv) {
	src = imread("D:/vcprojects/images/home.jpg"); // 加载指定路径的图像到src矩阵中
	if (src.empty()) {                             // 检查图像是否成功加载
		printf("could not load image...\n");       // 如果未成功加载,则打印错误信息
		return -1;                                 // 并退出程序,返回-1表示错误
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE); // 创建一个名为"input image"的窗口,大小自动调整
	imshow("input image", src);                     // 在"input image"窗口中显示原始图像

	cvtColor(src, gray_src, COLOR_BGR2GRAY);        // 将彩色图像转换为灰度图像

	namedWindow(output_title, CV_WINDOW_AUTOSIZE);  // 创建一个用于显示角点检测结果的窗口
	createTrackbar("Num Corners:", output_title, &num_corners, max_corners, ShiTomasi_Demo); // 创建滑动条以动态改变角点数量,并绑定到回调函数
	ShiTomasi_Demo(0, 0);                           // 调用回调函数初始化显示

	waitKey(0);                                     // 等待按键事件(无限期等待)
	return 0;                                       // 程序正常结束,返回0
}

// 回调函数,当滑动条值变化时被调用
void ShiTomasi_Demo(int, void*) {
	if (num_corners < 5) {                          // 确保角点数量不少于5个
		num_corners = 5;
	}
	vector<Point2f> corners;                        // 定义一个vector容器用于存储检测到的角点坐标
	double qualityLevel = 0.01;                     // 设置质量水平阈值,决定最小特征值的下限
	double minDistance = 10;                        // 设置角点之间的最小距离
	int blockSize = 3;                              // 设置计算导数自相关矩阵时考虑的邻域大小
	bool useHarris = false;                         // 设置是否使用Harris检测器,默认不使用
	double k = 0.04;                                // Harris角点检测器使用的自由参数k值

	Mat resultImg = gray_src.clone();               // 复制灰度图像到resultImg中,作为绘制角点的基础图
	cvtColor(resultImg, resultImg, COLOR_GRAY2BGR); // 将灰度图像转换回彩色图像,以便能够绘制彩色圆圈标记角点

	goodFeaturesToTrack(gray_src, corners, num_corners, qualityLevel, minDistance, Mat(), blockSize, useHarris, k); // 检测角点并将它们存入corners向量中
	printf("Number of Detected Corners:  %d\n", corners.size()); // 打印检测到的角点数量

	for (size_t t = 0; t < corners.size(); t++) {   // 遍历所有检测到的角点
		circle(resultImg, corners[t], 2, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), 2, 8, 0); // 在每个角点位置绘制彩色圆圈
	}
	imshow(output_title, resultImg);                // 在"ShiTomasi Detector"窗口中显示带有角点标记的结果图像
}

在这里插入图片描述