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

运行结果

相关推荐
东胜物联19 分钟前
探寻5G工业网关市场,5G工业网关品牌解析
人工智能·嵌入式硬件·5g
皓74130 分钟前
服饰电商行业知识管理的创新实践与知识中台的重要性
大数据·人工智能·科技·数据分析·零售
985小水博一枚呀1 小时前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer
AltmanChan1 小时前
大语言模型安全威胁
人工智能·安全·语言模型
985小水博一枚呀1 小时前
【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer·迁移学习
数据与后端架构提升之路1 小时前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
爱技术的小伙子1 小时前
【ChatGPT】如何通过逐步提示提高ChatGPT的细节描写
人工智能·chatgpt
深度学习实战训练营3 小时前
基于CNN-RNN的影像报告生成
人工智能·深度学习
昨日之日20065 小时前
Moonshine - 新型开源ASR(语音识别)模型,体积小,速度快,比OpenAI Whisper快五倍 本地一键整合包下载
人工智能·whisper·语音识别
浮生如梦_5 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测