python - 在 Python OpenCV 4.2.0(2020 年)中使用 SIFT(或替代方案)
问题描述
我正在尝试使用 SIFT 通过 Python 进行特征检测,但它不再是 OpenCV或OpenCV contrib 的一部分。
使用 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,或者使用替代方法?我将如何做这些?我所需要的只是某种方法来进行特征检测,最好是尺度不变的。
这个问题提到了 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
推荐阅读
- xquery - 使用java的xquery中的UUID随机数
- c# - 如何从 DICOM 文件中获取原始心电图数据?
- javascript - 按对象键过滤对象数组
- java - 打印给定总和的所有子集
- c# - 是否可以拥有一个静态控制器而不是在每次请求时创建新控制器?
- npm - 限制对 npm 包的访问
- php - MySQL ST_AsGeoJSON 正在返回不在原始数据中的浮点数
- asp.net-mvc - 如何在视图中使用 2 个模型以用于不同的后期参数?
- google-fabric - “组织”可以拥有的应用程序数量是否有限制?
- mysql - Error when switching user in mysql client