目录
概述
BruteForce匹配法
FLANN匹配法
拓展
首页 数据库 mysql教程 OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配

OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配

Jun 07, 2016 pm 03:43 PM
opencv 学习

概述 之前的文章SURF和SIFT算子实现特征点检测简单地讲了利用SIFT和SURF算子检测特征点,在检测的基础上可以使用SIFT和SURF算子对特征点进行特征提取并使用匹配函数进行特征点的匹配。具体实现是首先采用SurfFeatureDetector检测特征点,再使用SurfDescripto

概述

      之前的文章SURF和SIFT算子实现特征点检测简单地讲了利用SIFT和SURF算子检测特征点,在检测的基础上可以使用SIFT和SURF算子对特征点进行特征提取并使用匹配函数进行特征点的匹配。具体实现是首先采用SurfFeatureDetector检测特征点,再使用SurfDescriptorExtractor计算特征点的特征向量,最后采用BruteForceMatcher暴力匹配法或者FlannBasedMatcher选择性匹配法(二者的不同)来进行特征点匹配。

      实验所用环境是opencv2.4.0+vs2008+win7,需要注意opencv2.4.X版本中SurfFeatureDetector是包含在opencv2/nonfree/features2d.hpp中,BruteForceMatcher是包含在opencv2/legacy/legacy.hpp中,FlannBasedMatcher是包含在opencv2/features2d/features2d.hpp中。

BruteForce匹配法

首先使用BruteForceMatcher暴力匹配法,代码如下:

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

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

/**

* @采用SURF算子检测特征点,对特征点进行特征提取,并使用BruteForce匹配法进行特征点的匹配

* @SurfFeatureDetector + SurfDescriptorExtractor + BruteForceMatcher

* @author holybin

*/

 

#include <stdio.h>

#include <iostream>

#include "opencv2/core/core.hpp"

#include "opencv2/nonfree/features2d.hpp"   //SurfFeatureDetector实际在该头文件中

#include "opencv2/legacy/legacy.hpp"    //BruteForceMatcher实际在该头文件中

//#include "opencv2/features2d/features2d.hpp"  //FlannBasedMatcher实际在该头文件中

#include "opencv2/highgui/highgui.hpp"

using namespace cv;

using namespace std;

 

int main( int argc, char** argv )

{

    Mat src_1 = imread( "D:\\opencv_pic\\cat3d120.jpg", CV_LOAD_IMAGE_GRAYSCALE );

    Mat src_2 = imread( "D:\\opencv_pic\\cat0.jpg", CV_LOAD_IMAGE_GRAYSCALE );

 

    if( !src_1.data || !src_2.data )

    {

        cout keypoints_1, keypoints_2;

    detector.detect( src_1, keypoints_1 );

    detector.detect( src_2, keypoints_2 );

    cout &gt; matcher;

    vector matches;

    matcher.match( descriptors_1, descriptors_2, matches );

    cout<br>

 

<p>实验结果:</p>

<img  src="/static/imghw/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20141115151204375%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9seWJpbg%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&amp;refer=http%3A%2F%2Fblog.csdn.net%2Fu012564690%2Farticle%2Fdetails%2F17370511" class="lazy" alt="OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配" ><br>

<p><span><br>

</span></p>

 

<h1 id="span-FLANN匹配法-span"><span>FLANN匹配法</span></h1>

 

<p>使用暴力匹配的结果不怎么好,下面使用FlannBasedMatcher进行特征匹配,只保留好的特征匹配点,代码如下:</p>

 

<pre class="brush:php;toolbar:false">/**

* @采用SURF算子检测特征点,对特征点进行特征提取,并使用FLANN匹配法进行特征点的匹配

* @SurfFeatureDetector + SurfDescriptorExtractor + FlannBasedMatcher

* @author holybin

*/

 

#include <stdio.h>

#include <iostream>

#include "opencv2/core/core.hpp"

#include "opencv2/nonfree/features2d.hpp"   //SurfFeatureDetector实际在该头文件中

//#include "opencv2/legacy/legacy.hpp"  //BruteForceMatcher实际在该头文件中

#include "opencv2/features2d/features2d.hpp"    //FlannBasedMatcher实际在该头文件中

#include "opencv2/highgui/highgui.hpp"

using namespace cv;

using namespace std;

 

int main( int argc, char** argv )

{

    Mat src_1 = imread( "D:\\opencv_pic\\cat3d120.jpg", CV_LOAD_IMAGE_GRAYSCALE );

    Mat src_2 = imread( "D:\\opencv_pic\\cat0.jpg", CV_LOAD_IMAGE_GRAYSCALE );

 

    if( !src_1.data || !src_2.data )

    {

        cout keypoints_1, keypoints_2;

    detector.detect( src_1, keypoints_1 );

    detector.detect( src_2, keypoints_2 );

    cout allMatches;

    matcher.match( descriptors_1, descriptors_2, allMatches );

    cout maxDist )

            maxDist = dist;

    }

    printf("    max dist : %f \n", maxDist );

    printf("    min dist : %f \n", minDist );

 

    //-- 过滤匹配点,保留好的匹配点(这里采用的标准:distance goodMatches;

    for( int i = 0; i (),

        DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS //不显示未匹配的点

        );

    imshow("matching result", matchImg );

    //-- 输出匹配点的对应关系

    for( int i = 0; i <br>

 

<p>实验结果:</p>

<img  src="/static/imghw/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20141115151359125%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9seWJpbg%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&amp;refer=http%3A%2F%2Fblog.csdn.net%2Fu012564690%2Farticle%2Fdetails%2F17370511" class="lazy" alt="OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配" ><br>

<p><br>

</p>

 

<p>从第二个实验结果可以看出,经过过滤之后特征点数目从49减少到33,匹配的准确度有所上升。当然也可以使用SIFT算子进行上述两种匹配实验,只需要将SurfFeatureDetector换成SiftFeatureDetector,将SurfDescriptorExtractor换成SiftDescriptorExtractor即可。</p>

<p><br>

</p>

<h1 id="span-拓展-span"><span>拓展</span></h1>

 

<p>       在FLANN匹配法的基础上,还可以进一步利用透视变换和空间映射找出已知物体(目标检测),具体来说就是利用findHomography函数利用匹配的关键点找出相应的变换,再利用perspectiveTransform函数映射点群。具体可以参考这篇文章:OpenCV中feature2D学习——SIFT和SURF算法实现目标检测。</p>

<p><br>

</p>

 

 

</iostream></stdio.h>

登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

学会彻底卸载pip,使用Python更加高效 学会彻底卸载pip,使用Python更加高效 Jan 16, 2024 am 09:01 AM

学会彻底卸载pip,使用Python更加高效

使用pip软件包管理器快速安装OpenCV学习指南 使用pip软件包管理器快速安装OpenCV学习指南 Jan 18, 2024 am 09:55 AM

使用pip软件包管理器快速安装OpenCV学习指南

深入研究matplotlib的色彩映射表 深入研究matplotlib的色彩映射表 Jan 09, 2024 pm 03:51 PM

深入研究matplotlib的色彩映射表

OpenCV安装教程:PyCharm用户必看 OpenCV安装教程:PyCharm用户必看 Feb 22, 2024 pm 09:21 PM

OpenCV安装教程:PyCharm用户必看

揭秘C语言的吸引力: 发掘程序员的潜质 揭秘C语言的吸引力: 发掘程序员的潜质 Feb 24, 2024 pm 11:21 PM

揭秘C语言的吸引力: 发掘程序员的潜质

Pygame入门指南:全面安装和配置教程 Pygame入门指南:全面安装和配置教程 Feb 19, 2024 pm 10:10 PM

Pygame入门指南:全面安装和配置教程

一起学习word根号输入办法 一起学习word根号输入办法 Mar 19, 2024 pm 08:52 PM

一起学习word根号输入办法

新手请看:详细教程如何在PyCharm中安装OpenCV 新手请看:详细教程如何在PyCharm中安装OpenCV Feb 26, 2024 pm 03:24 PM

新手请看:详细教程如何在PyCharm中安装OpenCV

See all articles