1 错误原因

1.1 报错全部信息:

cv2.error: OpenCV(4.0.1) D:\Build\OpenCV\opencv_contrib-4.0.1\modules\xfeatures2d\src\sift.cpp:1207: error: (-213: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'

1.2 报错信息分解:

1、  cv2.error: OpenCV(4.0.1) D:\Build\OpenCV\opencv_contrib-4.0.1\modules\xfeatures2d\src\sift.cpp:1207:

错位代码定位

2、  error: (-213:The function/feature is not implemented)

error 代号,函数 / 功能无法实现

3、 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'

error 信息,该算法(SIFT)已经获得专利,在此配置中不包括,设置 OPENCV_ENABLE_NONFREE CMake 选项并在函数 ' cv :: xfeatures2d :: SIFT :: create ' 中重建库

2 修缮工程(守城)

该修改工程属于消极防御,记为守城之策。

2.1 方案一:安装opencv-contrib-python

采用 opencv-contrib-python 而非 opencv-python 。在 opencv-contrib-python 版本中含有额外模块( Extra modules ),而 opencv-python 版本中只含有基础模块。

网上有人说是 SIFT 申请了算法专利保护,所以就将 SIFT 放置在了 Extra modules 模块中,故安装 opencv-contrib-python 是能用的。

当然这个说法也是对的,官网【点击查看】上确实看到 Extra modules 中包含有  xfeatures2d. Extra 2D Features Framework 函数 / 功能。

2.2 方案二:版本问题

有人按照方案一操作,依据不可行,所以又出现了版本问题,确切地说 opencv-contrib-python 3.4.3.18 之前是有效的因为我在寻找解决办法时,好多解决办法都是降低版本至 3.4.3.16。完美解决该问题。但 - 但 - - 但 - - - 但这是2019 年 03 月 09 日。

由于我想的是越高的版本其算法应该会越好,bug 应该也越小。所以不想降低版本来实施运算;所以这个解决方案没有采用。

网上到处都是赋值粘贴的,也不注明出处。

2.3 方案三:按照报错信息去解决

写下一段插曲,算是反思吧。

查找原因顺序是,

1、先检索了报错代码,出现了方案一和方案二中的问题解决方案,这种方案撰写时间是在2018年下半年和2019年出现的,虽然并不是库文件版本越新越好,但是新版本的迭代优化总归是有所成效的。所以没有采用这些方案。

2、检索报错信息中的解决方案:Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'cv::xfeatures2d::SIFT::create'。出现了惊人的效果,真正的解决措施才徐徐拉开序幕.....

该修缮工程比较大,兹另起章节,详见下段 3。

3 修缮工程(攻城)

该修缮工程(实为上文的方案 3 ,在此段展开撰述)为积极攻伐,属为攻城之计。

3.1 下载安装包及工具

3.1.1 CMake

其实这个无所谓版本,我选择最新的。

首先下载 cmake 文件。请依据自己需求 【点击下载

下载 next - > next 安装,在安装的过程中注意有一项默认 “ 是否添加到PATH ” 默认是就行,要不还要手段添加 PATH。

安装完毕后打开即可。

3.1.2 opencv 被编译对象

之所以下载 opencv 各种包,主要是因为原安装包 .whl 不具备被 CMake 的编译条件,缺少CMakelist.txt 文件。

安装后下载拟编译的文件,由于需要编译的文件中必须包含 CMakeList.txt 文件,(我打开可以被编译的文件发现——每一个被编译的文件夹下面都有一个CMakeList.txt 文件)

先是下载了官网的安装包【点击下载网址,下拉即可看到,由于这个是4.0.0版本的,随着时间延伸,连接可能会失效,失效时候直接去官网就行,我只是将二级目录连接放着了】DocumentationSourcesWin pack (说白了,除了没有 IOS pack 的我都下载了),注意:opencv-4.0.0-vc14_vc15.exe 的安装格式其实相当于解压。

同时为了还下载了 GitHub 上的文件,分别为 opencv 和 opencv_contrib ,

其实,下载 GitHub 上的 opencv 和 opencv_contrib 就可以了。

3.2 编译

3.2.1 编译过程的小插曲(出现的问题)

3.2.1.1 缺少 CMakeLists.txt 文件

由于在编译时不知道是编译的那个文件,同时知道 .whl 文件与 .rar 文件一样,安装和解压类似。所以先找安装文件opencv_python-4.0.1+contrib-cp36-cp36m-win_amd64.whl 练练手。

先将 opencv_python-4.0.1+contrib-cp36-cp36m-win_amd64.whl 文件后缀改为 .rar ,解压后,导入CMake 文件输入路径中,随便输入一个保存路径。点击 Configure 。结果报错!缺少 CMakeList.txt 文件。

3.2.1.2 对比安装前后文件

是不是安装后的文件比安装文件增加了 CMakeLists.txt 文件,所以造成 " 练手 “ 失败。

打开 Everything 软件 --> 键入CMakeLists.txt

发现CMakeList.txt 只存在于 tensorflow 中,安装的 opencv 中压根没有。

3.2.1.2 查找源文件

既然其他文件中存在,而 opencv_contrib_python 中没有,那把 tensorflow 文件中的 CMakeLists.txt 拷贝到 opencv_contrib_python 中是否可行 ?逐一打开CMakeLists.txt 文件,发现内容 “ 非常丰富 ” ,文件存在又多,肯定不是 “ 上上签 ” ;继续踏上“ 征途 ”。

打开 opencv 的官方网站 GitHub 。我们发现包含有 CMakeList.txt 文件。惊喜大门缓缓开启!

3.2.2 编译(失败)

开始就编译 3.2.2.1 opencv-4.0.0-vc14_vc15.exe 解压文件 和3.2.2.2 opencv-4.0.0.zip 解压文件,均失败。这个失败可能不是文件本身造成的,很有可能刚开始 CMake 编译,有些该注意的地方没注意造成的,基于失败的经验,开始编译GitHub 下载的 opencvopencv_contrib 文件。历经波折、终于可以使用了。

3.2.2.1 opencv-4.0.0-vc14_vc15.exe

解压后文件分为

简单地说

build - 其可以直接被使用的,属于成品。将其 “ (D:\Software安装目录) \ opencv ( 解压文件后的根目录 ) \ build \ python \ cv2 \ python-3.6 ” 文件夹中的 cv2.cp36-win_amd64.pyd 文件直接拷贝到 “ (C:\Users\***\AppData\Local\Programs  Python程序的安装目录) \ Python \ Python36 \ Lib \ site-packages ” 文件夹中即可实现 opencv 的使用。

sources - 不能直接作为程序直接使用,属于半成品。打开这个文件夹,可以看到 CMakeLists.txt 文件,而 build 文件中没有该文件。这说明sources 文件中的内容可被 CMake 工具编译。

3.2.2.2 opencv-4.0.0.zip

该文件解压后,也含有 CMakeLists.txt 文件,其实仔细对比 3.2.2.1 opencv-4.0.0-vc14_vc15.exe 中的 sources 文件,文件夹中的内容是一样的。

3.2.3 编译(成功)

3.2.3.1 打开 CMake

3.2.3.2 首先编译基本库 opencv-master

具体入下图

注意:

1、填入路径(browse Source) 的文件夹下必须有 CMakeList.txt 文件。

对比下图,第一幅图是正确的;第二幅图是错误的,会报错。

2 、输出路径是自建的,如果没有该文件夹,CMake 会帮你创建并写入相关文件。

当在最下的窗口中出现如下图所示内容时,待变 configure 成功。

此意味基本库的编译完成

3.2.3.3 再次编译Extra modules(opencv_contrib-master)

在 Search 对话框中输入 PATH  ,或直接输入 OPENCV_EXTRA_MODULES_PATH(不区分大小写),找到 OPENCV_EXTRA_MODULES_PATH 后在 Value 中填入opencv_contrib-master 的文件中的 modules 路径,否则会不成功。

填入后,如下图所示

点击 Configure ,继续运行。

注意:

在该添加地址时,一定要区分好 / \ 两个符号关系。直接复制粘贴的文件路径是 (反斜杠 \)

D:\Software\opencv_contrib-master\opencv_contrib-master\modules

必须将其改为(正斜杠 /)

D:/Software/opencv_contrib-master/opencv_contrib-master/modules

否则会报错。Windows 10 CMake | OPENCV_EXTRA_MODULES_PATH | Bug #11655

CMake Error at cmake/OpenCVModule.cmake:368 (_glob_locations):
  Syntax error in cmake code at

    E:/opencv_github/opencv/cmake/OpenCVModule.cmake:368

  when parsing string

    E:\opencv_github\opencv_contrib\modules

  Invalid character escape '\o'.
Call Stack (most recent call first):
  modules/CMakeLists.txt:7 (ocv_glob_modules)

备注:

输出路径不要改变,该图中的输出路径与上图中的输出路径不同是因为我已经编译过了(重新编译很费时间),为了截图显示效果才改变的,输出路径始终不变!!!

同样出现下图,意味 Extend Modules 导入成功!

3.2.3.4 Set OPENCV_ENABLE_NONFREE

这个是要解决的重要事情。

在 Search 栏输入OPENCV_ENABLE_NONFREE,在其值Value中点击选中即可。如下图所示

选择完毕后再点击 Configure 。

3.2.3.5 点击 Generate

直到点击 Generate 才算完成。

(若不进行 Generate ,× 掉 CMake,软件会问你是否保存)

Generate 后暂时先不要关闭 CMake 。待 VS 编译时再关闭。

3.2.3.6 其他

有博客上说可以将 GitHub 下载的 opencv_master 和 opencv_contrib-master 解压到一个文件中进行编译,这个尝试的比较早,失败了。具体的失败原因不知道,也可能是方法可行而具体的细节没处理好造成的;但不排除这种方法本征上是行不通的。

3.2.4 其他

在 CMake 编译的过程中,看文件输出过程可知,其会自动搜寻电脑中的语言工具,如我电脑上是 python 3.6, 它会红色字体显示没有找到 python2.7,找到的是 python 。属于自动匹配吧。如果电脑上装的是 Java,CMake 编译时应该也能搜寻到的。

4 VS 编译

4.1 安装 VS

我安装的最新版本 VS 2019 。

安装 VS2019 之后,打开页面会显示 已安装 / 可用 两个选项,点击可用的最后个人版点击安装即可(由于安装过了,安装前没有截图,只能展示安装后的效果。)。

点击安装后选择 C++ 桌面版,如下图所示

这是我安装个人版之后为了展示效果安装的小型团体的过程步骤。首次选择只需点击 安装 即可。

安装之后关闭就行了。也可以选择性打开。

附:

已安装

可用

4.2 文件编译

一直没有关闭 CMake。点击 CMake 文件中的 Open Project 按钮。如下图所示

点击后跳转到 VS 2019。关闭 CMake,有文件上这样说的,反正没成功的时候都没有关闭 CMake,最后一次把所有问题解决后也看到有这样的博文,就关闭了,具体是否与CMake 有关,不得而知。

选择生成 --> 批生成。

打开批生成对话框

将图中选项选中,并选择 生成 或 重新生成。

(没有细究 生成 和 重新生成的区别,第一次时候选择是生长,后续操作我都选择了重新生成)

中间过程

最后完成 生成,见下图

出现这个情况,也不用惊慌,我尝试,可以使用。

5 使用文件

找到 build 文件夹,找到 cv2.cp36-win_amd64.pyd 文件,我的文件地址 D:\ Software\build\lib\python3\Release

将该.pyd 文件复制到python文件的 site-packages 文件夹中即可。我的文件地址为C:\Users\***\AppData\Local\Programs\Python\Python36\Lib\site-packages

此时可以正常使用 SIFT了。

注意:文件夹中的 cv2.cp36-win_amd64.pyd 文件可以移动,但是编译完成的文件夹既不能修改名称也不能移动,否则会报错,找不到 CV 模块位置。

6 参考

Windows上使用CMake 有好多CMake的用法可以帮助理解

CMake(二)—— Windows下使用CMake 有启发

cmake: Visual Studio 15 2017 could not find any instance of Visual Studio 当时安装VS 2019,一直启动不了,后来才知道需要启动开发工具采用,只安装VS是不行的,它只是一个平台,比如还可以作为 python 的 IDE

CMake + OpenCV3.4.1 + VS2017静态编译 当时检索到的内容,内容具有一定参考性。

 

OpenCV 学习笔记 06 SIFT使用中出现版权问题error: (-213:The function/feature is not implemented)的更多相关文章

  1. OpenCV 学习笔记 06 图像检索以及基于图像描述符的搜索

    OpenCV 可以检测图像的主要特征,然后提取这些特征,使其成为图像描述符,这些图像特征可作为图像搜索的数据库:此外可以利用关键点将图像拼接 stitch 起来,组成一个更大的图像.如将各照片组成一个 ...

  2. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  3. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

  4. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  5. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  6. OpenCV学习笔记3

    OpenCV学习笔记3 图像平滑(低通滤波) 使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音,边界).所以边界也会被模糊一点.(当然,也有一些模 ...

  7. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  8. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  9. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

随机推荐

  1. 使用拷贝文件测试(BufferedInputStream,FileInputStream)

    package com.demo; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

  2. unbuntu 18.04 LTS 版 安装Samba服务器

      首先需要注意的是,此时服务器的版本是乌班图18.04 LTS Server ,安装配置Samba服务器 . 首先来对当前的软件进行更新. 1 sudo apt-get upgrade 2 sudo ...

  3. 解决html5中video标签无法播放mp4问题的办法

    这篇文章主要给大家介绍了关于解决html5中video标签无法播放mp4问题的办法,文中介绍的非常详细,相信会对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 最近发现了一个 ...

  4. HTTP协议学习笔记(三)

    HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...

  5. vimtutor学习笔记

    简介 vimtutor是vim这款知名的文本编辑器的学习工具/指南.语法如下. vimtutor [-g] [language] gvimtutor -g选项和gvimtutor是启动GUI版本的指南 ...

  6. 一款易搭建,运行快的Git服务器:Gitea安装教程

    说明:Gitea是从Gogs发展而来,同样的拥有极易安装,运行快速的特点,而且更新比Gogs频繁很多,维护的人也多,个人认为Gitea还是更好一些的,这里就说下安装方法. 截图 简介 Gitea是一个 ...

  7. 【NOIP2014模拟赛No.1】我要的幸福

    OJ题号:ZHOJ1297 思路:搜索. 先预处理注定不能走的路径,然后dfs可以走的路径. #pragma GCC optimize ("O2") #include<cst ...

  8. 解决iframe重复嵌套登陆页面的问题

    在login.jsp中加入即可 // 在被嵌套时就刷新上级窗口 if(window.parent != window){ window.parent.location.reload(true); }

  9. Java中的ReentrantLock和synchronized两种锁定

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  10. Linux设置和查看环境变量的方法 详解

    1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量hello $ export HELLO="Hello!" $ ech ...