- 官网下载opencv(for Linux)和opencv_contrib。opencv版本:3.4.1
- 编译安装。编译选项为:
cmake -D OPENCV_EXTRA_MODULES_PATH=<opencv_contrib_path>/modules -D CMAKE_BUILD_TYPE=Release -D WITH_CUDA=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..
- 我遇到了CUDA相关的错误,然后参考这篇博文解决之。
- 构建工程时,CMakeLists.txt中添加
include_directories("/usr/local/include/x86_opencv2/xfeatures2d")
整体如下:
cmake_minimum_required(VERSION 3.5) project(cvtest) set(CMAKE_CXX_STANDARD 11) include_directories("/usr/local/include/x86_opencv2/xfeatures2d") find_package(OpenCV REQUIRED) if (OPENCV_FOUND) message(STATUS "找到OpenCV: ${OpenCV_INCLUDE_DIRS}") message(STATUS "找到OpenCV: ${OpenCV_LIBS}") include_directories(${OpenCV_INCLUDE_DIRS}) endif (OPENCV_FOUND) add_executable(cvtest cvtest.cpp) target_link_libraries(cvtest ${OpenCV_LIBS} )
- 源文件中包含nonfree.hpp,引用命名空间xfeatures2d。整体如下:
- 具体的opencv3中的特征检测用法,可以参考这篇博文。
代码参考了毛星云的教程,感谢以上提及的共享资料。
//---------------------------------【头文件、命名空间包含部分】----------------------------
// 描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include "opencv2/opencv.hpp"
#include <nonfree.hpp>
using namespace cv;
using namespace xfeatures2d;
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
//【1】载入源图片并显示
Mat srcImage1 = imread("../1.jpg", 1 );
Mat srcImage2 = imread("../2.jpg", 1 );
if( !srcImage1.data || !srcImage2.data )//检测是否读取成功
{ printf("读取图片错误,请确定目录下是否有imread函数指定名称的图片存在~! \n"); return false; }
imshow("src1",srcImage1);
imshow("src2",srcImage2);
//【2】定义需要用到的变量和类
int minHessian = 400;//定义SURF中的hessian阈值特征点检测算子
Ptr<SURF> detector = SURF::create(minHessian);
// SurfFeatureDetector detector( minHessian );//定义一个SurfFeatureDetector(SURF) 特征检测类对象
std::vector<KeyPoint> keypoints_1, keypoints_2;//vector模板类是能够存放任意类型的动态数组,能够增加和压缩数据
//【3】调用detect函数检测出SURF特征关键点,保存在vector容器中
detector->detect( srcImage1, keypoints_1 );
detector->detect( srcImage2, keypoints_2 );
//【4】绘制特征关键点.
Mat img_keypoints_1; Mat img_keypoints_2;
drawKeypoints( srcImage1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
drawKeypoints( srcImage2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
//【5】显示效果图
imshow("dst 1", img_keypoints_1 );
imshow("dst 2", img_keypoints_2 );
waitKey(0);
return 0;
}