无法使用 python3 安装 openCV 3.1.0。 CMAKE 未正确包含或链接 python
Cannot install openCV 3.1.0 with python3. CMAKE not including or linking python correctly
我正在尝试在我的机器上使用 Python3 安装 OpenCV 3.1.0。因为我有 Ubuntu 16.04,所以我完全遵循这个指南:
http://www.pyimagesearch.com/2016/10/24/ubuntu-16-04-how-to-install-opencv/
但是,我在 运行 cmake 之后的第 4 步遇到了问题。我的 cmake 程序的输出有这个片段:
-- OpenCL:
-- Version: dynamic
-- Include path: /home/kevin/opencv-3.1.0/3rdparty/include/opencl/1.2
-- Use AMDFFT: NO
-- Use AMDBLAS: NO
--
-- Python 2:
-- Interpreter: /home/kevin/.virtualenvs/cv/bin/python (ver 3.5.2)
--
-- Python 3:
-- Interpreter: /home/kevin/.virtualenvs/cv/bin/python3 (ver 3.5.2)
--
-- Python (for build): /home/kevin/.virtualenvs/cv/bin/python
--
-- Java:
-- ant: NO
-- JNI: /usr/lib/jvm/java-8-oracle/include /usr/lib/jvm/java-8-oracle/include/linux /usr/lib/jvm/java-8-oracle/include
-- Java wrappers: NO
-- Java tests: NO
cmake 文件似乎没有正确 link python 部分下缺少的属性(库、numpy、packages_path)。我尝试编译并安装 opencv,当我加载 python3 并导入 cv 时,它说找不到 cv 包。
我尝试修改 CMAKE 命令,因此我没有使用指南建议的内容,而是添加了三个参数来强制 cmake 包含缺少的 python 属性(最后三个属性是我修改的):
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
-D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
-D BUILD_EXAMPLES=ON \
-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so \
-D PYTHON_NUMPY_INCLUDE_DIR=~/.virtualenvs/cv/lib/python3.5/site-packages/numpy/core/include \
-D PYTHON_PACKAGES_PATH=~/.virtualenvs/cv/lib/python3.5/site-packes ..
但是,cmake 的输出仍然是相同的(它只列出了解释器,没有其他 python 属性),当我尝试构建 opencv 并安装它时,我的 python 解释器找不到 opencv 包。
我的 /usr/local/lib/python3.5/ 文件在我完成安装 opencv 后也没有站点包目录。
谁能指出我正确的方向?在过去的几个小时里,我一直在尝试搜索如何解决这个问题,但到目前为止还没有找到方法,所以我非常感谢任何指导。谢谢!
更新
我意识到我必须将 -D BUILD_opencv_python3=yes 添加到 cmake 命令,以便 opencv 查找 python 库。但是,这是我从 cmake 获得的新输出:
-- Python 3:
-- Interpreter: /home/kevin/.virtualenvs/cv/bin/python (ver 3.5.2)
-- Libraries: NO
-- numpy: NO (Python3 wrappers can not be generated)
-- packages path: lib/python3.5/site-packages
知道为什么 cmake 没有正确找到我的 python 3 个库(即使我将“-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so”添加到 cmake选项)?
更新
我通过删除整个 /build 目录解决了这个问题,运行 cmake 在一个新目录上。我认为错误继续出现是因为 cmake 做了一些缓存,但是添加标志 -D BUILD_opencv_python3=yes 似乎对我有用。
我通过删除整个 /build 目录并再次 运行 cmake(使用 -D BUILD_opencv_python3=yes)解决了我的问题。我认为它由于 cmake 的某种缓存而出错,所以当我删除所有内容并重新开始时,错误消失了。
我相信,这个问题是由 cmake-gui 的内部错误引起的; OPENCV_PYTHON_VERSION 变量被视为布尔值,而 cmake 脚本将该变量视为您首选 python 版本的占位符。因此,删除变量并手动重新添加为字符串数据类型,初始值为您首选的 python 版本。例如,3.7。
一旦你按下生成,cmake 将接受 python 模块和你填充的库并包含变量。但是,如果您需要再次按生成,请自由执行此操作而无需修改 OPENCV_PYTHON_VERSION 变量,因为 cmake gui 将再次 return 它作为布尔值,同时您插入的首选值会在内部维护和缓存。
上述解决方案对我不起作用,我必须指定一大堆选项才能让 cmake 识别 python3。这成功了:
cmake {...} -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON \
-D PYTHON3_EXECUTABLE=$(which python3) \
-D PYTHON_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON_INCLUDE_DIR2=$(python3 -c "from os.path import dirname; from distutils.sysconfig import get_config_h_filename; print(dirname(get_config_h_filename()))") \
-D PYTHON_LIBRARY=$(python3 -c "from distutils.sysconfig import get_config_var;from os.path import dirname,join ; print(join(dirname(get_config_var('LIBPC')),get_config_var('LDLIBRARY')))") \
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print(numpy.get_include())") \
-D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")
您可以启用cmake输出或CmakeVars来检查python2或python3是否不可用(寻找它)
如果是这种情况,运行 cmake 将无法成功,除非您从构建文件夹中清除 CMakeCache.txt 和 .cmake 文件
你可以留下剩下的,不要再编译所有东西
因为我在内部使用 docker 我禁用了一些其他东西,但如果你愿意,你可以使用它
但根据需要调整变量
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D WITH_OPENCL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.2/modules -D WITH_LIBV4L=OFF -D WITH_V4L=OFF -D INSTALL_C_EXAMPLES=OFF -D WITH_DC1394=OFF -D ENABLE_NEON=OFF -D OPENCV_ENABLE_NONFREE=ON -D WITH_PROTOBUF=OFF -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_OPENCV_PYTHON3=yes -D PYTHON3_EXECUTABLE=$(which python3) -D PYTHON_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -D PYTHON_INCLUDE_DIR2=$(python3 -c "from os.path import dirname; from distutils.sysconfig import get_config_h_filename; print(dirname(get_config_h_filename()))") -D PYTHON_LIBRARY=$(python3 -c "from distutils.sysconfig import get_config_var;from os.path import dirname,join ; print(join(dirname(get_config_var('LIBPC')),get_config_var('LDLIBRARY')))") -D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print(numpy.get_include())") -D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..
如果您使用的是 ARM64,这可能是问题所在:https://github.com/numpy/numpy/issues/18131
setting OPENBLAS_CORETYPE=ARMV8解决了cmake没有选择python3
我正在尝试在我的机器上使用 Python3 安装 OpenCV 3.1.0。因为我有 Ubuntu 16.04,所以我完全遵循这个指南:
http://www.pyimagesearch.com/2016/10/24/ubuntu-16-04-how-to-install-opencv/
但是,我在 运行 cmake 之后的第 4 步遇到了问题。我的 cmake 程序的输出有这个片段:
-- OpenCL:
-- Version: dynamic
-- Include path: /home/kevin/opencv-3.1.0/3rdparty/include/opencl/1.2
-- Use AMDFFT: NO
-- Use AMDBLAS: NO
--
-- Python 2:
-- Interpreter: /home/kevin/.virtualenvs/cv/bin/python (ver 3.5.2)
--
-- Python 3:
-- Interpreter: /home/kevin/.virtualenvs/cv/bin/python3 (ver 3.5.2)
--
-- Python (for build): /home/kevin/.virtualenvs/cv/bin/python
--
-- Java:
-- ant: NO
-- JNI: /usr/lib/jvm/java-8-oracle/include /usr/lib/jvm/java-8-oracle/include/linux /usr/lib/jvm/java-8-oracle/include
-- Java wrappers: NO
-- Java tests: NO
cmake 文件似乎没有正确 link python 部分下缺少的属性(库、numpy、packages_path)。我尝试编译并安装 opencv,当我加载 python3 并导入 cv 时,它说找不到 cv 包。
我尝试修改 CMAKE 命令,因此我没有使用指南建议的内容,而是添加了三个参数来强制 cmake 包含缺少的 python 属性(最后三个属性是我修改的):
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
-D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
-D BUILD_EXAMPLES=ON \
-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so \
-D PYTHON_NUMPY_INCLUDE_DIR=~/.virtualenvs/cv/lib/python3.5/site-packages/numpy/core/include \
-D PYTHON_PACKAGES_PATH=~/.virtualenvs/cv/lib/python3.5/site-packes ..
但是,cmake 的输出仍然是相同的(它只列出了解释器,没有其他 python 属性),当我尝试构建 opencv 并安装它时,我的 python 解释器找不到 opencv 包。
我的 /usr/local/lib/python3.5/ 文件在我完成安装 opencv 后也没有站点包目录。
谁能指出我正确的方向?在过去的几个小时里,我一直在尝试搜索如何解决这个问题,但到目前为止还没有找到方法,所以我非常感谢任何指导。谢谢!
更新
我意识到我必须将 -D BUILD_opencv_python3=yes 添加到 cmake 命令,以便 opencv 查找 python 库。但是,这是我从 cmake 获得的新输出:
-- Python 3:
-- Interpreter: /home/kevin/.virtualenvs/cv/bin/python (ver 3.5.2)
-- Libraries: NO
-- numpy: NO (Python3 wrappers can not be generated)
-- packages path: lib/python3.5/site-packages
知道为什么 cmake 没有正确找到我的 python 3 个库(即使我将“-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so”添加到 cmake选项)?
更新
我通过删除整个 /build 目录解决了这个问题,运行 cmake 在一个新目录上。我认为错误继续出现是因为 cmake 做了一些缓存,但是添加标志 -D BUILD_opencv_python3=yes 似乎对我有用。
我通过删除整个 /build 目录并再次 运行 cmake(使用 -D BUILD_opencv_python3=yes)解决了我的问题。我认为它由于 cmake 的某种缓存而出错,所以当我删除所有内容并重新开始时,错误消失了。
我相信,这个问题是由 cmake-gui 的内部错误引起的; OPENCV_PYTHON_VERSION 变量被视为布尔值,而 cmake 脚本将该变量视为您首选 python 版本的占位符。因此,删除变量并手动重新添加为字符串数据类型,初始值为您首选的 python 版本。例如,3.7。 一旦你按下生成,cmake 将接受 python 模块和你填充的库并包含变量。但是,如果您需要再次按生成,请自由执行此操作而无需修改 OPENCV_PYTHON_VERSION 变量,因为 cmake gui 将再次 return 它作为布尔值,同时您插入的首选值会在内部维护和缓存。
上述解决方案对我不起作用,我必须指定一大堆选项才能让 cmake 识别 python3。这成功了:
cmake {...} -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON \
-D PYTHON3_EXECUTABLE=$(which python3) \
-D PYTHON_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON_INCLUDE_DIR2=$(python3 -c "from os.path import dirname; from distutils.sysconfig import get_config_h_filename; print(dirname(get_config_h_filename()))") \
-D PYTHON_LIBRARY=$(python3 -c "from distutils.sysconfig import get_config_var;from os.path import dirname,join ; print(join(dirname(get_config_var('LIBPC')),get_config_var('LDLIBRARY')))") \
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print(numpy.get_include())") \
-D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")
您可以启用cmake输出或CmakeVars来检查python2或python3是否不可用(寻找它)
如果是这种情况,运行 cmake 将无法成功,除非您从构建文件夹中清除 CMakeCache.txt 和 .cmake 文件 你可以留下剩下的,不要再编译所有东西
因为我在内部使用 docker 我禁用了一些其他东西,但如果你愿意,你可以使用它 但根据需要调整变量
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D WITH_OPENCL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.2/modules -D WITH_LIBV4L=OFF -D WITH_V4L=OFF -D INSTALL_C_EXAMPLES=OFF -D WITH_DC1394=OFF -D ENABLE_NEON=OFF -D OPENCV_ENABLE_NONFREE=ON -D WITH_PROTOBUF=OFF -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_OPENCV_PYTHON3=yes -D PYTHON3_EXECUTABLE=$(which python3) -D PYTHON_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -D PYTHON_INCLUDE_DIR2=$(python3 -c "from os.path import dirname; from distutils.sysconfig import get_config_h_filename; print(dirname(get_config_h_filename()))") -D PYTHON_LIBRARY=$(python3 -c "from distutils.sysconfig import get_config_var;from os.path import dirname,join ; print(join(dirname(get_config_var('LIBPC')),get_config_var('LDLIBRARY')))") -D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print(numpy.get_include())") -D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..
如果您使用的是 ARM64,这可能是问题所在:https://github.com/numpy/numpy/issues/18131
setting OPENBLAS_CORETYPE=ARMV8解决了cmake没有选择python3