为 Python 安装 OpenCV(支持多个 Python 版本)

9

我在电脑上安装了两个不同版本的Python:2.4 和 2.7。现在我想要在 2.7 版本上安装 OpenCV(2.4.5)。

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D BUILD_EXAMPLES=ON ..

它检测到当前安装的是 Python 2.4 版本:
--   Python:
--     Interpreter:                 /usr/bin/python2.4 (ver 2.4)
--     Libraries:                   /usr/lib64/python2.4/config/libpython2.4.a
--     numpy:                       /usr/lib64/python2.4/site-packages/numpy/core/include (ver 1.2.1)
--     packages path:               lib/python2.4/site-packages

后来在构建opencv时出现了以下错误:

[ 75%] Generating pyopencv_generated_funcs.h, pyopencv_generated_func_tab.h, pyopencv_generated_types.h, pyopencv_generated_type_reg.h, pyopencv_generated_const_reg.h
  File "/home/mmoghimi/opencv-2.4.5/modules/python/src2/gen2.py", line 815
    cname1=("cv::Algorithm" if classinfo.isalgorithm else classinfo.cname)))
                             ^
SyntaxError: invalid syntax
make[2]: *** [modules/python/pyopencv_generated_funcs.h] Error 1
make[1]: *** [modules/python/CMakeFiles/opencv_python.dir/all] Error 2
make: *** [all] Error 2

显然,它使用一种Python2.4不支持的新格式。那么,我的问题是是否有任何方法可以明确指定Python的版本?

3个回答

24

有一些 CMake 标志可以让您明确指定要使用的 Python 版本。您需要将这些标志的值设置为您的 Python 安装的正确位置。

以下是标志名称和可能的位置:

PYTHON_EXECUTABLE=/usr/bin/python2.7/
PYTHON_INCLUDE=/usr/include/python2.7/
PYTHON_LIBRARY=/usr/lib/libpython2.7.a    //or .so for shared library
PYTHON_PACKAGES_PATH=/usr/local/lib/python2.7/site-packages/
PYTHON_NUMPY_INCLUDE_DIR=/usr/local/lib/python2.7/dist-packages/numpy/core/include

如果这些路径无法使用,您需要在计算机上定位它们。


另外,我不得不在modules/python/src2/cv2.cpp的第一行中将Python.h更改为#include </usr/local/python-2.7/include/python2.7/Python.h>。否则,我认为它会找到2.4安装中的Python.h文件。 - Mohammad Moghimi
3
在 CMake GUI 中,这些标志(其中大部分)默认情况下是隐藏的,除非您勾选“高级”复选框。 - lapis
1
作为以后的参考,标志不是PYTHON_NUMPY_INCLUDE_DIR,而是PYTHON_NUMPY_INCLUDE_DIRS(注意"S")。 - Xealot
1
对于Python3,您想要执行PYTHON3_[PACKAGES|LIBRARY]等操作。 - JohnAllen
如果有人需要,这个 GitHub 上的回答提供了 Python3 的正确标志。 - Ciambello
显示剩余2条评论

2

使用 virtualenv

virtualenv -p python2.7 env
source env/bin/activate
python --version  # prints «Python 2.7.3»
pip install pyopencv

如果您需要支持2.4(或其他版本),只需创建新的环境即可。

我遇到了这个错误: 找不到任何opencv的发行版。 - Mohammad Moghimi
我也尝试在虚拟环境中再次运行cmake,但仍然无法工作。发现Python 2.4。 - Mohammad Moghimi
嗯...好的。这是我的错误,真正的OpenCV包名称是pyopencv。 - Sofia Velmer
似乎在做一些事情。现在我收到编译错误: package/extras/core/opencv_headers.hpp:7:20: 错误:没有那个文件或目录:cxcore.h - Mohammad Moghimi
你的系统中是否已经安装了OpenCV(而不是Python包)? - Sofia Velmer

1

这是一个质量较低的答案,但如果您已经尝试了十个小时并需要一些新的想法,它仍然非常有用。


这个问题花了我一整天的时间,我仍然不确定我是如何解决它的,但以下是一些指针,以防给出的答案本身无法帮助到你:
最初,我遵循这个指南,可以概括如下:
sudo apt-get update && sudo apt-get upgrade && sudo apt-get install build-essential git cmake pkg-config libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libgtk2.0-dev libatlas-base-dev gfortran

git clone https://github.com/Itseez/opencv.git && cd opencv &&git checkout 3.0.0

sudo apt-get install python2.7-dev && sudo apt-get install python3-dev

cd ~ && wget https://bootstrap.pypa.io/get-pip.py && sudo python get-pip.py

pip3.6 install numpy               # note that we specify the pip version after the command
                                   # it is also possible to write python3.6 to refer to the python version 3.6 command

# The following failed for me. Use it if it works for you.

cd ~/opencv && mkdir build && cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE 
 -D CMAKE_INSTALL_PREFIX=/usr/local 
 -D INSTALL_PYTHON_EXAMPLES=ON 
 -D INSTALL_C_EXAMPLES=ON 
 -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules 
 -D BUILD_EXAMPLES=ON ..

# This must be done after cmake worked. Pay attention to the start of the cmake output. It tells you whether it found the Python Interpreter.


cd ~/opencv && mkdir build && cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE 
 -D CMAKE_INSTALL_PREFIX=/usr/local 
 -D INSTALL_PYTHON_EXAMPLES=ON 
 -D INSTALL_C_EXAMPLES=ON 
 -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules 
 -D BUILD_EXAMPLES=ON ..

我已经安装了Python 2.7和3.4,并在/usr/local/bin中自己构建了Python 3.6。在遵循Aurelius' Answer并进行一些尝试后,我构建了这个cmake命令:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D BUILD_EXAMPLES=ON -D PYTHON_EXECUTABLE=/usr/local/bin/python3.6/ -D PYTHON_INCLUDE=/usr/local/include/python3.6m/ -D PYTHON_LIBRARY=/usr/local/lib/python3.6/ -D PYTHON_PACKAGES_PATH=/usr/local/lib/python3.6/site-packages/ -D PYTHON_NUMPY_INCLUDE_DIR=/usr/local/lib/python3.6/dist-packages/numpy/core/include/ -D PYTHON_INCLUDE_DIR=/usr/local/include/python3.6m/ -D PYTHON_LIBRARY=/usr/local/lib/  -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON3_EXAMPLES=ON -D INSTALL_C_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D BUILD_EXAMPLES=ON -D PYTHON3_INCLUDE=/usr/local/include/python3.6m/ -D PYTHON3_LIBRARY=/usr/local/lib/python3.6/ -D PYTHON3_PACKAGES_PATH=/usr/local/lib/python3.6/site-packages/ -D PYTHON3_NUMPY_INCLUDE_DIR=/usr/local/lib/python3.6/dist-packages/numpy/core/include/ -D PYTHON3_INCLUDE_DIR=/usr/local/include/python3.6m/ -D PYTHON3_LIBRARY=/usr/local/lib/ ..

请注意,这些中可能有很多是没有意义的。我一直在不停地尝试,直到找到可行的方法。 有些路径可以使用Python本身找到,例如

python3.6 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())"

或者直接在cmake命令中:

$ cmake .. \
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())")  \
-DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))")

此时,CMake 找到了正确的 Python 解释器和库...但是随后失败了,称它们没有找到。我只能从记忆中引用错误,因为我无法在 tmux 中向后滚动足够远,并且我不想再次复制该错误。

OpenCV 发现不合适的版本“1.4”,但至少需要 3.6

解决方法是 通过修改文件 build/../cmake/OpenCVDetectPython.cmake 中的某些检查项,准确地告诉 CMake 您需要什么

find_package( PythonInterp 3.6 REQUIRED )
find_package( PythonLibs 3.6 REQUIRED )

(请注意,这些已经过时

仍然没有起作用,因为我设置了cmake标志-D PYTHON3_EXECUTABLE这个电子邮件链 对于弄清楚问题很有帮助,并建议使用virtualenv作为替代解决方案。这可能是我应该从一开始就使用的。


1
我对这个答案非常有感情 - 在花了8个小时之后,看到你花了10个小时,然后又提供了至少2个小时的更多东西让我尝试,真的让我笑出声来。 - James_SO

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