使用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">#include <opencv2/highgui/highgui.hpp> 

#include <opencv2/features2d/features2d.hpp>

#include <opencv2/nonfree/nonfree.hpp>

#include <iostream>

using
namespace cv;

using
namespace std;

int main(){

    cv::initModule_nonfree();

    Mat img1_mat = imread("1.bmp",CV_LOAD_IMAGE_GRAYSCALE);

    Mat img2_mat = imread("2.bmp",CV_LOAD_IMAGE_GRAYSCALE);

    

    std::vector<KeyPoint> img1_keypoint,img2_keypoint;<br>

        /*特征点检测*/

//  FeatureDetector *sift_detector = FeatureDetector::create("SIFT");

    Ptr<FeatureDetector> sift_detector = FeatureDetector::create("SIFT");

    sift_detector->detect(img1_mat,img1_keypoint);

    sift_detector->detect(img2_mat,img2_keypoint);<br>

    /*在图片上显示特征点*/

    Mat img_kp_1,img_kp_2;

    drawKeypoints(img1_mat,img1_keypoint,img_kp_1,Scalar::all(-1),DrawMatchesFlags::DEFAULT);

    drawKeypoints(img2_mat,img2_keypoint,img_kp_2,Scalar::all(-1),DrawMatchesFlags::DEFAULT);

    imshow("sift_keypoint_image 1",img_kp_1);

    imshow("sift_keypoint_image 2",img_kp_2);<br>

        /*特征向量提取*/

    Mat img1_descriptor,img2_descriptor;

    Ptr<DescriptorExtractor> sift_descriptor_extractor = DescriptorExtractor::create("SIFT");

    sift_descriptor_extractor->compute(img1_mat,img1_keypoint,img1_descriptor);

    sift_descriptor_extractor->compute(img2_mat,img2_keypoint,img2_descriptor);

        /*特征点匹配*/

    std::vector<DMatch> img_match;

    Ptr<DescriptorMatcher> bruteforce_matcher = DescriptorMatcher::create("BruteForce");

    bruteforce_matcher->match(img1_descriptor,img2_descriptor,img_match);

        /*在图片上显示匹配结果*/

    Mat match_img;

    drawMatches(img1_mat,img1_keypoint,img2_mat,img2_keypoint,accurate_match,match_img);

    imshow("match image",match_img);

    waitKey(0);

    system("pause");

    return
0;

}

</em>

 需要注意的地方:

如果完全按老版本的opencv的写法会出现下图中Access violation的异常,解决方法如下:

1.在新版本的opencv中,像SIFT,SURF等专利方法放在了单独的模块中,使用前需

  a) include <opencv2/nonfree/nonfree.hpp>

  b) 使用前添加语句 cv::initModule_nonfree()

  c) 在链接库中添加 opencv_nonfree2.4.9.lib,一般在配置opencv时已经添加

2.FeatureDetector 等是三个抽象基类,不能直接实例化,也不能直接使用 *,必须用Ptr<>的方式来使用

 Ptr<FeatureDetector>
sift_detector = FeatureDetector::create("SIFT");

运行结果如下:

时间: 2024-10-13 15:34:15

使用Opencv2.4.9进行SIFT特征点提取和匹配的相关文章

SIFT特征点提取

一. SIFT算法 1.算法简介 尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法.它用来侦测与描述影像中的局部性特征, 它在空间尺度中寻找极值点,并提取出其位置.尺度.旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结. 其应用范围包含物体辨识.机器人地图感知与导航.影像缝合.3D模型建立.手势辨识.影像追踪和动作比对. 局部影像特征的描述与侦测可以帮助辨识物体,SIFT特征是基于物体上的一些

Opencv 各种特征点提取和匹配

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

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

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

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

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

基于SIFT特征的全景图像拼接

基于SIFT特征的全景图像拼接 分类: image Machine learning2013-07-05 13:33 2554人阅读 评论(3) 收藏 举报 基于SIFT特征的全景图像拼接 分类: 计算机视觉/OpenCV2013-07-04 21:43 91人阅读 评论(0) 收藏 举报 主要分为以下几个步骤: (1) 读入两张图片并分别提取SIFT特征 (2) 利用k-d tree和BBF算法进行特征匹配查找 (3) 利用RANSAC算法筛选匹配点并计算变换矩阵 (3) 图像融合 SIFT算

SIFT特征原理简析(HELU版)

SIFT(Scale-Invariant Feature Transform)是一种具有尺度不变性和光照不变性的特征描述子,也同时是一套特征提取的理论,首次由D. G. Lowe于2004年以<Distinctive Image Features from Scale-Invariant Keypoints[J]>发表于IJCV中.开源算法库OpenCV中进行了实现.扩展和使用. 本文主要依据原始论文和网络上相关专业分析,对SIFT特征提取的算法流程进行简单分析.由于涉及到的知识概念较多,本人

OpenCV2.4.4中调用SIFT特征检测器进行图像匹配

OpenCV中一些相关结构说明: 特征点类: class KeyPoint { Point2f pt; //坐标 float size; //特征点邻域直径 float angle; //特征点的方向,值为[0,360),负值表示不使用 float response; // int octave; //特征点所在的图像金字塔的组 int class_id; //用于聚类的id } 存放匹配结果的结构: 1 struct DMatch 2 { 3 //三个构造函数 4 DMatch(): quer

[Computer Vision] SIFT特征学后感

SIFT(Scale Invariant Feature Transform),尺度空间不变特征,目前手工设计的最好vision特征. 以下是学习http://blog.csdn.net/zddblog/article/details/7521424后的收获. 一.尺度空间 gaussian pyramid的产生: 1.为避免对第一组第一层图片(原始图片)做高斯滤波导致损失,在其基础上将尺度扩大一倍作为-1层,方法是用=0.5做高斯滤波. 2.对每组(octave)倒数第三张图片做降采样,产生下

Sift特征

Sift特征 Sift特征包含两个部分,一个是关键点(frame或者keypoint),另外一个就是在关键点处的描述子(descriptor,或者Keypoint descriptor) 在面部特征点的检测中,经常提取Sift特征.这里的Sift特征指的就是Sift描述子,在一个点处提取的Sift特征一般为128维,即4*4*8=128,4*4表示4*4的区域,8表示每个区域统计的方向. 在Vfleat中:frame 表示Keypoint,descriptor 表示Keypoint descri