36 Opencv SURF 关键点检测

文章目录

  • [SURF::create 创建](#SURF::create 创建)
  • [SURF:: detect 检测](#SURF:: detect 检测)
  • 绘制关键点
  • 示例

SURF::create 创建

c 复制代码
SURF::create(
double hessianThreshold, --阈值检测器使用Hessian的关键点,默认值在
300-500之间
int nOctaves=4, -- 4表示在四个尺度空间
int nOctaveLayers=2, -- 表示每个尺度的层数
bool extended=false,
bool upright=false --表示计算旋转不变性,不计算的速度更快
) 

SURF:: detect 检测

c 复制代码
void detect( InputArray image, OutputArray keypoints, InputArray mask=noArray() ) const;
image: 输入图像,即要从中提取关键点的图像。这个图像应该是单通道的灰度图像。

keypoints: 输出的关键点向量。这是一个 vector<KeyPoint> 类型的对象,它将包含由检测器找到的所有关键点的信息。

mask (可选): 操作掩码,8位单通道的二值图像。它指定了输入图像的哪些区域应该被考虑用于特征检测(非零像素),哪些不应该(零像素)。如果不需要掩码,则可以使用默认值 noArray() 或者简单地传入一个空的 Mat 对象。

绘制关键点

c 复制代码
void drawKeypoints( const Mat& image,
            const vector<KeyPoint>& keypoints,
            CV_OUT Mat& outImage,
            const Scalar& color=Scalar::all(-1),
             int flags=DrawMatchesFlags::DEFAULT
    );

第一个参数image:原始图像,可以使三通道或单通道图像;

第二个参数keypoints:特征点向量,向量内每一个元素是一个KeyPoint对象,包含了特征点的各种属性信息;

第三个参数outImage:特征点绘制的画布图像,可以是原图像;

第四个参数color:绘制的特征点的颜色信息,默认绘制的是随机彩色;

第五个参数flags:特征点的绘制模式,其实就是设置特征点的那些信息需要绘制,那些不需要绘制,有以下几种模式可选:
  DEFAULT:只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
  DRAW_OVER_OUTIMG:函数不创建输出的图像,而是直接在输出图像变量空间绘制,要求本身输出图像变量就是一个初始化好了的,size与type都是已经初始化好的变量
  NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制
  DRAW_RICH_KEYPOINTS:绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐标,size,和方向,是最能显示特征信息的一种绘制方式。

示例

c 复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp> // 包含了OpenCV扩展功能模块,如SURF等高级特征检测算法
#include <iostream>

using namespace cv;
using namespace cv::xfeatures2d; // 使用cv::xfeatures2d命名空间以访问SURF类
using namespace std;

int main(int argc, char** argv) {
	// 加载灰度图像
	Mat src = imread("D:/vcprojects/images/test.png", IMREAD_GRAYSCALE);
	if (src.empty()) { // 检查是否成功加载图像
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE); // 创建一个窗口用于显示输入图像
	imshow("input image", src); // 显示输入图像

	// SURF特征检测初始化
	int minHessian = 100; // 设置Hessian矩阵阈值,用于过滤弱特征点
	Ptr<SURF> detector = SURF::create(minHessian); // 创建SURF特征检测器实例
	vector<KeyPoint> keypoints; // 定义一个向量用于存储检测到的关键点
	detector->detect(src, keypoints, Mat()); // 在源图像中检测关键点,不使用掩码

	// 绘制关键点到图像
	Mat keypoint_img;
	drawKeypoints(src, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT); // 绘制关键点,默认颜色,显示大小和方向
	imshow("KeyPoints Image", keypoint_img); // 显示带有关键点的图像

	waitKey(0); // 等待按键事件
	return 0;
}
相关推荐
古少侠4 小时前
deepseek转word工具怎么选?DS随心转与4种方案对比实测
人工智能·word·powerpoint
Code_Artist4 小时前
☢︎自然语言 → 机器码:这到底是 AI 编程的终极形态,还是一个伪命题?
人工智能·llm·ai编程
老纪的技术唠嗑局4 小时前
Agent 习惯性删库跑路,数据库纷纷学 Git 续命
数据库·人工智能
开发笔记-阿牛4 小时前
做工业报警器语音提示,CK6159A 为什么更合适?
人工智能·stm32·单片机·嵌入式硬件·音频
dehuisun4 小时前
第 06 篇:RAG 混合召回策略:向量检索 + ES 关键词 + Rerank 重排
人工智能
DeepAgent4 小时前
AI Agent 面试篇(01):AI 岗位面试到底怎么走——从网申到 Offer 的完整流程
人工智能·面试·职场和发展
程序员清风4 小时前
LangGraph 入门:用状态机设计可靠的 Agent 工作流
人工智能·python
南京兴帝文化传媒有限公司4 小时前
本地生活服务GEO优化实战:宁国花店地图关键词布局带来订单翻倍的技术路径
大数据·人工智能·生活·geo 优化·geo优化避坑·ai搜索获客
大模型搬砖师4 小时前
把自训模型挂上统一端点:聚合平台的自定义模型接入
人工智能
Nablai4 小时前
多国上市的工程排期:AI 玩具出海项目的并行任务与关键路径
人工智能