无法 运行 在 MacO 上使用 opencv 筛选

Cannot run Sift with opencv on MacOs

当我尝试 运行 cv2.xfeatures2d.SIFT_create()

我收到此错误消息:

error: OpenCV(4.2.0) /Users/travis/build/skvark/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 'create'

说要设置 OPENCV_ENABLE_NONFREE 但我用自制软件安装了 opencv,它已经有那个选项 enabled

编辑: 我尝试使用 pip install opencv-contrib-python-nonfree 并收到此错误

ERROR: Could not find a version that satisfies the requirement opencv-contrib-python-nonfree (from versions: none)
ERROR: No matching distribution found for opencv-contrib-python-nonfree

我能够重建您的错误并且能够解决这个问题。仔细查看安装 OpenCV 时使用的 Homebrew 的 Python 公式:https://formulae.brew.sh/formula/opencv。在撰写本文时,它使用 python@3.8,这意味着它使用 Homebrew 的 Python 3.8 而不是默认的 Python 3.7.7(在撰写本文时)如果您使用 Homebrew 安装 Python 的标准公式,则位于 /usr/local/bin/python3。因为你从 Homebrew 安装后找不到 OpenCV,所以你尝试使用 pip 来安装它。 opencv-contrib-python 公式没有启用非自由模块,您在上面使用的尝试获取非自由模块的公式已过时。

因此,当您使用 Homebrew 安装 OpenCV 时,您会收到上述错误,因为即使您通过 Homebrew 使用 contrib 包和 Python 包装器安装了 OpenCV,您使用的是 pip 从你的系统提供来安装 OpenCV 但你没有使用 Homebrew 为你安装的东西。具体来说,您没有使用为与 OpenCV 一起使用而安装的 Python 的实际版本。

在我的系统上,这个版本的 Python 3.8 可以在这里找到:

/usr/local/Cellar/python@3.8/3.8.2/bin

我还必须确保在导入 OpenCV 之前安装了 numpy。导航到上面的目录,然后在这个目录下运行 pip本地:

$ cd /usr/local/Cellar/python@3.8/3.8.2/bin
$ ./pip install numpy

完成后,运行 这个 python3 的本地版本,然后尝试导入 OpenCV 和 SIFT 模块:

$ ./python3
Python 3.8.2 (default, Mar 11 2020, 00:29:50)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.xfeatures2d.SIFT_create()
<xfeatures2d_SIFT 0x10b045550>
>>>

展望未来,如果您决定使用 Homebrew 中的非自由模块,则必须使用 Homebrew 中的 Python 3.8 才能使用 OpenCV 的非自由模块。如果你想更进一步,让你的系统使用这个版本的 Python 而不是 /usr/local/bin/python3 中的 Python 3.7,你必须更新你的 .bashrc 文件位于您的主目录中,以便使用此版本的 Python 而不是那里的版本:

export PATH="/usr/local/Cellar/python@3.8/3.8.2/bin:$PATH"

如果您更喜欢使用 opencv-contrib-pythonpip 公式并坚持使用 /usr/local/bin/python3 中的 Python 版本,则非自由模块不随附此因此您必须为这项工作克隆存储库并在启用这些的情况下重建包装器(来源:https://github.com/skvark/opencv-python/issues/126#issuecomment-596689259)。

一个小提示,我必须手动指向 Qt 在我的计算机上的安装位置。最初设置 OpenCV 在我的命令行路径中找不到 Qt。我先做了brew install qt。您必须在 CMAKE_PREFIX_PATH 环境变量中指定路径。 最后,假设您将 repo 克隆到您的 Downloads 目录中:

brew install qt
cd ~/Downloads
git clone --recursive https://github.com/skvark/opencv-python.git
cd opencv-python
export CMAKE_ARGS="-DOPENCV_ENABLE_NONFREE=ON -DENABLE_CONTRIB=1 -DOPENCV_EXTRA_MODULES_PATH=/Users/<User>/Downloads/opencv-python/opencv_contrib/modules/ -DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt/5.14.2/"
python3 setup.py build
python3 setup.py install

5.14.2上面是我电脑上的Qt版本。确保将其更改为您计算机上安装的任何版本。 还要将 <User> 替换为您登录时使用的计算机的用户名。您可以通过在终端中执行 cd ~ 找到它,并通过执行 pwd.

查看目录分隔符后的最终字符串是什么

由于 SIFT 的专利现已到期,我希望它能从非自由包中删除,并成为 OpenCV 主库的一部分!