OpenCV 图形API(62)特征检测-----在图像中查找最显著的角点函数goodFeaturesToTrack()
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
确定图像上的强角点。
该函数在图像或指定的图像区域内找到最显著的角点,如文献[240]中所述。
- 函数使用 cornerMinEigenVal 或 cornerHarris 在每个源图像像素上计算角点质量测量值。
- 函数执行非极大值抑制(保留3x3邻域内的局部最大值)。
- 最小特征值小于 qualityLevel⋅maxx,yqualityMeasureMap(x,y) 的角点将被拒绝。
- 剩余的角点按照质量测量值从大到小排序。
- 函数会丢弃每一个在其距离小于 maxDistance 范围内存在更强角点的角点。
该函数可以用于初始化基于点的对象跟踪器。
注意:
如果以不同的 qualityLevel 参数值 A 和 B 调用该函数,并且 A > B,则返回的带有 qualityLevel=A 的角点向量将是带有 qualityLevel=B 的输出向量的前缀。
函数的文字ID是 “org.opencv.imgproc.feature.goodFeaturesToTrack”。
函数原型
GArray<Point2f> cv::gapi::goodFeaturesToTrack
(const GMat & image,int maxCorners,double qualityLevel,double minDistance,const Mat & mask = Mat(),int blockSize = 3,bool useHarrisDetector = false,double k = 0.04
)
参数
- 参数 image:输入8位或浮点32位、单通道图像。 - 参数 maxCorners:要返回的最大角点数量。如果找到的角点多于 maxCorners,将返回最强的那些。maxCorners <= 0 表示对最大数量没有限制,并返回所有检测到的角点。
- 参数 qualityLevel:表征接受的最小图像角点质量的参数。参数值乘以最佳角点质量测量值,即最小特征值(见 cornerMinEigenVal)或 Harris 函数响应(见 cornerHarris)。质量测量值低于此乘积的角点将被拒绝。例如,如果最佳角点的质量测量值为1500,qualityLevel=0.01,则所有质量测量值小于15的角点都将被拒绝。
- 参数 minDistance:返回角点之间的最小可能欧几里得距离。
- 参数 mask:可选的兴趣区域。如果图像不为空(需要类型为 CV_8UC1 并且与 image 大小相同),则指定检测角点的区域。
- 参数 blockSize:计算每个像素邻域导数协方差矩阵的平均块大小。参见 cornerEigenValsAndVecs。
- 参数 useHarrisDetector:指示是否使用 Harris 检测器(见 cornerHarris)或 cornerMinEigenVal 的参数。
- 参数 k:Harris 检测器的自由参数。
返回值
检测到的角点向量。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/gapi/imgproc.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::gapi;int main()
{// 读取输入图像,通常为灰度图像Mat src = imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", IMREAD_GRAYSCALE );if ( src.empty() ){std::cerr << "无法读取图像" << std::endl;return -1;}// 定义G-API网络cv::GMat in;cv::GArray< cv::Point2f > kpts;kpts = gapi::goodFeaturesToTrack( in,100, // maxCorners0.01, // qualityLevel10, // minDistanceMat(), // mask3, // blockSizefalse, // useHarrisDetector0.04 ); // k// 创建并执行G-API图cv::GComputation comp( cv::GIn( in ), cv::GOut( kpts ) );std::vector< cv::Point2f > corners;comp.apply( gin( src ), gout( corners ) );// 在原图上绘制检测到的角点for ( const auto& point : corners ){circle( src, point, 5, Scalar( 0, 0, 255 ), FILLED );}// 显示结果imshow( "Good Features to Track", src );waitKey();return 0;
}