goodFeaturesToTrack源码分析

1、接口描述

在opencv中,该接口的实现是在:
..\sources\modules\imgproc\src\Featureselect.cpp 中。

<span style="color:#333333"><span style="background-color:#f5f5f5"><code>void cv::goodFeaturesToTrack( InputArray _image,OutputArray _corners,int maxCorners, double qualityLevel, 
double minDistance,InputArray _mask, int blockSize,bool useHarrisDetector, double harrisK )</code></span></span>

输入参数:
InputArray _image:输入的图像,InputArray类型一般为Mat;
int maxCorners:可检测的角点的最大值
double qualityLevel:角点特征值的门限,高于(该门限*特征值)最大值才认为是角点。
double minDistance:角点间最小间距
InputArray _mask:掩码,用于设置不处理的区域
int blockSize:处理的窗口大小
bool useHarrisDetector:是否使用harris角点检测
double harrisK:harris角点检测参数

输出参数:
OutputArray _corners:输出的角点,OutputArray类型一般为Mat;

2、具体实例

在配置好opencv环境之后,新建工程,以下为源码程序,读取lena.png并且检测强角点。可以修改minDis的值,看看具体有什么变化。

<span style="color:#333333"><span style="background-color:#f5f5f5"><code>#include <opencv2\opencv.hpp>

using namespace cv;

int main(){
    Mat image =imread("D:\\testData\\lena.png");
    Mat img;
    int minDis =10;
    cvtColor(image,img,CV_BGR2GRAY);
    std::vector<Point2f> corner;
    goodFeaturesToTrack(img,corner,500,0.04,minDis,Mat(),3,false,0);
    for(int i=0;i<corner.size();i++){
        circle(image,Point(corner.at(i).x,corner.at(i).y),3,Scalar(255,255,0));
    }
    imshow("1",image);
    waitKey(5000);
    return 0;

}
</code></span></span>

以下为minDis =10以及20的图像。



可以看到,minDis=20之后,角点的数量明显减少,角点间距均大于等于20

3、源码分析

<span style="color:#333333"><span style="background-color:#f5f5f5"><code>void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,int maxCorners, double qualityLevel, double minDistance,InputArray _mask, int blockSize,bool useHarrisDetector, double harrisK )
{
        ...
// 计算特征值
    if( useHarrisDetector )
        cornerHarris( image, eig, blockSize, 3, harrisK );
    else
        cornerMinEigenVal( image, eig, blockSize, 3 );
        ...
// 特征值处理,去除不符合门限的特征点及局部最优点
    double maxVal = 0;
    minMaxLoc( eig, 0, &maxVal, 0, 0, _mask );
    threshold( eig, eig, maxVal*qualityLevel, 0, THRESH_TOZERO );
    dilate( eig, tmp, Mat());
        ...
//根据特征点之间的距离限制,筛选特征点
    if (minDistance >= 1)
    {
        ...
    }

//输出corners
    Mat(corners).convertTo(_corners, _corners.fixedType() ? _corners.type() : CV_32F);
}</code></span></span>

在函数内部,大体的处理流程如下:

1)角点检测。可以通过harris或者shi-tomasi算法检测角点,获得eig特征值集合。
2)非极大值抑制。低于qualityLevel*特征值最大值的特征值被滤除;并且通过与膨胀后的特征值进行对比,局部最大值也会被滤除。
3)距离检测。挑选出符合距离要求的特征点。

后续将按照goodFeatureToTrack代码流程,分析各个算法具体实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鸳鸯锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值