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

运行结果

相关推荐
2013092416275 小时前
1968年 Hart, Nilsson, Raphael 《最小成本路径启发式确定的形式基础》A* 算法深度研究报告
人工智能·算法
InterestOriented5 小时前
破解银发学习痛点 兴趣岛 “普惠 + 品质” 模式打造积极老龄化范本
大数据·人工智能·学习
Mark_Aussie6 小时前
ADALog 日志异常检测
人工智能
Jouham6 小时前
教培获客破局:AI智能体如何重塑需求捕捉与转化新范式
人工智能
HyperAI超神经6 小时前
IQuest-Coder-V1:基于代码流训练的编程逻辑增强模型;Human Face Emotions:基于多标注维度的人脸情绪识别数据集
人工智能·深度学习·学习·机器学习·ai编程
开发者每周简报6 小时前
MCP + 氛围编辑
人工智能
啊阿狸不会拉杆6 小时前
《机器学习》第 1 章 - 机器学习概述
人工智能·机器学习·ai·ml
咚咚王者7 小时前
人工智能之核心基础 机器学习 第十八章 经典实战项目
人工智能·机器学习
DuHz7 小时前
矩阵束法(Matrix Pencil)用于 FMCW 雷达干扰抑制:论文精读
人工智能·机器学习·矩阵
编程小风筝7 小时前
机器学习和稀疏建模的应用场景和优势
人工智能·机器学习