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

运行结果

相关推荐
淘晶驰AK10 分钟前
嵌入式算吃青春饭么?
人工智能
打码人的日常分享24 分钟前
【软件建设方案】设备管理系统建设方案(Doc原件参考)
大数据·人工智能·系统安全·需求分析·设计规范
新智元40 分钟前
突破数据墙!27 岁华裔 MIT 辍学创业 8 年,年化收入逼近 10 亿
前端·人工智能
AI大模型_学习君1 小时前
什么是 GPT?通过图形化的方式来理解 Transformer 架构
人工智能·gpt·深度学习·自然语言处理·大模型·llm·transformer
AiBoxss1 小时前
阿里通义千问开源Qwen2.5系列模型:Qwen2-VL-72B媲美GPT-4
人工智能
水木流年追梦1 小时前
【shell脚本5】Shell脚本学习--条件控制
人工智能·python·深度学习·学习·算法·机器学习
DB_UP1 小时前
YOLOv5物体检测
图像处理·python·yolo·计算机视觉
Midsummer啦啦啦2 小时前
OpenCV读取并保存中文路径图片指南
opencv
bryant_meng2 小时前
【BoF】《Bag of Freebies for Training Object Detection Neural Networks》
人工智能·目标检测·计算机视觉·bof