如何在安装python2和python3时为python3构建opencv

时间:2016-05-06 10:40:19

标签: python opencv

我正在尝试为python3构建opencv。但是,即使我手动为python3指定了include和lib选项之后,cmake总是将python构建选项设置为python2.7.11:

    --   Python 2:
    --   Interpreter:                 /home/ryu/anaconda2/bin/python2.7 (ver 2.7.11)

    --   Python 3:
    --     Interpreter:                 /usr/bin/python3 (ver 3.4.3)
    --     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.4m (ver 3.4.3)
    --     numpy:                       /home/ryu/.local/lib/python3.4/site-packages/numpy/core/include (ver 1.11.0)  

    --  packages path:               lib/python3.4/dist-packages

-- 
--   **Python (for build):            /home/ryu/anaconda2/bin/python2.7**

我是否错过了一些cmake选项?

操作系统:Ubuntu 14,04

感谢

5 个答案:

答案 0 :(得分:29)

您可以通过在PYTHON_DEFAULT_EXECUTABLE调用期间附加带有python可执行URI的参数cmake来覆盖要构建的python可执行文件。

cmake {...} -DPYTHON_DEFAULT_EXECUTABLE=$(which python3) ..

答案 1 :(得分:2)

我在这个上挣扎了几个小时,上面提到的答案并不能立即解决问题。

除了要回答伊凡(Ivan)的问题之外,我还必须在cmake中包括这些标志才能使这项工作有效:

-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D BUILD_opencv_python3=ON \
-D HAVE_opencv_python3=ON \
-D PYTHON_DEFAULT_EXECUTABLE=<path_to_python3> 

我将其保留在此处,因此将来可能对其他人有用。

答案 2 :(得分:1)

我一直试图在Pi3上安装opencv,这个解决方案对我来说不起作用,因为python(for build)总是设置为Python2.7,但我发现通过改变顺序在&#39; OpenCVDetectPython.cmake&#39;底部的elseif语句解决了这个问题。对我来说,这个文件位于&#39;〜/ opencv-3.3.1 / cmake&#39;。

原始代码段:

if(PYTHON_DEFAULT_EXECUTABLE)
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
elseif(PYTHON2INTERP_FOUND) # Use Python 2 as default Python interpreter
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
    set(PYTHON_DEFAULT_EXECUTABLE "${PYTHON2_EXECUTABLE}")
elseif(PYTHON3INTERP_FOUND) # Use Python 3 as fallback Python interpreter (if there is no Python 2)
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
    set(PYTHON_DEFAULT_EXECUTABLE "${PYTHON3_EXECUTABLE}")
endif()

我重新订购的代码段:

if(PYTHON_DEFAULT_EXECUTABLE)
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
elseif(PYTHON3INTERP_FOUND) # Use Python 3 as fallback Python interpreter (if there is no Python 2)
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
    set(PYTHON_DEFAULT_EXECUTABLE "${PYTHON3_EXECUTABLE}")
elseif(PYTHON2INTERP_FOUND) # Use Python 2 as default Python interpreter
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
    set(PYTHON_DEFAULT_EXECUTABLE "${PYTHON2_EXECUTABLE}")
endif()

我不知道它背后的原因,但如果python2存在,则将cmake设置为默认为python2,交换这些elseif语句的顺序将其切换为默认为python3(如果存在)

** 免责声明 **

  1. 我使用在https://gist.github.com/willprice/c216fcbeba8d14ad1138找到的脚本来下载,安装和构建所有内容 (脚本被修改为不创建虚拟环境,因为我不想要一个,而j1不是j4,因为它在运行多个内核时失败了大约85%)。
  2. 在您尝试构建之前,我不认为相关文件存在。

答案 3 :(得分:1)

我花了几个小时。我使用opencv为python3构建了Dockerfile 密钥字符串是

pip install numpy

完整的Docker文件:

FROM python:3.8

RUN apt-get update && apt-get -y install \
    cmake \
    qtbase5-dev \
    libdc1394-22-dev \
    libavcodec-dev \
    libavformat-dev \
    libswscale-dev

RUN cd /lib \
    && git clone --branch 4.1.1 --depth 1  https://github.com/opencv/opencv.git \
    && git clone --branch 4.1.1 --depth 1  https://github.com/opencv/opencv_contrib.git

RUN pip install numpy \
    && mkdir /lib/opencv/build \
    && cd /lib/opencv/build \
    && cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DWITH_TBB=ON -DWITH_V4L=ON -DWITH_QT=ON -DWITH_OPENGL=ON -DWITH_FFMPEG=ON -DOPENCV_ENABLE_NONFREE=ON -DOPENCV_EXTRA_MODULES_PATH=/lib/opencv_contrib/modules .. \
    && make -j8 \
    && make install

CMD ["bash"]

主要要点是迫使编译器为python构建cv2模块

要做到这一点,我们需要将python3放在To be built文件夹CMakeCache.txt的{​​{1}}文件的build文件的opencv行中

ref https://breakthrough.github.io/Installing-OpenCV/

  

如果有任何错误,请确保您下载了所有必需的软件包-输出应有助于查找丢失的内容。为了确保将构建Python模块,运行cmake后,应该在已配置模块的列表中看到python2

(在我的情况下为python3)

答案 4 :(得分:0)

无论我修改了什么选项,更改cmake中的选项对我都没有任何作用。对我来说最简单的(hacky)解决方案是

sudo mv /usr/bin/python2.7 /usr/bin/pythonNO-temp

然后构建并安装opencv

然后

sudo mv /usr/bin/pythonNO-temp /usr/bin/python2.7