Ubuntu20.04 和 Windows11 基于 PyPy3.10 编译安装 OpenCV4

发布时间 2023-09-06 02:34:25作者: Pyrokine

pypy 的速度算是毋庸置疑的了,但之前的版本兼容性一直不是很好,时隔多年回来,发现已经更新到 3.10 版本了,因此打算填上一些之前的坑,把 OpenCV 给编译出来(这片文章创建时间已经是三年前了)

Windows

先安装 Visual Studio 2022 ,其他版本也行,下面记得做对应的修改,理论上安装了就不用再安装下面链接了

https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/

下载 PyPy3 ,当前版本为 3.10 ,Windows 和 Linux 下载下来都是压缩包,解压后记住路径,笔者解压在 C 盘根目录下

https://www.pypy.org/download.html

添加目录到系统环境变量中,然后到目录里把除了pypy3.exe(应该任意一个可执行文件都可以)其他的文件都删了或新建个文件夹放进去,这样调用的时候不会冲突

重启后理论上可以直接链接到 PyPy 了,安装 pip 和 numpy

pypy3.exe -m ensurepip
pypy3.exe -m pip install numpy

安装 CMake,过程略

https://cmake.org/download/

拉取仓库(已包含 opencv-contrib-python )

git clone --recursive https://github.com/opencv/opencv-python.git

切换版本到 4.x 当前最新的 Release ,tag 可以在 git 上查看

git checkout 76

切换目录到opencv-python/opencv然后新建目录build并切换到目录下,(建议使用 git bash )执行以下命令编译 CPU 版本, cuda 版本需要添加的参数可自行查阅,PyPy 路径根据实际情况调整

cmake \
-G "Visual Studio 17 2022" \
-D PYTHON3_EXECUTABLE="C:/pypy3.10-v7.3.12-win64/pypy3.exe" \
-D PYTHON3_INCLUDE_DIR="C:/pypy3.10-v7.3.12-win64/include" \
-D PYTHON3_LIBRARY="C:/pypy3.10-v7.3.12-win64/libs/python310.lib" \
-D PYTHON3_NUMPY_INCLUDE_DIRS="C:/pypy3.10-v7.3.12-win64/Lib/site-packages/numpy/core/include" \
-D PYTHON3_PACKAGES_PATH="C:/pypy3.10-v7.3.12-win64/Lib/site-packages" \
-D OPENCV_EXTRA_MODULES_PATH="../../opencv_contrib/modules" \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_world=ON \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D CMAKE_BUILD_TYPE=RELEASE \
..

开始编译,编译完就顺带安装完了

cmake --build . --target INSTALL --config Release

测试是否安装成功,若输出4.8.0(或切到的对应版本)则安装成功

 pypy3.exe -c "import cv2;print(cv2.__version__)"

 

Ubuntu 20.04

奈何网上真就找不到一个像样的文章说明怎么在 Linux 下编译,最后根据上面 Windows 版本的参数和经验推导出了下面的安装过程

从官网下载 PyPy ,因为之前有其他版本,就做个多版本管理,解压到 /root/pypy/目录下,建议在服务器上解压,这样能恢复软链,假设还有 3.9 版本

tar -jxvf pypy3.10-v7.3.12-linux64.tar.bz2
tar -jxvf pypy3.9-v7.3.12-linux64.tar.bz2

设置软链优先级,3.9 和 3.10 分别为 1 和 2

sudo update-alternatives --install /usr/bin/pypy3 pypy3 /root/pypy/pypy3.9-v7.3.12-linux64/bin/pypy3.9 1
sudo update-alternatives --install /usr/bin/pypy3 pypy3 /root/pypy/pypy3.10-v7.3.12-linux64/bin/pypy3.10 2

查看当前根据优先级选择的版本

sudo update-alternatives --display pypy3

调整激活的软链

sudo update-alternatives --config pypy3

安装 pip 和 numpy

pypy3 -m ensurepip
pypy3 -m pip install numpy

安装依赖库

sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
                 libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev libtbb2 \
                 libtbb-dev libdc1394-22-dev libopenexr-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev

拉取仓库并切版本

git clone --recursive https://github.com/opencv/opencv-python.git
git -C opencv-python checkout 76

创建编译目录

mkdir opencv-python/opencv/build && cd opencv-python/opencv/build

禁用 conda 环境

conda deactivate

Configure CPU 版本,目录根据实际情况调整

cmake \
-D PYTHON3_EXECUTABLE="/root/pypy/pypy3.10-v7.3.12-linux64/bin/pypy3.10" \
-D PYTHON3_INCLUDE_DIR="/root/pypy/pypy3.10-v7.3.12-linux64/include/pypy3.10" \
-D PYTHON3_LIBRARY="/root/pypy/pypy3.10-v7.3.12-linux64/bin/libpypy3.10-c.so" \
-D PYTHON3_NUMPY_INCLUDE_DIRS="/root/pypy/pypy3.10-v7.3.12-linux64/lib/pypy3.10/site-packages/numpy/core/include" \
-D PYTHON3_PACKAGES_PATH="/root/pypy/pypy3.10-v7.3.12-linux64/lib/pypy3.10/site-packages" \
-D OPENCV_EXTRA_MODULES_PATH="../../opencv_contrib/modules" \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_world=ON \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D CMAKE_BUILD_TYPE=RELEASE \
..

编译并安装,并发数根据实际性能调整

make -j`nproc` && sudo make install

测试是否安装成功,若输出4.8.0(或切到的对应版本)则安装成功

pypy3 -c "import cv2;print(cv2.__version__)"

 

一个踩过的坑

如果是 python 的话,想下载 wheel 包可以去 PyPI 下载,但 pypy 是用不了的,会提示版本不符合要求,但搜了一下发现版本检查只是匹配文件名,因此改一下就可以安装,于是找到了命令

pypy3 -m pip debug --verbose

下载下来的包名是这样的

opencv_python-4.8.0.76-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

要符合要求只用把中间的版本号改一下就好了,变成下面

opencv_python-4.8.0.76-pp310-none-any.whl

安装如预期般顺利,启动就是地狱,或许有些时候是可以的,但 PyPy 这里,偷梁换柱怎么想都是不行的啦,老老实实去编译吧

 

感谢

# windows10+VS2022编译安装opencv-python
https://blog.csdn.net/RobinTomps/article/details/131472543
# Windows系统下编译opencv-python
https://blog.csdn.net/fixed_zhang/article/details/110930716
# 关于 pip has no attribute pep425tags 的解决
https://blog.csdn.net/qq_40772189/article/details/106455315