【问题标题】:Cannot install openCV 3.1.0 with python3. CMAKE not including or linking python correctly无法使用 python3 安装 openCV 3.1.0。 CMAKE 不包括或正确链接 python
【发布时间】:2017-07-27 01:45:52
【问题描述】:

我正在尝试在我的机器上安装带有 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 程序的输出有这个 sn-p:

--   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 文件似乎没有正确链接 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 包。

在我完成 opencv 安装后,我的 /usr/local/lib/python3.5/ 文件也没有站点包目录。

谁能指出我正确的方向?过去几个小时我一直在尝试搜索如何解决这个问题,但到目前为止找不到方法,所以我非常感谢任何指导。谢谢!

更新

我意识到我必须将 -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 库(即使我在 cmake 选项中添加了“-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so”)?

更新

我通过删除整个 /build 目录并在新目录上运行 cmake 解决了这个问题。我认为由于 cmake 完成了一些缓存,错误继续出现,但添加标志 -D BUILD_opencv_python3=yes 似乎对我有用。

【问题讨论】:

  • 您的 PYTHON_PACKAGES_PATH 拼写是否正确?最后一个文件夹是“站点包”。不应该是“站点包”吗?
  • 谢谢,确实是错字。但是,我通过删除整个 /build 目录并再次运行 cmake(使用 -D BUILD_opencv_python3=yes)解决了我的问题。我认为由于 cmake 的某种缓存,它给出了一个错误,所以当我删除所有内容并重新开始时,错误就消失了。
  • 您实际上回答了您的问题。如果您提供答案并接受它而不是更新问题,那就太好了。在此处查看更多信息stackoverflow.com/help/self-answer
  • 是的,你是对的。我会发布一个答案并接受它。希望它能以某种方式帮助未来的开发者!

标签: python python-3.x opencv cmake opencv3.1


【解决方案1】:

我通过删除整个 /build 目录并再次运行 cmake(使用 -D BUILD_opencv_python3=yes)解决了我的问题。我认为由于 cmake 的某种缓存,它给出了一个错误,所以当我删除所有内容并重新开始时,错误就消失了。

【讨论】:

  • 我遇到了同样的问题,这对我有用(Ubuntu 16.10、python3、Opencv3 with contrib)
【解决方案2】:

上述解决方案对我不起作用,我必须指定一大堆选项才能让 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())") 

【讨论】:

  • 非常感谢!我正在使用 pipenv,但不知道这些位置在哪里或如何找到它们。
  • 还是不行。 Libraries: NO -- numpy: NO (Python3 wrappers can not be generated) -- install path: -
  • @Eyshika 在 Windows 上,PYTHON_LIBRARY 出现错误。 (get_config_var 返回None)手动提供路径(~/AppData/Local/Programs/Python/Python39/libs/python39.lib)解决了这个问题。
【解决方案3】:

我相信,这个问题是由 cmake-gui 的内部错误引起的; OPENCV_PYTHON_VERSION 变量被视为布尔值,而 cmake 脚本将该变量视为您首选 python 版本的占位符。因此,删除变量并手动重新添加为字符串数据类型,初始值是您首选的 python 版本。例如,3.7。 一旦你按下生成,cmake 将接受带有你填充的库的 python 模块并包含变量。但是,如果您需要再次按“生成”,请随意执行此操作,而无需修改 OPENCV_PYTHON_VERSION 变量,因为 cmake gui 将再次将其返回为布尔值,而您插入的首选值在内部得到维护和缓存。

【讨论】:

    【解决方案4】:

    你可以开启cmake输出或者CmakeVars来检查python2或者python3是否不可用(找找)

    如果是这种情况,再次运行 cmake 不会成功,除非你从 build 文件夹中清除 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())")  ..
    

    【讨论】:

      【解决方案5】:

      如果您使用的是 ARM64,这可能是问题所在:https://github.com/numpy/numpy/issues/18131

      设置 OPENBLAS_CORETYPE=ARMV8 解决了 cmake 不选择 python3

      【讨论】:

        猜你喜欢
        • 2018-03-19
        • 1970-01-01
        • 2021-01-23
        • 2019-08-23
        • 1970-01-01
        • 2016-08-05
        • 1970-01-01
        • 2016-11-24
        • 1970-01-01
        相关资源
        最近更新 更多