OpenCV中特征点提取和匹配的通用方法

OpenCV在新版本中把很多C语言的代码都重新整理成了C++代码,让我们在使用的时候更加方便灵活。其中对于特征点的提取和匹配,充分体现了C++的强大。下面直接用例子来说明。假设我们有两幅图:1.bmp和2.bmp,要从中提取体征点并匹配,代码如下:

// Load image from file

IplImage *pLeftImage = cvLoadImage("1.bmp", CV_LOAD_IMAGE_GRAYSCALE);
IplImage *pRightImage = cvLoadImage("2.bmp", CV_LOAD_IMAGE_GRAYSCALE);

// Convert IplImage to cv::Mat

Mat matLeftImage = Mat(pLeftImage, false); // Do not copy
Mat matRightImage = Mat(pRightImage, false);

// Key point and its descriptor

vector<KeyPoint> LeftKey;
vector<KeyPoint> RightKey;

Mat LeftDescriptor;
Mat RightDescriptor;

vector<DMatch> Matches;

// Detect key points from image

FeatureDetector *pDetector = new SurfFeatureDetector; // 这里我们用了SURF特征点
pDetector->detect(matLeftImage, LeftKey);
pDetector->detect(matRightImage, RightKey);

delete pDetector;

// Extract descriptors

DescriptorExtractor *pExtractor = new SurfDescriptorExtractor; // 提取SURF描述向量
pExtractor->compute(matLeftImage, LeftKey, LeftDescriptor);
pExtractor->compute(matRightImage, RightKey, RightDescriptor);

delete pExtractor;

// Matching features

DescriptorMatcher *pMatcher = new FlannBasedMatcher; // 使用Flann匹配算法
pMatcher->match(LeftDescriptor, RightDescriptor, Matches);

delete pMatcher;

// Show result

Mat OutImage;
drawMatches(matLeftImage, LeftKey, matRightImage, RightKey, Matches, OutImage);
cvNamedWindow( "Match features", 1);
cvShowImage("Match features", &(IplImage(OutImage)));
cvWaitKey( 0 );
cvDestroyWindow( "Match features" );

从上面的代码可以看见,用OpenCV来做特征提取匹配相当简便,出去读图和显示结果的代码,真正核心的部分只有3段代码,分别是检测关键点,提取描述向量和特征匹配,一共只有11行代码。

在我的示例代码中,使用的是SURF特征,而在OpenCV中,实现了很多种特征,如SIFT,FAST等,这些特征的实现各不相同,但是都是从一个公共抽象基类派生出来的,因此可以用多态方便地切换特征提取算法。下面我将详细地说明。

1 FeatureDetector

FeatureDetector是关键点检测类的抽象基类,其已经实现的具体类有:

class FastFeatureDetector

class GoodFeaturesToTrackDetector

class MserFeatureDetector

class StarFeatureDetector

class SiftFeatureDetector

class SurfFeatureDetector

要使用某一种检测器,可以直接调用FeatureDetector的工厂来创建,该工厂是一个静态方法,如下:

// Create feature detector by detector name.
static Ptr<FeatureDetector> create( const string& detectorType );

也可以像我的示例代码中那样显式的创建,如下:

FeatureDetector *pDetector = new SurfFeatureDetector;

可以用swich实现在多种方法中切换。

2 DescriptorExtractor

DescriptorExtractor是提取关键点的描述向量类抽象基类,其具体类有:

class SiftDescriptorExtractor

class SurfDescriptorExtractor

class CalonderDescriptorExtractor

class BriefDescriptorExtractor

class OpponentColorDescriptorExtractor

要使用某一种描述向量,可以调用DescriptorExtractor的工厂来创建,静态方法如下:

static Ptr<DescriptorExtractor> create( const string& descriptorExtractorType );

也可以像我的示例代码中那样显式的创建,如下:

DescriptorExtractor *pExtractor = new SurfDescriptorExtractor;

可以用swich实现在多种方法中切换。

3 DescriptorMatcher

DescriptorMatcher是匹配器的抽象基类,其具体类有:

class BruteForceMatcher

class FlannBasedMatcher

匹配器可以由静态工厂方法直接创建,如下:

static Ptr<DescriptorMatcher> create( const string& descriptorMatcherType );

也可以像我的示例代码中那样显式的创建,如下:

DescriptorMatcher *pMatcher = new FlannBasedMatcher;

可以用swich实现在多种方法中切换。

多态的使用,可以让我们对不同的特征采用相同的代码来编程,这是OpenCV设计的一种策略模式,大大地简化了代码量,并增加了灵活性,让我们可以在多种特征提取和匹配方法之间自由切换。

时间: 2024-11-04 14:12:47

OpenCV中特征点提取和匹配的通用方法的相关文章

Opencv 各种特征点提取和匹配

opencv 特征点的提取和匹配 1. 当中的数据结构 KeyPoint这数据结构中有如下数据结构: class KeyPoint { Point2f pt; //坐标 float size; //特征点邻域直径 float angle; //特征点的方向,值为[零,三百六十),负值表示不使用 float response; int octave; //特征点所在的图像金字塔的组 int class_id; //用于聚类的id angle:角度,表示关键点的方向,SIFT算法通过对关键点周围邻域

使用Opencv2.4.9进行SIFT特征点提取和匹配

主要使用的类:FeatureDetector FeatureExtractor FeatureMatcher#include <opencv2/core/core.hpp> ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <em id="__mceDel">

C#中使用正则表达式提取超链接地址的集中方法

一般在做爬虫或者CMS的时候经常需要提取 href链接或者是src地址.此时可以使用正则表达式轻松完成. Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>"); MatchCollection mc = reg.Ma

C#中使用正则表达式提取超链接地址的集中方法(转)

一般在做爬虫或者CMS的时候经常需要提取 href链接或者是src地址.此时可以使用正则表达式轻松完成. Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>"); MatchCollection mc = reg.Ma

在source insight project中删除文件夹或者文件的通用方法

1.删除文件夹或者文件在硬盘上的数据 2.project->synchronize files...看到如下图,然后勾选remove missing files from project

OpenCV中feature2D学习——FAST特征点检测与SIFT/SURF/BRIEF特征提取与匹配

在前面的文章<OpenCV中feature2D学习--FAST特征点检测>中讲了利用FAST算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测,并结合SIFT/SURF/BRIEF算子进行特征点提取和匹配. I.结合SIFT算子进行特征点提取和匹配 由于数据类型的不同,SIFT和SURF算子只能采用FlannBasedMatcher或者BruteForceMatcher来进行匹配(参考OpenCV中feature2D学习--BFMatcher和FlannBasedMatcher).

opencv中 Mat矩阵申明形式

在调用opencv的时候,可能不像matlab那样直接就可以 新建矩阵.在C++中需要严格的定义矩阵形式: 在opencv中一共有显示创建Mat对象的方法: 一.使用mat()构造函数: 上图中可以发现,首先要先定义其图像尺寸 (2*3,宽为2  高为3 ).即图像的行数和列数:然后制定存储袁术的数据类型以及每个矩阵点的通道数,是浮点型存储还是字符型,是三通道还是单通道:     例如: CV_8UC3   就是代表的8位 的unsigned char 型 ,每个像素是由三个元素组成的三通道:

OpenCV之特征检测器(Feature Detector),描述子提取器(Descriptor Extractor)和描述子匹配器(Descriptor Matcher)

1.特征检测子 -Harris cv::cornerHarris(image,strength,3,3,0.01); -Fast cv::Ptr<cv::FastFeatureDetector> fast = cv::FastFeatureDetector::create(); //或 cv::FAST(InputArray image, std::vector<KeyPoint> &keypoints, int threshold) //或 cv::FAST(InputA

OpenCV中的模板匹配方法及其应用

模板匹配(TemplateMatching)就是在一幅图像中寻找和模板图像(template)最相似的区域,该方法原理简单计算速度快,能够应用于目标识别,目标跟踪等多个领域.OpenCV中对应的函数为matchTemplate或cvMatchTemplate(参考opencvdoc),简单介绍下: 1.函数原型 C++: void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method);