SIFT和SURF: "module 'cv2.cv2'没有属性'xfeatures2d'"设置OPENCV_ENABLE_NONFREE CMake ==>解决方案OpenCV 3和OpenCV 4

12

我尝试在安装了opencv-contrib-python的OpenCV 3和OpenCV 4版本中使用SIFT和SURF功能:

pip install opencv-contrib-python

我尝试了版本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'

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

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

欢迎提供详细的解释。


我不明白,这里的问题是什么?SO是一个问答网站,而不是论坛,你似乎在将其用作论坛,这是不正确的。你可以回答自己的问题,但首先必须提出一个问题,然后在下面的答案框中回答它。 - Dr. Snoopy
谢谢您的回复。我会立即进行更正。 - RashidLadj_Winux
1个回答

23

已经有两年了,我看到关于SIFTSURF的同一主题多次出现,这给一些人带来了问题。总会有一个帖子涉及这两个。

首先,您需要明白一些事情: OpenCV是一个开源库,实现了研究人员设计的算法,其中一些算法可以免费使用,无论是个人还是商业用途,其他算法则仅限于个人使用。

从OpenCV的版本开始解释:opencv2 -> opencv3 -> opencv4 -> 新版本的opencv

  • 我们不会讨论opencv 2(我猜现在几乎没有人使用它)。您需要记住的唯一一件事是SIFTSURF的工作正常。
  • OpenCV3发布以来,OpenCV 3的默认安装中已删除了SIFTSURF的实现,OpenCV 4也是如此。

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

因此,OpenCV决定将专利算法(具有实验性实现)移动到名为"opencv_contrib"的软件包中。这意味着可以访问SIFT和SURF。

  • Case of OpenCV in C++: you have to compile and install OpenCV from source with opencv-contrib support enabled. (We will see this later)

  • Case of OpenCV in python: you need to install via pip the opencv-contrib-python package as follows:

    pip install opencv-contrib-python
    
然而,在一些版本的OpenCV 3中(在Python中出现问题的那个版本),SIFT和SURF算法都不能工作,你会遇到这个错误:“module'cv2.cv2'has no attribute'xfeatures2d'”。 我可以给你一个解释(这是我的个人意见),但在此之前,你应该知道OpenCV python包是通过编译OpenCV源码构建的。Python包是Wheel类型文件,因此扩展名为“.whl”。 因此,当你执行**pip install opencv-python**时,实际上会咨询https://pypi.org/project/opencv-python/#files,它将选择与你的配置(操作系统以及python版本)相对应的wheel文件,opencv-contrib-python的链接如下https://pypi.org/project/opencv-contrib-python/#files。 那么为什么不是所有版本的OpenCV都能使用SIFT和SURF呢? 假设1:在编译源代码和构建opencv-contrib-python包时,开发人员忘记激活额外的模块和非免费算法。但由于这个问题不仅存在于一个版本中,而是存在于十个版本中,这产生了第二个假设。 假设2:这是有意为之的,但为什么? 注意:这只是我的观点,如果有人知道确切的原因,请与我们分享。 版本历史和操作:从SIFT和SURF开始。 1-对于SIFT(已测试):
sift = cv2.sift_create() # work in:
# 3.4.11, 4.4.0, 4.5.x, 4.6.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
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

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, 4.5.x, 4.6.0
解决方案: 1- 如果您只是寻找一点帮助而不是每次发布相同的问题,则最简单的解决方案是将openCV版本降级到版本3.4.2.17(如果您只需要SIFT和SURF,只需使用pip install即可),因为从版本3.4.3开始出现了问题。
2- 如果您需要特定版本,且知道这是与SIFT或SURF有关的问题,则可以通过从源代码安装启用opencv-contrib和非免费算法的OpenCV来进行更正。这里有一个需要跟随的教程:教程 要编译启用opencv-contrib和非免费算法的OpenCV,您需要以下内容:
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 ..

已在Python 3.6.9下测试了OpenCV 3.4.9(适用于SIFT和SURF),请放心使用。

所有现有的OpenCV 3和4版本都可以在Releases中找到。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接