※注:参数SURF中的hessian阈值是图像Hessian矩阵判别式的阈值,值越大检测出的特征点就越少,也就意味着特征点越稳定
1 #include "opencv2/core/core.hpp"
2 #include "opencv2/features2d/features2d.hpp"
3 #include "opencv2/highgui/highgui.hpp"
4 #include "opencv2/nonfree/nonfree.hpp"
5 #include <iostream>
6 using namespace cv;
7
8
9 //-----------------------------------【全局函数声明部分】--------------------------------------
10 // 描述:全局函数的声明
11 //-----------------------------------------------------------------------------------------------
12 static void ShowHelpText( );//输出帮助文字
13
14 //-----------------------------------【main( )函数】--------------------------------------------
15 // 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
16 //-----------------------------------------------------------------------------------------------
17 int main( int argc, char** argv )
18 {
19 //【0】改变console字体颜色
20 system("color 2F");
21 //【0】显示帮助文字
22 ShowHelpText( );
23
24 //【1】载入源图片并显示
25 Mat srcImage1 = imread("1.jpg", 1 );
26 Mat srcImage2 = imread("2.jpg", 1 );
27 if( !srcImage1.data || !srcImage2.data )//检测是否读取成功
28 { printf("读取图片错误,请确定目录下是否有imread函数指定名称的图片存在~!
");
29 return false;
30 }
31
32
33 //【2】定义需要用到的变量和类
34 int minHessian = 4000;//定义SURF中的hessian阈值特征点检测算子
35 SurfFeatureDetector detector( minHessian );//定义一个SurfFeatureDetector(SURF) 特征检测类对象
36 vector<KeyPoint> keypoints_1, keypoints_2;//vector模板类是能够存放任意类型的动态数组,能够增加和压缩数据
37
38 //【3】调用detect函数检测出SURF特征关键点,保存在vector容器中
39 detector.detect( srcImage1, keypoints_1 );
40 detector.detect( srcImage2, keypoints_2 );
41
42 //【4】绘制特征关键点.
43 Mat img_keypoints_1; Mat img_keypoints_2;
44 drawKeypoints( srcImage1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
45 drawKeypoints( srcImage2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
46
47 //【5】显示效果图
48 imshow("特征点检测效果图1", img_keypoints_1 );
49 imshow("特征点检测效果图2", img_keypoints_2 );
50
51 waitKey(0);
52 return 0;
53 }
54
55
56 //-----------------------------------【ShowHelpText( )函数】----------------------------------
57 // 描述:输出一些帮助信息
58 //----------------------------------------------------------------------------------------------
59 void ShowHelpText()
60 {
61 //输出欢迎信息和OpenCV版本
62 printf("
非常感谢购买《OpenCV3编程入门》一书!
");
63 printf("
此为本书OpenCV2版的第89个配套示例程序
");
64 printf("
当前使用的OpenCV版本为:" CV_VERSION );
65 printf("
----------------------------------------------------------------------------
");
66 //输出一些帮助信息
67 printf("
欢迎来到【SURF特征点检测】示例程序
");
68 printf( "
按键操作说明:
"
69 " 键盘按键任意键- 退出程序
" );
70
71 }