已经有两年了,我看到关于SIFT和SURF的同一主题多次出现,这给一些人带来了问题。总会有一个帖子涉及这两个。
首先,您需要明白一些事情:
OpenCV是一个开源库,实现了研究人员设计的算法,其中一些算法可以免费使用,无论是个人还是商业用途,其他算法则仅限于个人使用。
从OpenCV的版本开始解释:opencv2 -> opencv3 -> opencv4 -> 新版本的opencv
- 我们不会讨论opencv 2(我猜现在几乎没有人使用它)。您需要记住的唯一一件事是SIFT和SURF的工作正常。
- 自OpenCV3发布以来,OpenCV 3的默认安装中已删除了SIFT和SURF的实现,OpenCV 4也是如此。
移除SIFT和SURF的原因是因为OpenCV称之为“非免费”算法。SIFT和SURF都是专有的和受专利保护的算法,这意味着您在商业算法中使用它们必须技术上获得许可(但是,它们对于学术和研究目的是免费的)。
因此,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。