具有两个主要 python(3.7 和 3.8)的 Opencv 配置

Opencv config with two major python (3.7 & 3.8)

有一段时间我使用 opencv(4.5.2 从源代码编译)和 python 3.8.5(在 Ubuntu 18.04),但对于某些项目,我确实需要使用tensorflow,不适用于我的 python 版本。所以我安装了 python3.7(来自源代码),启动我的 pipenv shell 时一切似乎都正常,我可以使用我的 python3.7.

但是在尝试导入 cv2 时,出现以下错误:

ImportError: OpenCV loader: missing configuration file: ['config-3.7.py', 'config-3.py']

所以我认为我应该针对我的特定 python3.7 重新编译 OpenCV,但我也想让它与我以前的 python3.8 一起使用。针对这两个版本,我该如何实现?

谢谢你的时间!

安托万

好吧,最后我成功地获得了 python3.7 和 3.8 的配置文件,其中 opencv 从源代码构建,执行以下操作:

我第一次编译OpenCv时没有为pythons写任何参数。所以默认情况下,它检测到我的 Python3.8 并创建了 config-3.8.py 文件。

然后,我针对我的 Python 3.7 使用这些参数重新编译了 OpenCv:

cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-master/modules ../opencv-master -D PYTHON3_EXECUTABLE='/usr/local/bin/python3.7m' \
-D PYTHON_INCLUDE_DIR='/usr/local/include/python3.7m' \
-D PYTHON3_LIBRARY='/home/ubuntu/Documents/Libraries/python3.7/Python-3.7.4/libpython3.7m.so' \
-D PYTHON3_NUMPY_INCLUDE_DIRS='/usr/local/lib/python3.7/site-packages/numpy/core/include' \
-D PYTHON3_PACKAGES_PATH='/usr/local/lib/python3.7/site-packages' ..

请注意 PYTHON3_LIBRARY 必须以共享库为目标(.so 而不是 .a)。我第一次编译 Python3.7 时没有使用标志 --enable-shared,所以它不起作用。

就在 运行 cmake(来自 OpenCv)之前,在配置步骤中,您应该以这些打印信息结束,以确保您的目标是正确的 python:(这里是对于python3.8,但是按照上面的步骤会显示python3.7)

那些PYTHON_FLAG和它们的用法不在像4.5.2这样的最新的Opencv文档中,而只在像3.2.0这样的以前的文档中:

https://docs.opencv.org/4.5.2/d7/d9f/tutorial_linux_install.html

https://docs.opencv.org/3.2.0/d7/d9f/tutorial_linux_install.html

然后我可以在 3.7 和 3.8 中导入 cv2

在 Windows 上解决该问题非常相似。不同之处在于,您必须确保找到 pyinstaller 从中加载信息的正确文件夹,因为一旦您拥有 cv2 容器以外的其他实例,这就很棘手了。 例如在我的机器中,我只能通过路径 as

才能解决它
--path=AppData\Local\pyinstaller\bincache00_py39_64bit\cv2

pyinstaller 命令的末尾添加该标志,一切都会正常进行。

我目前使用的是 OpenCV 4.5.5(截至今天的最新版本)。我能够使用以下方法获得与 DiXcipuli 相同的输出:

cmake ../
-DINSTALL_PYTHON_EXAMPLES=ON \
-DBUILD_EXAMPLES=ON \
-DBUILD_opencv_python3=ON

它使用当前在您的机器中设置为 python3 的 python 解释器(在终端上说“which python3”)。