筛选和冲浪:设置 OPENCV_ENABLE_NONFREE CMake ==> 解决方案 OpenCV 3 和 OpenCV 4

Ras*_*uzi 5 opencv surf sift opencv-features2d

我尝试将 SIFT 和 SURF 函数与 OpenCV 3 和 openCV 4 的某些版本(在安装 opencv-contrib-python 之后)一起使用:

pip install opencv-contrib-python
Run Code Online (Sandbox Code Playgroud)

我尝试版本 3.4.3 和 3.4.9 和 4.1.0,但有同样的问题:

sift = cv2.xfeatures2d.SIFT_create()
surf = cv2.xfeatures2d.SURF_create()
==> 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 'create'
Run Code Online (Sandbox Code Playgroud)

但在 3.4.2 版本中,它工作正常。

那么如何让 SIFT 和 SURF 在不同版本的 OpenCV 中工作呢?谢谢你。

欢迎详细解释

Ras*_*uzi 7

已经两年了,我看到同一个主题在SIFTSURF上多次挂起,这给某些人带来了问题。总是有关于这两个的帖子。

首先,你需要了解一点: OpenCV是一个开源库,它实现了研究人员设计的算法,其中一些算法无论是个人还是商业用途都可以免费使用,而另一些则可以免费供个人使用。

根据 OpenCV 的版本,从一个小解释开始:opencv2 -> opencv3 -> opencv4 -> new_versions of opencv

  • 我们不打算谈论opencv 2(我想现在几乎没有人使用它)。在此版本中,您唯一需要记住的是SIFTSURF运行良好。
  • OpenCV3发布以来SIFTSURF实现已从OpenCV 3的默认安装中删除,OpenCV 4 也是如此

删除SIFTSURF的原因是因为 OpenCV 称之为“非自由”算法。SIFTSURF是(夏季)专有和专利算法,这意味着您必须在技术上获得在商业算法中使用它们的许可(但是,它们可免费用于学术和研究目的)。

出于这个原因,OpenCV决定将获得专利的算法(带有实验性实现)转移到名为“opencv_contrib”的包中。这意味着访问 SIFT 和 SURF。

  • C++ 中的 OpenCV 案例:您必须在启用 opencv-contrib 支持的情况下从源代码编译和安装OpenCV。(我们稍后会看到)

  • python中的OpenCV案例:需要通过pip安装opencv-contrib-python包如下:

    pip install opencv-contrib-python
    
    Run Code Online (Sandbox Code Playgroud)

但是,在OpenCV 3 的某些版本中(您在 python 中遇到问题的版本),SIFTSURF算法都不想工作,并且您会收到此错误:"module 'cv2.cv2' has no attribute 'xfeatures2d' ”.

我可以给你一个解释(这是我自己的观点),但在此之前你应该知道 OpenCV python 包是通过编译OpenCV 源代码构建的。Pythons 包是 Wheel 类型的文件,所以扩展名为“.whl”。

所以当你做 ** pip install opencv-python ** 时,你实际上会参考这个https://pypi.org/project/opencv-python/#files它将选择与你的配置相对应的轮文件(操作系统也是作为 python 的版本),对于 opencv-contrib-python 相同,其链接如下https://pypi.org/project/opencv-contrib-python/#files

那么为什么SIFTSURF不能在所有版本的 OpenCV 中工作呢?

假设 1:忘记在编译源代码和构建 opencv-contrib-python 包时激活额外的模块和开发人员的非自由算法。但是由于这个问题不仅出现在一个版本中,而是出现在十个版本中,这就产生了第二个假设。

假设2:这是故意的,但为什么呢?

注意:这只是我的意见,如果有人有确切的原因,请与我们分享。

版本历史和操作:来自SIFTSURF

1- 对于SIFT已测试):

sift = cv2.sift_create() # work in:
# 3.4.11, 4.4.0. ==> Sift became free since March 2020
sift = cv2.xfeatures2D.SIFT_create () # work in:
# 3.2.x, 3.3.x, 3.4.0, 3.4.1, 3.4.2, 3.4.10, 4.3.0, 4.4.0
sift = cv2.xfeatures2D.SIFT_create () # ==> Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'create' (the versions where the problem is present)
# 3.4.3, 3.4.4, 3.4.5, 3.4.6, 3.4.7, 3.4.8, 3.4.9, 4.0.x, 4.1.x, 4.2.x
Run Code Online (Sandbox Code Playgroud)

2- 对于SURF假设(不是全部测试)):

SURF = cv2.xfeatures2D.SURF_create () # work in :
# 3.2.x, 3.3.x, 3.4.0, 3.4.1, 3.4.2
SURF = cv2.xfeatures2D.SURF_create () # ==> Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'create' (the versions where the problem is present)
# 3.4.3, 3.4.4, 3.4.5, 3.4.6, 3.4.7, 3.4.8, 3.4.9, 3.4.10, 3.4.11, 4.0.x, 4.1.x, 4.2.x, 4.3.0, 4.4.0.
Run Code Online (Sandbox Code Playgroud)

解决方案:

1- 在很多论坛中提到的最简单的解决方案(如果您正在寻找一点而不是每次都发布相同的问题)是openCV 版本降级到版本3.4.2.17(如果您需要 SIFT 和 SURF 工作只是pip install),因为问题从3.4.3版本开始。

2-如果您需要一个特定版本,知道它是 SIFT 或 SURF 的问题,您可以通过安装 OpenCV 来纠正它,启用 opencv-contrib 和来自源的 NONFREE 算法。这是一个教程:教程

对于编译 OpenCV 启用 opencv-contrib 和 NONFREE 算法,您需要:

cmake -D CMAKE_BUILD_TYPE = RELEASE \ 
      -D CMAKE_INSTALL_PREFIX = /usr/local \ 
      -D INSTALL_PYTHON_EXAMPLES = ON \ 
      -D INSTALL_C_EXAMPLES = OFF \ 
      -D OPENCV_ENABLE_NONFREE = ON \ 
      -D OPENCV_EXTRA_MODULES_PATH=(Path_to_opencv-contrib)/opencv_contrib/modules \
      -D PYTHON_EXECUTABLE=~/.virtualenvs/(Python_environement)/bin/python \
      -D BUILD_EXAMPLES=ON ..
Run Code Online (Sandbox Code Playgroud)

在 python 3.6.9 下用 opencv 3.4.9 测试(适用于 SIFT 和 SURF)

opencv 3 和 4 的所有现有版本都在这里发布

openCV3 >= 3.4.11 的所有版本都包含 SIFT 的免费版本

openCV4 >= 4.4.0 的所有版本都包含 SIFT 的免费版本