SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。
SIFT的尺度不变特征变换在图像特征点匹配中十分关键,因为我们从不同角度拍摄一个物体,物体的尺寸多少都会发生变化。但是在正常情况下我们链接的opencv库里面并没有包含这个算法,需要我们主动重新配置一遍。

使用环境:Ubuntu16_Qt_C++_opencv3.2.0_opencvcontrib3.2.0

1.卸载之前make配置的opencv
 rm -rf /usr/local
/usr/local为之前make文件的默认路径,如果之前有设置为其它路径,则卸载相对应的路径下的文件夹

2.在官网下载opencv和opencv_contrib并解压,注意两者要同一个版本。笔者使用的版本时3.2.0。
笔者在尝试了许多不同版本后,发现3.4以上的版本似乎因为版权原因,在最后成功make并在.pro文件链接上后,虽然能inculde <xfeature2d.hpp>,并且在使用SIFT类使能够自动补全,但是在运行时还是会报错。
报错的具体内容如下:The function/feature is not implemented) This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function ‘cv::xfeatures2d::SIFT::create’。
然后根据其提示,笔者也发现即使CMake时勾选上OPNECV_ENABLE_NONFREE,也还是会报同样的错。最后才发现原来是版本的问题,在选择3.4以前的版本似乎就不会出现这个报错。笔者推测应该是opencv开发人员在更新3.4的版本上在nonfree.hpp加入了一点内容,即如果判断没有版权,则输出这段报错内容,可能可以通过修改一下这个头文件来实现在3.4以上的版本使用SIFT等算法。

3.解压完毕之后,首先是下载一些依赖包,不过在之前配置opencv的时候已经下载过了,所以直接跳过,然后就是通过cmake-gui界面进行make
mkdir build //在opencv3.4的文件夹下新建一个build文件夹
cd build
cmake-gui .. //打开cmake-gui图形界面
source的路径为你的opencv文件夹的路径,build即你新建的build文件夹的路径,填写好后configure,configure界面的选项按默认的来即可

configure之后再添加OPENCV_EXTRA_MOUDULES_PATH的路径,即为你下载的opencv_contrib文件夹里面的moudules文件夹

CMAKE_BUILD_TYPE里面填RELEASE

然后点击generate,成功之后回到命令行界面的build路径下
输入make命令
笔者在make过程中会遇到类似如下报错

翻译过来就是缺少***.i文件,解决方案就是手动将该文件下载,然后放到这个路径下,然后重新输入make命令即可。
具体的.i文件下载需要特殊的方法,可以直接用我已经下载的现成的( ̄▽ ̄)"
链接:https://pan.baidu.com/s/11qltgnkuElInOKGVOr0SAg
提取码:stw1
复制这段内容后打开百度网盘手机App,操作更方便哦!

 另一种类型的报错就是缺少.hpp文件啦,这种错误中缺失的.hpp文件我们可以在本地的硬盘里面找到,然后手动复制粘贴这个.hpp文件。但这里比较特殊,需要在上一级目录即detail文件夹下,新建opencv2文件夹,然后再在opencv2文件夹里新建xfeatures2d文件夹,最后在xfeatures2d文件夹下粘贴cuda.hpp,然后重新输入make命令即可(哈哈,是不是很奇怪,但好像就是这样才行,不要问我是怎么知道的≡(▔﹏▔)≡)

解决了上面两种报错的类型,基本上就可以make成功了

4.make成功后你可以在/usr/local目录下看到成功下载的文件,然后就是在Qt链接你成功下载的文件啦。具体就是新建项目,在.pro文件最后添加如下文本
INCLUDEPATH += /usr/local/include \
               /usr/local/include/opencv \
               /usr/local/include/opencv2

LIBS += /usr/local/lib/lib*
5.然后就可以使用SIFT等类啦┗|`O′|┛ 嗷~~

最新文章

  1. Linux C++中的时间函数(转)
  2. 解决错误: java.lang.NoClassDefFoundError: antlr/RecognitionException
  3. Android5.0新特性——新增的Widget(Widget)
  4. wifi配置常用命令总结
  5. 二师兄VPN加速器
  6. 重构MVC多条件分页解决方案
  7. mapreduce 依赖组合
  8. Windows as a Service(1)—— Windows 10服务分支
  9. Appium python
  10. CSS3概述
  11. [转帖]SAP一句话入门:Project System
  12. 【Spark调优】:结合业务场景,优选高性能算子
  13. kettle用mysql创建资源库执行sql代码报错
  14. 《Linux内核分析》第五周学习总结 扒开系统调用的三层皮(下)
  15. iOS开发中多线程断点下载大文件
  16. Hadoop生态圈-hbase常用命令
  17. serialport控件的详细用法
  18. 手工编写servlet
  19. HTML5 开发APP 第一章
  20. Linux测网速

热门文章

  1. Redis 设计与实现 6:五大数据类型之字符串
  2. 使用pdf2htmlEX将pdf文件转为html
  3. MongoDb学习(四)--Repository----语法关键字
  4. KafkaProducer 简析
  5. 使用sqlmap
  6. 关于Byte(1) 与int (1) 比较原理
  7. Linux 时间同步 01 简介
  8. C++ string的内部究竟是什么样的?
  9. git merge了错误分支,如何优雅的回退到merge前的状态?
  10. Elasticsearch java api操作(二)(Java High Level Rest Client)