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

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

};

};

#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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: