SIFT & SURF : "module 'cv2.cv2' has no attribute 'xfeatures2d'" Set OPENCV_ENABLE_NONFREE CMake



我尝试将SIFT和SURF函数与OpenCV 3和OpenCV 4的一些版本一起使用(在安装了OpenCV-controb-python之后),其中包含:

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中工作呢?非常感谢。

欢迎详细解释

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

首先,你需要了解一些东西:OpenCV是一个开源库,它实现了研究人员设计的算法,其中一些算法可以免费用于个人或商业用途,其他算法可以免费供个人使用。

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

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

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

因此,OpenCV决定将专利算法(带有实验实现)转移到名为">"的包中;opencv_ contrib">。这意味着访问SIFT和SURF。

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

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

    pip install opencv-contrib-python
    

然而,在OpenCV 3的某些版本中(您在python中遇到问题的版本),SIFTSURF算法都不想工作,您会得到以下错误:"module 'cv2.cv2' has no attribute 'xfeatures2d' ”

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

因此,当您进行**pip安装opencv-python**时,您实际上会参考https://pypi.org/project/opencv-python/#files它将选择与您的配置(操作系统和python版本)相对应的轮子文件,与opencv-controb-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, 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安装配合使用),因为问题从3.4.3版本开始。

2-如果您需要一个特定的版本,知道它是SIFT或SURF的问题,您可以通过从源安装带有enable OpenCV-controib和NONFREE算法的OpenCV来纠正它。下面是一个教程:教程

对于编译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 ..

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

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

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

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

最新更新