您的位置:首页 > 运维架构

【opencv】goodFeaturesToTrack源码分析-1

2016-04-20 20:59 525 查看
本系列文章为goodFeaturesToTrack源码分析,包括:

【opencv】goodFeaturesToTrack源码分析-1

【opencv】goodFeaturesToTrack源码分析-2-Shi-Tomasi角点检测

本文主要描述opencv中强角点检测接口goodFeaturesToTrack的用途及源码分析。

1、接口描述

在opencv中,该接口的实现是在:

..\sources\modules\imgproc\src\Featureselect.cpp 中。

void cv::goodFeaturesToTrack( InputArray _image,OutputArray _corners,int maxCorners, double qualityLevel,
double minDistance,InputArray _mask, int blockSize,bool useHarrisDetector, double harrisK )


输入参数:

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的值,看看具体有什么变化。

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

}


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





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

3、源码分析

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


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

1)角点检测。可以通过harris或者shi-tomasi算法检测角点,获得eig特征值集合。

2)非极大值抑制。低于qualityLevel*特征值最大值的特征值被滤除;并且通过与膨胀后的特征值进行对比,局部最大值也会被滤除。

3)距离检测。挑选出符合距离要求的特征点。

后续将按照goodFeatureToTrack代码流程,分析各个算法具体实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: