【opencv】goodFeaturesToTrack源码分析-1
2016-04-20 20:59
525 查看
本系列文章为goodFeaturesToTrack源码分析,包括:
【opencv】goodFeaturesToTrack源码分析-1
【opencv】goodFeaturesToTrack源码分析-2-Shi-Tomasi角点检测
本文主要描述opencv中强角点检测接口goodFeaturesToTrack的用途及源码分析。
..\sources\modules\imgproc\src\Featureselect.cpp 中。
输入参数:
InputArray _image:输入的图像,InputArray类型一般为Mat;
int maxCorners:可检测的角点的最大值
double qualityLevel:角点特征值的门限,高于(该门限*特征值)最大值才认为是角点。
double minDistance:角点间最小间距
InputArray _mask:掩码,用于设置不处理的区域
int blockSize:处理的窗口大小
bool useHarrisDetector:是否使用harris角点检测
double harrisK:harris角点检测参数
输出参数:
OutputArray _corners:输出的角点,OutputArray类型一般为Mat;
以下为minDis =10以及20的图像。
可以看到,minDis=20之后,角点的数量明显减少,角点间距均大于等于20
在函数内部,大体的处理流程如下:
1)角点检测。可以通过harris或者shi-tomasi算法检测角点,获得eig特征值集合。
2)非极大值抑制。低于qualityLevel*特征值最大值的特征值被滤除;并且通过与膨胀后的特征值进行对比,局部最大值也会被滤除。
3)距离检测。挑选出符合距离要求的特征点。
后续将按照goodFeatureToTrack代码流程,分析各个算法具体实现。
【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代码流程,分析各个算法具体实现。
相关文章推荐
- CentOS 7.1安装Elasticsearch和Storm
- 从无到有:软件项目过程敏捷实践
- Linux内核编程实验二
- Flink on Hadoop 从零搭建
- tomcat 部署一个简单的 Java Servlet
- CentOS 7, lamp
- SharePoint 第一个网站
- Linux常用命令(持续更新)
- RHEL7安装部署Tomcat7
- PopupWindow,不消失
- AOP 那点事儿-----续集
- 20135327郭皓--Linux内核分析第九周 期中总结
- linux系统grep命令用法详解(二)
- linux系统grep命令用法详解(一)
- CentOS开通8080端口
- Linux获取pci设备的厂商号、设备号、class号
- Linux make方法安装文件是./configure问题解决方法
- Linux内核-中断机制个人理解
- Linux常用快捷键
- OpenStack中消息队列(RabbitMQ)分析