构建支持中文字符的OpenCV Python包

自己动手,丰衣足食

构建支持中文字符的OpenCV Python包
Photo by Jackie chine

OpenCV的默认配置不支持在图像中绘制中文字符。要想在图像中绘制中文字符,需要在编译时启用FreeType模块。在上一篇文章中有过说明。

OpenCV绘制中文字符
不常用但是需要掌握

不过在部署时,使用Python作为开发语言的应用更倾向于使用pip来安装相关依赖,包括OpenCV。OpenCV官方提供了opencv-python系列包,但是,官方提供的opencv-python包没有启用FreeType模块。这种状况下,我们需要自行编译启用FreeType的opencv-python包。以下为具体过程。

环境为Ubuntu 20.04, x64架构。Python 3.8。

获取源码

首先从官方代码仓库获取源码。该项目还同时包含了opencv-contrib与opencv-extra,要有耐心。

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

代码clone完毕之后检出你要编译的标签。你可以在该项目的release页面找到可用的标签。

启用FreeType支持

然后配置cmake选项。使用以下命令启用FreeType支持。

export CMAKE_ARGS="-DWITH_FREETYPE=ON -DBUILD_opencv_freetype=ON"

配置编译对象

接下来配置编译对象。OpenCV的Python包有四种可选方案,大概可以分为两组。

第一组为提供了GUI支持的方案,如果你需要使用 imshow 函数的话选择这两种。

  1. opencv-python。最为常用的OpenCV模块组合。
  2. opencv-contrib-python。包含了contrib模块的组合。contrib模块中有一些较新的算法暂时无法并入默认模块中。

第二组为无GUI支持的方案,适合部署在云端服务器或者Docker环境等不需要图像界面的情况。同样也按照是否包含contrib模块细分为两种:

  1. opencv-python-headless。
  2. opencv-contrib-python-headless。

这里以opencv-contrib-python为例,使用环境变量:

export ENABLE_CONTRIB=1

开始编译

配置完成后,使用pip正式开启构建过程。

pip3 wheel . --verbose

注意pip版本不能过低。我使用的是21.1.3。整个编译过程耗时视硬件配置。编译结束后便可获得安装文件。

安装

依照常规方式安装即可。例如:

python3 -m pip install opencv_contrib_python-4.5.3.56-cp38-cp38-manylinux2014_x86_64.whl 

总结

相比在部署设备或者Docker镜像中编译OpenCV,使用编译好的wheel文件可以缩短部署时间,减小Docker镜像体积。推荐在需要自定义OpenCV组件需求的环境下使用。