SIFT&SURF:“模块'cv2.cv2'没有属性'xfeatures2d'”设置OPENCV_ENABLE_NONFREE CMake ==>解决方案OpenCV 3和OpenCV 4 [关闭]

2023-11-24

我尝试将 SIFT 和 SURF 函数与 OpenCV 3 和 openCV 4 的某些版本(安装了 opencv-contrib-python 后)一起使用:

pip install opencv-contrib-python

我尝试版本 3.4.3、3.4.9 和 4.1.0,但有同样的问题:

sift = cv2.xfeatures2d.SIFT_create()
surf = cv2.xfeatures2d.SURF_create()
==> 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 'create'

但在 3.4.2 版本中,它工作得很好。

那么如何让SIFT和SURF在不同版本的OpenCV中工作呢?谢谢。

欢迎详细解释


已经两年了,我多次看到同一个主题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 的免费版本

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SIFT&SURF:“模块'cv2.cv2'没有属性'xfeatures2d'”设置OPENCV_ENABLE_NONFREE CMake ==>解决方案OpenCV 3和OpenCV 4 [关闭] 的相关文章

  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 使用 OpenCV 进行相机校准 - 如何调整棋盘方块大小?

    我正在使用 OpenCV Python 示例开发相机校准程序 来自 OpenCV 教程 http opencv python tutroals readthedocs io en latest py tutorials py calib3d
  • 提取二值图像中的最中心区域

    我正在处理二进制图像 之前使用此代码来查找二进制图像中的最大区域 Use the hue value to convert to binary thresh 20 thresh thresh img cv2 threshold h thre
  • 我的 Opencv 应用程序处理速度非常慢

    我正在构建一个 OpenCV 应用程序 它从相机捕获视频 并在删除背景后将其覆盖在另一个视频上 我无法达到合理的速度 因为它以大约 1 fps 的速度播放输出 而我的背景去除以 3 fps 的速度工作 有没有办法以正常速度显示背景视频并以
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • OpenCV Sobel 滤波器 - 为什么它看起来这么糟糕,尤其是与 Gimp 相比?

    我正在尝试使用 OpenCV 重建一些我之前在 Gimp 中完成的预处理 第一级是用于边缘检测的 Sobel 滤波器 它在 Gimp 中运行得很好 现在这是我对 OpenCV 的尝试 opencv imgproc Sobel src sca
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 将 CvSeq 保存到数组

    我对 OpenCV 文档有点迷失 我想将 cvFindContours 返回的 CvSeq 保存到一个数组中 据我了解它将返回 CvContour 的 seq 但我找不到它包含的内容 我应该保存其中的哪些部分 稍后我可以迭代它并说调用 cv
  • OpenCV功能类似于matlab的“查找”

    我正在寻找 openCV 中的一个函数来帮助我制作图像蒙版 例如在 MATLAB 中 B A or B 零 大小 A B A 10 c 有些功能可以让你通过mask向他们提出论据 按照您描述的方式创建面具 我认为您正在追求Cmp 或 Cmp
  • Python 2.7/OpenCV 3.3: cv2.initUn DistorifyMap 中出现错误。不显示不扭曲的校正图像

    我想扭曲并校正我的立体图像 为此 我在 Python 2 7 中使用了 Opencv 3 3 我使用的代码是 import cv2 import numpy as np cameraMatrixL np load mtx left npy
  • 在Spyder(Python 3.6)中导入cv2时出现导入错误

    我已经在Windows操作系统中安装了opencv 3 0 0 我已运行该应用程序并已成功将其安装在C 驱动器并还复制了cv2 pyd文件输入C Python27 Lib site packages正如我在几个教程视频中看到的那样 在我的
  • 使用 Racket FFI 进行快速阵列访问

    我正在尝试在 Racket 中编写 OpenCV FFI 并达到了需要有效操作数组的地步 然而 我所有使用 Racket FFI 访问数组的尝试都会导致代码效率非常低 有没有办法使用 FFI 快速访问 C 数组 在 Racket 中 这种类
  • 为什么在 OpenCV 中访问该矩阵时出现内存错误?

    我只是想写入给定大小的矩阵 当我在 Valgrind 中运行该程序时 出现内存错误 如下所示 主要 cpp include
  • 从基本矩阵中查找单应矩阵

    我正在尝试计算单应性矩阵H给定一组对应关系和基本矩阵F 根据对极几何原理 我知道这可以通过对极线和对极线的叉积来完成F from 极点几何 http www cs unc edu marc tutorial node44 html e ij
  • cv2.imdecode 始终返回 None

    我正在从存储 JPEG 图像的 sqlite BLOB 读取二进制数据 sqlite3 Binary 图像被写入数据库 img cv2 imread images image jpg c execute INSERT INTO pictur
  • IplImage 内的 IplImage

    是否可以使用 OpenCv JavaCv 将图像放置在图像内 例如我有一个 1000x1000 图像和一个 100x100 图像 在 600x600 的位置 我想将较小的图像放置在较大的图像内 假设蓝色框是 1000x1000 IplIma
  • 从笔记本中提取文本

    我正在尝试从图像中提取手写文本 我使用 python 和 opencv 函数 例如 find contours 当我使用像这样的图像时 一切进展顺利 它工作得很好 因为我有一个简单的背景 但后来我用这张图片测试了它 由于背景中有笔记本的线条

随机推荐