已经两年了,我多次看到同一个主题SIFT and SURF这给一些人带来了问题。总是有关于这两个人的帖子。
首先,你需要明白一些事情:OpenCV是一个开源库,它实现了研究人员设计的算法,其中一些算法可以免费使用,无论是个人还是商业用途,其他算法可以免费供个人使用。
首先根据 OpenCV 的版本进行一些小解释:opencv2 -> opencv3 -> opencv4 -> opencv的新版本
- 我们不会谈论opencv 2(我想现在几乎没有人使用它)。从这个版本中你唯一需要记住的是SIFT and SURF工作得很好。
- 自发布以来OpenCV3, the SIFT and SURF实现已从默认安装中删除OpenCV 3,同样对于OpenCV 4.
删除原因SIFT and SURF是因为 OpenCV 称之为“非免费”算法。SIFT and SURF都是(夏季)专有算法和专利算法,这意味着您必须在技术上获得在商业算法中使用它们的许可(但是,它们对于学术和研究目的是免费的)。
为此原因,OpenCV决定将专利算法(带有实验性实现)转移到名为“opencv_contrib”。这意味着访问 SIFT 和 SURF。
-
OpenCV 案例C++:
你必须编译并安装OpenCV从源头启用 opencv-contrib 支持。 (我们稍后会看到这一点)
-
OpenCV 案例python:
您需要通过 pip 安装 opencv-contrib-python 包,如下所示:
pip install opencv-contrib-python
然而,在某些版本中OpenCV 3,(你在 python 中遇到麻烦的那个),两者SIFT and 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.
那么为什么不呢SIFT and SURF适用于所有版本的 OpenCV?
假设1:在编译源代码和构建 opencv-contrib-python 包时,忘记激活开发人员提供的额外模块和非自由算法。但由于这个问题不仅仅存在于一个版本中,而是存在于十个版本中,因此这就产生了第二个假设。
假设2: 这是故意的,但为什么呢?
注:这只是我的看法,如果有人有确切的理由,请与我们分享。
版本历史及操作:从SIFT and SURF.
1- For SIFT (Tested):
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- For 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 并启用 opencv-contrib 和 NONFREE 算法来纠正它。这是一个要遵循的教程: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
openCV >= 3.4.11 的所有版本都包含 SIFT 的免费版本
openCV4 >= 4.4.0 的所有版本都包含 SIFT 的免费版本