OpenCV特征检测(7)角点检测函数goodFeaturesToTrack()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

确定图像上的强角点。

该函数根据 240中所描述的方法查找图像中最显著的角点或者指定图像区域内的最显著角点。

  • 函数使用 cornerMinEigenVal 或 cornerHarris 在源图像的每一个像素上计算角点的质量度量。
  • 函数执行非极大值抑制(即保留局部最大值,在 3x3 邻域内)。
  • 那些最小特征值小于 qualityLevel 乘以 qualityMeasureMap(x,y) 最大值的角点被剔除。
  • 剩下的角点按照质量度量的降序进行排序。
  • 函数会抛弃掉每一个在其距离小于 maxDistance 的位置上有更强角点的角点。

该函数可用于初始化基于点的目标跟踪器。

goodFeaturesToTrack 是 OpenCV 中用于角点检测的一个函数,它能够从图像中找到一些"好特征",即角点。这些角点在后续的图像处理任务中非常有用,比如特征跟踪、光流计算等。

注释:

如果使用参数 qualityLevel 的不同值 A 和 B 调用该函数,并且 A > B,则返回的具有 qualityLevel=A 的角点向量将是具有 qualityLevel=B 的输出向量的前缀。

函数原型

cpp 复制代码
void cv::goodFeaturesToTrack	
(
	InputArray 	image,
	OutputArray 	corners,	
	int 	maxCorners,
	double 	qualityLevel,
	double 	minDistance,
	InputArray 	mask = noArray(),
	int 	blockSize = 3,
	bool 	useHarrisDetector = false,
	double 	k = 0.04 
)		

参数

  • 参数image: 输入的 8 位或 32 位浮点型单通道图像。

  • 参数corners: 输出的检测到的角点向量。

  • 参数maxCorners: 返回的最大角点数。如果检测到的角点多于这个数值,则返回最强的几个角点。如果 maxCorners <= 0,则表示没有设置最大数量的限制,返回所有检测到的角点。

  • 参数qualityLevel: 表征最小可接受的图像角点质量的参数。该参数值乘以最佳角点的质量度量(可以是最小特征值或 Harris 函数的响应)。质量度量低于该乘积的角点将被拒绝。例如,如果最佳角点的质量度量为 1500,且 qualityLevel=0.01,则所有质量度量小于 15 的角点都将被拒绝。

  • 参数minDistance: 返回的角点之间的最小可能的欧几里得距离。

  • 参数mask: 可选的兴趣区域。如果该图像不为空(需要是类型 CV_8UC1 且大小与输入图像相同),则它指定了检测角点的区域。

  • 参数blockSize: 用于在每个像素邻域上计算导数协方差矩阵的平均块大小。参见 cornerEigenValsAndVecs。

  • 参数useHarrisDetector: 标志位,指示是否使用 Harris 检测器(参见 cornerHarris)或最小特征值方法。

  • 参数k: Harris 检测器中的自由参数。

代码示例

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

int main( int argc, char** argv )
{
    // 加载图像
    cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", cv::IMREAD_GRAYSCALE );  // 转换为灰度图

    if ( !img.data )
    {
        std::cout << "No image data" << std::endl;
        return -1;
    }

    std::vector< cv::Point2f > corners;  // 存储角点位置
    // 设置参数
    int maxCorners      = 50;    // 最大角点数量
    double qualityLevel = 0.01;  // 角点质量水平因子,值越大质量越高
    double minDistance  = 10;    // 角点之间的最小距离
    int blockSize       = 3;     // 计算梯度的窗口大小

    // 使用 goodFeaturesToTrack 检测角点
    cv::goodFeaturesToTrack( img, corners, maxCorners, qualityLevel, minDistance, cv::Mat(), blockSize );

    // 绘制角点
    cv::Mat imgColor;
    cvtColor( img, imgColor, cv::COLOR_GRAY2BGR );  // 转换为BGR颜色空间以便绘图
    for ( const auto& corner : corners )
    {
        cv::circle( imgColor, corner, 2, cv::Scalar( 0, 0, 255 ), -1 );  // 画红色圆圈标记角点
    }

    // 显示带有角点的图像
    cv::imshow( "Original Image", img );
    cv::imshow( "Corners detected", imgColor );

    // 等待按键后关闭窗口
    cv::waitKey( 0 );

    return 0;
}

运行结果

相关推荐
啥都想学点的研究生几秒前
一篇文章讲清楚:机器学习所用的数学知识
人工智能·机器学习
七牛云行业应用2 分钟前
国产新模型选型:GLM-5.3、DeepSeek V4、GLM-5.3-Flash、Qwen3.8-Flash-Next、Kimi K3 怎么选
人工智能·大模型·ai编程
hhzz5 分钟前
边缘AI视频分析引擎实战:可视化拖拽编排流水线把模型快速跑起来
人工智能·计算机视觉·边缘计算·智能安防·ai视频分析·流水线编排
东方佑6 分钟前
验证报告:「调度中枢」式语言模型方案的最小成本验证
人工智能·语言模型·自然语言处理
淼澄研学17 分钟前
大语言模型文本生成5大技术陷阱与LangChain RAG实操方案
人工智能·语言模型·langchain
AI杂货铺(摸鱼版)17 分钟前
企业多个AI项目怎么分API Key?按项目、工具和环境管理更稳妥
人工智能
蒲公英内测分发22 分钟前
AI 玩具 App 每周更新,怎么用 CI/CD 自动上传测试包又避免误发?
人工智能·测试工具·智能硬件·web app
彼日花24 分钟前
我做了一个开源项目,让 AI 记住我们解决过的问题:Usora
人工智能·agent·ai编程
wangfpp26 分钟前
生产级 RAG 知识库全流程实践
人工智能·agent·全栈
财迅通Ai27 分钟前
TCL中环2026年中报大幅减亏,一体化与全球化共同驱动经营改善
大数据·人工智能·tcl中环