- 操作系统: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;
}