不能在 Python OpenCV v4.20 中使用 SIFT

Posted

技术标签:

【中文标题】不能在 Python OpenCV v4.20 中使用 SIFT【英文标题】:Can't use SIFT in Python OpenCV v4.20 【发布时间】:2020-05-20 18:31:54 【问题描述】:

我正在使用 OpenCV v4.20 和 PyCharm IDE。我想使用 SIFT 算法。但我得到这个错误。我在互联网上寻找此错误的解决方案,但没有一个对我有帮助。你知道这个错误的解决方法吗? (使用 pip 我可以安装至少 3.4.2.16 版本的 OpenCV)

这是我的错误:

Traceback(最近一次调用最后一次): 文件“C:/Users/HP/PycharmProjects/features/featuredetect.py”,第 7 行,在 筛选 = cv.xfeatures2d_SIFT.create()

cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1210: 错误: (-213: 功能/特性未实现)此算法已获得专利,不包含在此配置中;设置 OPENCV_ENABLE_NONFREE CMake 选项并在函数 'cv::xfeatures2d::SIFT::create' 中重建库

这是我的代码:

import cv2 as cv

image = cv.imread("the_book_thief.jpg")
gray_image = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

sift = cv.xfeatures2d_SIFT.create()
keyPoints = sift.detect(image,None)

output = cv.drawKeypoints(image,keyPoints,None)

cv.imshow("FEATURES DETECTED",output)
cv.imshow("NORMAL",image)

cv.waitKey(0)
cv.destroyAllWindows()

【问题讨论】:

错误信息不言自明,不是吗? 这能回答你的问题吗? sift = cv2.xfeatures2d.SIFT_create() not working even though have contrib installed 【参考方案1】:

SIFT's patent has expired 在去年七月。在版本 > 4.4 中,检测器初始化命令已更改为 cv2.SIFT_create()。 如果你不使用opencv的GUI,建议安装headless版本:pip install opencv-python-headless

【讨论】:

这是 2021 年的正确答案。我遇到了 pip install opencv-python-headless 的问题,但我能够安装 pip install opencv-contrib-python 并以 cv2.SIFT_create() 的身份运行 sift 没有问题。 自 2022 年 1 月起,这不再正确:它必须再次移动。 @rikyeah 请详细说明。 ***.com/users/11344054/nisan-chhetri 下面的答案对我有用,在空白的 colab 笔记本上 不是日期问题,是opencv版本问题。对于版本 >4.4,这是正确的。【参考方案2】:

不幸的是,根据这个 Github 问题,SIFT no longer available in opencv > 3.4.2。由于您使用的是 OpenCV v4.2.0,因此即使您安装了pip install opencv-contrib-python,它也不包括在内,如this post 所示。一种解决方法是降级到包括 SIFT 的任何以前的 OpenCV 版本(我相信低于3.4.3 的任何版本)。降级到v3.4.2.16 时我已经成功了。

pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16

将您的代码与v3.4.2.16 一起使用,SIFT 似乎可以工作

【讨论】:

我按照你的建议做了。但我仍然收到此错误 为我工作,试试这些 .. pip install opencv-python==3.4.2.17 , pip install opencv-contrib-python==3.4.2.17 似乎已在 4.5.1 版中修复【参考方案3】:

我之前也遇到过同样的问题。我已经尝试了所有方法,但最后一个非常简单的方法对我来说已经得到了很多人的回答。但是,我的方法有一点变化。

    第 1 步:

    卸载之前安装的opencv库

    pip uninstall opencv-python

    第 2 步:

    由于版权问题,安装 opencv contrib 库。在这里,我们使用的是 3.4.2.17 版本

    pip install opencv-contrib-python==3.4.2.17

    opencv contrib library installation error

    上图显示版本3.4.2.16未找到错误。因此,我尝试使用版本3.4.2.17。如果此版本不起作用,请尝试其他版本的 3.4.x。

    第 3 步:

    然后运行以下

    import cv2 sift = cv2.xfeatures2d.SIFT_create()

就是这样。这个对我有用。我希望它也对你有用。

【讨论】:

【参考方案4】:

我有同样的问题,经过多次尝试,我尝试安装 opencv-contrib-python 几次,但它就在今天工作。只是为了确保我同时安装了 opencv-python 和 opencv-contrib-python。

pip install opencv-python

pip install opencv-contrib-python 

opencv-python 和 opencv-contrib-python 安装的版本都是 4.4.0.46。万一后面的版本不支持(之前的几个版本不支持SIFT,一个月前的那个,最新的opencv-contrib-python补丁是2020年11月2日发布的)。

【讨论】:

【参考方案5】:

您的问题的解决方案应该是安装 opencv-contrib-python-nonfree(可通过 pip 获得)。

$ pip install opencv-contrib-python-nonfree

由于错误表明 SIFT 已获得专利,因此出于许可原因未包含在 OpenCV 中。它包含在非免费部分中。

【讨论】:

当我运行这个命令 pip install opencv-python-nonfree 它说“错误:找不到满足 opencv-python-nonfree 要求的版本(来自版本:无)错误:没有匹配找到了 opencv-python-nonfree 的分发版”

以上是关于不能在 Python OpenCV v4.20 中使用 SIFT的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中使用opencv模块(我正在使用pycharm)[重复]

安装anaconda后opencv不能用怎么办

(亲自实践)python OpenCV已经安装但是import cv2的方法不能用

为 Python 3.3 安装 opencv

OpenCV-Python初尝试&安装教程

在python opencv模块中编辑后保存同名图像