我正在尝试为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
感谢
答案 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(如果存在)
** 免责声明 **
答案 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