opencv特征检测与匹配
2017-07-09 09:59
585 查看
特征点的检测与匹配,在物体识别,视觉追踪,三维重建领域都有很广泛的应用 ,Opencv 提供了如下几种特征检测方法
“FAST”—–FastFeaturedector
“STAR”—–StartFeaturedector
“SIFT”——SIFTF(nonfree module)
“SURF”—–SURF(nonfree module)
“ORB”—–ORB
“MSER”–MSER
“GFTI”—–GoodFeaturesToTrackDector
“HARRIS”—-配合Harrisdector
“Dense”——DenseFeatureDector
“SimpleBlob”—-SimpleBlobDector
对SIFT和SURF做简单介绍,需要说明的是在Opencv3版本中,许多著名的特征检测算子(如SIFT SURT ORB)稳定版的源代码都已经从官方发行的Opencv3中移除,而转移到一个名为xfeature的第三方库中,所以使用Opencv3要注意
1)SIFT特征检测
尺度不变特征变换 ,SIFT特征对旋转,尺度缩放,亮度变化等保持不变性,是非常稳定的局部特征,现在应用很广泛
Harris角点检测,特征具有旋转不变性,即使图像发生旋转,我们也能找到同样的角点,但是如果对图像进行缩放,角点就可能不是角点了,所以
资料讲解就不写了
这个算法受专利保护,这个算法包含在Opencv的收费模块
2)Opencv中的SIFT算法接口
构造函数
explicit SIFT(int nfeatures=0,int noOctveLayers=3,double contrastThreshold=0.04,double edgeThreshold=10,double sigma=1.6)
&&nfeatures:特征点数目(算法对检测出的特征点排名,返回最好的nfeatures个特征点)
&&nOctavelayers:金字塔中每组的层数
&&contrastThreshold:过滤掉较差的特征点的对比阈值,越大,返回的特征点就越少
&&edgeThreshold:过滤掉边缘效用的阈值,越大,特征点越多(被多滤掉的越少)
&&sigma:金字塔第零层图像的高斯滤波系数
重载操作符
void operator()(InputArray img,InputArray mask,vector&keypoints)const;
&&img:8位灰度图像
&&mask:需要检测图像的掩码(可选)
&&keypoints:检测到的特征点
&&descriptors:特征点描述的输出向量(如果不需要输出,需要传cv::noArray())
&&useProvidedKeypoints:
KeyPoint类-特征点检测相关的数据结果,用来表示特征点
class KeyPoint
{
Point2f pt;//坐标
float size;//特征点邻域直径
float angle;//特征点的方向:值为(0,360)负值表示不使用
float response;
int octave;//特征点所在的图像金字塔的组
int class_id ;//用来聚类的id
}
绘制关键点 drawKeypoints(const Mat &image,const vector&Keypointd,CV_OUT Mat&outImage,const Scalar &color=Scalar::all(-1),int flags=DreawMatchesFlags::DEFAULT)
&&image:输入图像
&&Keypoints:根据原图像得到的特征点
&&outImage:输出图像,其内容取决于第五个参数标识符flags
&&color:所绘制关键点的颜色
&&flags:绘制关键点的特征标识符,默认值为DrawMatchsFlags::DEFAULT 其他
struct CV_EXPORTS DrawMatchesFlags
{
enum
{
DEFAUIT=0,
DRAW_OVER_OUTIMG=1
NOT_DRAW_SINGLE_POINTS=2
DRAW_RICH_KEYPOINTS=4
};
};
“FAST”—–FastFeaturedector
“STAR”—–StartFeaturedector
“SIFT”——SIFTF(nonfree module)
“SURF”—–SURF(nonfree module)
“ORB”—–ORB
“MSER”–MSER
“GFTI”—–GoodFeaturesToTrackDector
“HARRIS”—-配合Harrisdector
“Dense”——DenseFeatureDector
“SimpleBlob”—-SimpleBlobDector
对SIFT和SURF做简单介绍,需要说明的是在Opencv3版本中,许多著名的特征检测算子(如SIFT SURT ORB)稳定版的源代码都已经从官方发行的Opencv3中移除,而转移到一个名为xfeature的第三方库中,所以使用Opencv3要注意
1)SIFT特征检测
尺度不变特征变换 ,SIFT特征对旋转,尺度缩放,亮度变化等保持不变性,是非常稳定的局部特征,现在应用很广泛
Harris角点检测,特征具有旋转不变性,即使图像发生旋转,我们也能找到同样的角点,但是如果对图像进行缩放,角点就可能不是角点了,所以
资料讲解就不写了
这个算法受专利保护,这个算法包含在Opencv的收费模块
2)Opencv中的SIFT算法接口
构造函数
explicit SIFT(int nfeatures=0,int noOctveLayers=3,double contrastThreshold=0.04,double edgeThreshold=10,double sigma=1.6)
&&nfeatures:特征点数目(算法对检测出的特征点排名,返回最好的nfeatures个特征点)
&&nOctavelayers:金字塔中每组的层数
&&contrastThreshold:过滤掉较差的特征点的对比阈值,越大,返回的特征点就越少
&&edgeThreshold:过滤掉边缘效用的阈值,越大,特征点越多(被多滤掉的越少)
&&sigma:金字塔第零层图像的高斯滤波系数
重载操作符
void operator()(InputArray img,InputArray mask,vector&keypoints)const;
&&img:8位灰度图像
&&mask:需要检测图像的掩码(可选)
&&keypoints:检测到的特征点
&&descriptors:特征点描述的输出向量(如果不需要输出,需要传cv::noArray())
&&useProvidedKeypoints:
KeyPoint类-特征点检测相关的数据结果,用来表示特征点
class KeyPoint
{
Point2f pt;//坐标
float size;//特征点邻域直径
float angle;//特征点的方向:值为(0,360)负值表示不使用
float response;
int octave;//特征点所在的图像金字塔的组
int class_id ;//用来聚类的id
}
绘制关键点 drawKeypoints(const Mat &image,const vector&Keypointd,CV_OUT Mat&outImage,const Scalar &color=Scalar::all(-1),int flags=DreawMatchesFlags::DEFAULT)
&&image:输入图像
&&Keypoints:根据原图像得到的特征点
&&outImage:输出图像,其内容取决于第五个参数标识符flags
&&color:所绘制关键点的颜色
&&flags:绘制关键点的特征标识符,默认值为DrawMatchsFlags::DEFAULT 其他
struct CV_EXPORTS DrawMatchesFlags
{
enum
{
DEFAUIT=0,
DRAW_OVER_OUTIMG=1
NOT_DRAW_SINGLE_POINTS=2
DRAW_RICH_KEYPOINTS=4
};
};
#include <opncv2/nofree.nonfree.hpp>//要加这个 Mat srcImg1=imread("00.jpg"); Mat srcImg2=imread("01.jpg"); //定义SIFT特征类对象 SiftFeatureDector siftDector1; siftFeatureDectoe siftDector2;; //定义KeyPoint变量 vector<KeyPoint>keyPoints1; vector<KeyPoint>KeyPoints2; //特征点检测 siftDector1.detect(srcImg1,keyPoints1); siftDector2.detect(srcImg2,keyPoints2); //绘制特征点(关键点) Mat feature_pic1,feature_pic2; drawKeypoints(srcImg1,KeyPoints1,feature_pic1,Scalar(0,0,255)); drawKeypoints(srcImg1,keyPoints2,feature_pic2,Scalar(0,0,255)); //drawKeypoints(srcImg1,keyPoints1,feature_pic1,Scalar(0,255,0),DrawMatchesFlags::DRAW_TICH_KEYPOINTS); imshow("src1",srcImg1); imshow("src2",srcImg2); //显示结果 imshow("feature1",feature_pic1); imshow("feature2",feature_pic2); waitKey(0);
相关文章推荐
- OpenCV学习笔记__特征检测与匹配之 SURF算法
- OpenCV特征点检测匹配图像-----添加包围盒
- OpenCV学习之旅9——特征检测与匹配(2)
- OpenCV:特征点检测与图像匹配
- OpenCV中ORB特征点检测和匹配简单用法
- OpenCV成长之路(9):特征点检测与图像匹配
- opencv学习之 特征检测与匹配
- OpenCV中特征检测和特征匹配方法
- OpenCV学习之旅9——特征检测与匹配(1)
- OpenCV--特征点检测与图像匹配
- OpenCV中特征检测,提取与匹配使用方法学习
- OpenCV特征点检测匹配图像-----添加包围盒
- opencv之特征检测与匹配
- OpenCV中特征检测,提取与匹配使用方法学习
- OpenCV: 特征点检测与图像匹配
- OpenCV成长之路(9):特征点检测与图像匹配
- OpenCV成长之路:特征点检测与图像匹配
- opencv3 特征检测与匹配及寻找目标
- OpenCV成长之路(9):特征点检测与图像匹配
- openCV中的特征点检测、描述子计算、特征匹配的一些类