OpenCV
开源计算机视觉库
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
特征检测

上一教程: 亚像素级角点检测
下一教程: 特征描述

原作者Ana Huamán
兼容性OpenCV >= 3.0

目标

在本教程中,你将学习如何:

警告
你需要 OpenCV contrib 模块 才能使用 SURF 特征(替代方案是 ORB、KAZE 等特征)。

理论

代码

本教程代码如下所示。你也可以从 这里 下载。

#include <iostream>
#include "opencv2/core.hpp"
#ifdef HAVE_OPENCV_XFEATURES2D
using namespace cv;
using namespace cv::xfeatures2d;
using std::cout;
using std::endl;
int main( int argc, char* argv[] )
{
CommandLineParser parser( argc, argv, "{@input | box.png | input image}" );
Mat src = imread( samples::findFile( parser.get<String>( "@input" ) ), IMREAD_GRAYSCALE );
if ( src.empty() )
{
cout << "Could not open or find the image!\n" << endl;
cout << "Usage: " << argv[0] << " <Input image>" << endl;
return -1;
}
//-- 步骤 1:使用 SURF 检测器检测关键点
int minHessian = 400;
Ptr<SURF> detector = SURF::create( minHessian );
std::vector<KeyPoint> keypoints;
detector->detect( src, keypoints );
//-- 绘制关键点
Mat img_keypoints;
drawKeypoints( src, keypoints, img_keypoints );
//-- 显示检测到的(绘制的)关键点
imshow("SURF Keypoints", img_keypoints );
waitKey();
return 0;
}
#else
int main()
{
std::cout << "运行此教程代码需要 xfeatures2d contrib 模块。" << std::endl;
return 0;
}
#endif
用于命令行解析。
定义 utility.hpp:890
n 维密集数组类
定义 mat.hpp:829
bool empty() const
如果数组没有元素,则返回 true。
std::string String
定义 cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 xfeatures2d.hpp:67
定义 core.hpp:107

说明

结果

  1. 以下是将特征检测应用于box.png图像的结果
  1. 以下是box_in_scene.png图像的结果