opencv特征检测与匹配

特征点的检测与匹配,在物体识别,视觉追踪,三维重建领域都有很广泛的应用 ,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

};

};

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

猜你喜欢

转载自blog.csdn.net/xujaiwei/article/details/74857414