在 Python OpenCV 4.2.0(2020 年)中使用 SIFT(或替代方法)

Using SIFT (or an alternative) in Python OpenCV 4.2.0 (In 2020)

我正在尝试通过 Python 使用 SIFT 进行特征检测,但它不再是 OpenCV OpenCV 贡献的一部分。

使用 OpenCV opencv-contrib-python(这两个版本都是 4.2.0.34,这个问题的最新版本),我得到:

>>> import cv2
>>> cv2.SIFT_create()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'cv2.cv2' has no attribute 'SIFT_create'
>>> cv2.xfeatures2d.SIFT_create()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1210: 
 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 
 'cv::xfeatures2d::SIFT::create'

我找到的每个相关答案都建议使用 contrib 或旧版本,但这些都不再有效。

从源代码构建它以按照错误指示取回 SIFT 更容易,还是使用替代方法更容易?我该怎么做呢?我所需要的只是一些进行特征检测的方法,最好是尺度不变的。

This question 提到了 SIFT 替代方案但是非常过时(最佳答案大约有 8 年历史)。 2020年我们现在能做什么?

编辑显示 OpenCV 3 不工作:

正在尝试安装 OpenCV 3:

>>> pip install opencv-python==3 
ERROR: Could not find a version that satisfies the requirement opencv-python==3
(from versions: 3.4.2.16, 3.4.2.17, 3.4.3.18, 3.4.4.19, 3.4.5.20, 3.4.6.27,
3.4.7.28, 3.4.8.29, 3.4.9.31, 3.4.9.33, 4.0.0.21, 4.0.1.23, 4.0.1.24, 4.1.0.25,
4.1.1.26, 4.1.2.30, 4.2.0.32, 4.2.0.34)
ERROR: No matching distribution found for opencv-python==3
>>> pip install opencv-python==3.4.2.16  

然后在 Python:

>>> import cv2
>>> print(cv2.__version__)
3.4.2
>>> cv2.SIFT_create()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'cv2.cv2' has no attribute 'SIFT_create'

SIFT 的专利于 2020 年 3 月到期。但是将 SIFT 移至免费开源集合可能无法更新 opencv。

看到这个问题:https://github.com/skvark/opencv-python/issues/126

使用非自由组件重建:

git clone --recursive https://github.com/skvark/opencv-python.git
cd opencv-python
export CMAKE_ARGS="-DOPENCV_ENABLE_NONFREE=ON"
python setup.py bdist_wheel

来自the issue: 使用非自由组件重建:

git clone --recursive https://github.com/skvark/opencv-python.git
cd opencv-python
export CMAKE_ARGS="-DOPENCV_ENABLE_NONFREE=ON"
python setup.py bdist_wheel