如何为Python 2和3构建OpenCV?

3
OpenCV Linux安装文档中,使用CMake从源代码构建OpenCV一节提到需要运行类似以下的命令:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

同时,Python有一些给定的参数:

[optional] Building python. Set the following python parameters:
PYTHON2(3)_EXECUTABLE = <path to python>
PYTHON_INCLUDE_DIR = /usr/include/python<version>
PYTHON_INCLUDE_DIR2 = /usr/include/x86_64-linux-gnu/python<version>
PYTHON_LIBRARY = /usr/lib/x86_64-linux-gnu/libpython<version>.so
PYTHON2(3)_NUMPY_INCLUDE_DIRS = /usr/lib/python<version>/dist-packages/numpy/core/include/

这些参数中有些可以轻松地为 Python 的两个版本设置:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D PYTHON2_EXECUTABLE=/usr/bin/python -D PYTHON3_EXECUTABLE=/usr/bin/python3  ..

但另一些则含糊不清。
PYTHON_INCLUDE_DIR = /usr/include/python<version>

是否有可能同时构建两个版本的Python?


您可能想查看 cmake/OpenCVDetectPython.cmake 文件 ... 接近底部。那里有两个完整的变量集,一个以 PYTHON2 为前缀,另一个以 PYTHON3 为前缀。(例如,我在那里看到了 PYTHON2_INCLUDE_DIRPYTHON3_INCLUDE_DIR)。 - Dan Mašek
@DanMašek 在哪里?没看见? - Dims
1
https://github.com/opencv/opencv/blob/master/cmake/OpenCVDetectPython.cmake#L225 - Dan Mašek
这是什么?我有Python 3.5 - Dims
3个回答

2
我建议您参考这个指南进行安装。
一般来说,您只需要安装两个版本的Python,然后运行安装脚本即可。无需手动指定Python路径,cmake会自动找到它们。
附上最近OpenCV安装输出的屏幕截图:terminal screenshot, python paths

2
截至2018年12月,我能够在我的Ubuntu16.04机器上使用CUDA、FFMpeg和TIFF(与Caffe一起使用非常有用)编译最新的OpenCV版本,并在Python2.7和3.5中运行它。这个构建受到了这篇文章的启发,所以要感谢他们!

克隆最新的存储库:

请注意,两个都必须是相同的版本,否则cmake会抱怨。确保同时克隆两个:
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

配置和构建:

首先,创建标准的构建环境:

cd opencv
mkdir build
cd build

然后,我用以下cmake命令成功了:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
             -D CMAKE_INSTALL_PREFIX=/usr/local \
             -D INSTALL_C_EXAMPLES=ON \
             -D OPENCV_EXTRA_MODULES_PATH=<LOCATION_OF_YOUR_OPENCV_CONTRIB>/modules \
             -D BUILD_EXAMPLES=ON \
             -D BUILD_opencv_python2=ON \
             -D WITH_FFMPEG=1 \
             -D WITH_TIFF=ON \
             -D WITH_CUDA=ON \
             -D CUDA_GENERATION=Pascal \
             -D ENABLE_FAST_MATH=1 \
             -D CUDA_FAST_MATH=1 \
             -D WITH_CUBLAS=1 \
             -D WITH_LAPACK=OFF \
             -D PYTHON2_EXECUTABLE=/usr/bin/python \
             -D PYTHON2_INCLUDE_DIR=/usr/include/python2.7 \
             -D PYTHON2_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
             -D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/local/lib/python2.7/dist-packages/numpy/core/include \
             -D PYTHON3_EXECUTABLE=/usr/bin/python3 \
             -D PYTHON3_INCLUDE_DIR=/usr/include/python3.5 \
             -D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so \
             -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/lib/python3.5/dist-packages/numpy/core/include \
             -D INSTALL_PYTHON_EXAMPLES=ON ..

请注意,您必须设置<LOCATION_OF_YOUR_OPENCV_CONTRIB>(您克隆它的位置),并且您可能需要根据系统设置调整PYTHON2PYTHON3标志。
我收到了一些警告(不确定有多严重),但是它已经通过了:过一会儿,您应该会看到类似以下内容的东西。
--   Install to:                    /usr/local
-- -----------------------------------------------------------------
-- 
-- Configuring done

编译和安装

同样地,标准的make -j<NUM_CORES> && sudo make install命令在此适用。请确保根据您的CPU核心数量调整-j参数以加快编译进程。之后,使用python命令即可运行。

import cv2

这段代码可以在Python 2和3中都运行。希望能对你有所帮助!
Andres


0

不,Python 2和Python 3中的二进制模块绑定是不同的。相同的构建库不能从Python 2和Python 3中使用。

但是您可以使用不同的CMAKE_INSTALL_PREFIX值在Python 2和Python 3上运行构建指令。


@Dims,是的,但似乎没有其他解决方案。从C编译的Python模块无法同时适用于Python 2和Python 3。 - glenfant
有没有可能只有两组 Python 模块,而留下所有其他的代码共享? - Dims
1
@Dims "是的",但这将涉及到源代码包中许多容易出错的自定义更改(需要自己完成)。就我个人而言,我宁愿在廉价硬盘上失去一些兆字节,也不愿因为不确定的收益而浪费数天的工作时间。 - glenfant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接