SIFT&SURF:设置OPENCV_ENABLE_NONFREE CMake ==>解决方案OpenCV 3和OpenCV 4

问题描述

我尝试将SIFT和SURF函数与OpenCV 3和openCV 4的某些版本一起使用(安装了opencv-contrib-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中工作?谢谢。

欢迎提供详细说明

解决方法

已经有两年了,我看到同一主题悬而未决的关于 SIFT SURF 的问题,这给某些问题带来了麻烦。总是有关于这两个的帖子。

首先,您需要了解以下内容: OpenCV 是一个开放源代码库,它实现了研究人员设计的算法,其中一些算法可以免费用于个人或商业用途,另一些则可以免费用于个人用途。

首先根据OpenCV的版本进行一些解释: opencv2 -> opencv3 -> opencv4 -> new_versions opencv

  • 我们不会谈论 opencv 2 (我想现在几乎没有人使用它)。此版本中您唯一需要记住的是 SIFT SURF 可以正常工作。
  • OpenCV3 发布以来, OpenCV的默认安装中已删除了 SIFT SURF 实施3 ,与 OpenCV 4 相同。

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

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

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

  • python 中OpenCV的情况: 您需要通过pip安装opencv-contrib-python软件包,如下所示:

    pip install opencv-contrib-python
    

但是,在某些 OpenCV 3 版本(您在python中遇到问题的版本)中, SIFT SURF 算法不起作用,则会出现此错误:"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版本)相对应的wheel文件。适用于opencv-contrib-python,其链接为以下https://pypi.org/project/opencv-contrib-python/#files

那么为什么 SIFT SURF 在所有版本的OpenCV中均不起作用?

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

假设2 :这是有目的的,但是为什么呢?

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

版本历史和操作:来自 SIFT SURF

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

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

SURF = cv2.xfeatures2D.SURF_create () # work in :
# 3.2.x,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.11,4.2.x,4.4.0.

解决方案:

1-许多论坛中提到的最简单的解决方案(如果您只是想找一点而不是每次都发布相同的问题)是将openCV版本降级到版本 3.4.2.17 (如果您仅需要通过pip安装进行SIFT和SURF工作),因为问题始于版本3.4.3。

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

用于编译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的所有现有版本都在此处Releases

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

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