当前位置: 首页 > article >正文

33 Opencv ShiTomasi角点检测

文章目录

  • goodFeaturesToTrack 算子
  • 示例

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"窗口中显示带有角点标记的结果图像
}

在这里插入图片描述


http://www.kler.cn/a/452516.html

相关文章:

  • 【 CSS 】sass 扩展语言的安装
  • lxml 解析xml\html
  • 【论文阅读笔记】IC-Light
  • 【设备 磁盘】重要备份存放U盘的风险 + winhex 磁盘清零(清理windows无法格式化的磁盘)
  • 决策树(理论知识3)
  • springBoot发布https服务及调用
  • 获取 jakarta.servlet.http.HttpServletRequest请求IP
  • 【stm32can】
  • C# Winform打开和预览PDF,方法一:调用CefSharp包,内嵌浏览器
  • EMS(energy managment system)从0到1
  • 软考架构师笔记-计算机系统组成-1
  • 10. zynq应用开发--camke编译
  • 【每日学点鸿蒙知识】Charles抓包、lock文件处理、WebView组件、NFC相关、CallMethod失败等
  • Spring源码_05_IOC容器启动细节
  • Oracle 备份与恢复 (Docker部署版)
  • 单机服务和微服务
  • 模型的量化(Quantization)
  • 一篇梳理清楚JavaScript ES6中的Promise
  • [WASAPI]音频API:从Qt MultipleMedia走到WASAPI,相似与不同
  • 钢材缺陷识别分割数据集labelme格式693张4类别
  • leetcode hot100 将有序数组转化为二叉搜索树
  • 微服务: 06-rabbitmq设置延时队列,场景与使用(springboot)
  • 图神经网络_图嵌入_SDNE
  • 【Rust自学】6.4. 简单的控制流-if let
  • 【每日学点鸿蒙知识】指纹识别隐藏背面、数组内部值变化刷新UI、键盘输入类型、跨组件路由、C++20特性支持
  • 智谱BigModel研习社|搭建 AI 搜索引擎 - 使用免费的Web-Search-Pro+脑图Agent智能体