编译 OpenCV 的 Python 依赖

小得盈满

2023/09/21

这一次编译 OpenCV 的 Python 依赖为了方便运行我们使用 Docker 进行编译,环境准备如下:

  1. 系统依赖:Ubuntu 18.04

  2. Python 版本:3.6,Ubuntu 18.04 官方源安装的默认版本

  3. OpenCV 版本:3.4.16,是目前 3.x 的最新版

  4. CMake 版本:3.10

  5. GCC 版本(含 C++):7.5

我们首先拉取并进入镜像:

docker pull ubuntu:18.04
docker run -it ubuntu:18.04 /bin/bash

然后我们配置下国内源:

cp /etc/apt/sources.list /etc/apt/sources.list.bak
sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list

确认下源可用:

apt update

安装 CMake 和 GCC/g++ 环境:

apt install cmake
apt install gcc g++

这里 CMake 默认是 3.10 版本,GCC 和 g++ 都是 7.5 的版本。

然后继续安装 Python 环境和 NumPy 依赖:

apt install python3 python3-dev python3-numpy

然后安装 FFmpeg 基本的库和 GStreamer 视频插件:

apt install libavcodec-dev libavformat-dev libswscale-dev
apt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev

然后安装必要的图像开发库:

apt install libpng-dev libjpeg-dev libopenexr-dev libtiff-dev libwebp-dev

如果需要界面的话得安装 GTK 组件,这个可选,我这里没有安装:

# GTK 2
apt install libgtk2.0-dev
# GTK 3
apt install libgtk-3-dev

然后下载 OpenCV 的源码包,通过链接 https://opencv.org/releases/ 下载,为了减小后续 Docker 镜像的大小,我们可以提前从外部把源码包映射进去,这样编译出来的内容不会影响镜像本身的大小,否则镜像会比较大。如果我们启动的时候忘记了引入外部卷,那么可以先编译完,然后把编译结果拷出去,然后再启动一个相同的原始镜像,直接映射编译好的完整的源码目录,上面的基础环境重新安装一遍后直接在编译好的基础上安装也是可以的,目的是为了减小镜像本身的大小。我们下面开始编译:

# 进入源码目录后执行
mkdir build
cd build
# 默认参数下会自动检测相关的依赖,正常是够用的
cmake ../

然后开始编译:

make -j4
# 安装
make install

安装之后我们测试一下 Python 依赖:

import cv2
print(cv2.__version__)

没问题的话我们可以退出容器:

exit

将结束的容器发布为镜像:

docker commit -m "OpenCV on Python3" -a "zengzy" <container-id> python3.6:opencv-3.4.16

然后可以删除原来的停止的容器。我们写个脚本测试下生成 H264 编码的视频:

import cv2
import numpy as np

vid = cv2.VideoWriter('out.mp4', cv2.VideoWriter_fourcc(*'avc1'), 25, (300,300))

for i in range(250):
    img = np.random.randint(0,255, (300,300,3), dtype=np.uint8)
    vid.write(img)
vid.release()

保存脚本为 test_video_writer.py 然后运行下:

docker run --rm -w `pwd` -v `pwd`:`pwd` python3.6:opencv-3.4.16 python3 test_video_writer.py

可以正常生成 mp4 视频文件并且正常播放的话就没问题了。

Reference:

  1. https://docs.opencv.org/3.4.20/d2/de6/tutorial_py_setup_in_ubuntu.html