最近在尝试玩yolov8训练跌倒识别。然后兴高采烈地把状态类别全部换成中文。结果打开推理,全部乱码。
结果一搜索。

🎉破案成功,卷帘门拉下来吧—— OpenCV 版本是:

🥸 4.11.0

也就是说,现在的 OpenCV:

不支持中文 cv2.putText()(原始函数)

  • 你画中文会直接乱码 → 口口口 复读机上线
  • 因为这个版本没带 freetype 模块
  • 而 freetype 是必须自己编译进来的模块,pip 装是没有的

🧯 现在有 3 条路可以选


🟡 路线 1:先用 PIL 绘字(你已经快搞定的方案)

优点:

  • 简单、直接
  • 现有环境不动

缺点:

  • 延迟高一点
  • 代码写法稍微复杂

🟢 路线 2:装 OpenCV 5.x rolling 版(尝鲜但爽)

命令如下:

pip uninstall opencv-python
pip install opencv-python-rolling

然后直接用 cv2.putText() 绘制中文就不乱码了(OpenCV 5 已内置中文支持 🎉)

用的是 YOLOv8 + Python 3.8,兼容没问题,直接上。


🔴 路线 3:自己编译 OpenCV + freetype(高级玩家专属)

适合愿意追求极致性能、干净优雅、不依赖 PIL 的话。

但 Windows 上编译 OpenCV 就像打一个“Debug 冥想副本”,要下载:

  • cmake
  • Visual Studio Build Tools
  • vcpkg 或手动编译 freetype & harfbuzz
  • 手动配置 contrib modules
  • CMake config 成功 1 次 = 成就解锁

🤔 总结一下你该选哪个

如果你 选这个
想现在立刻跑,不想动环境 PIL 方案 ✅
想简洁用原生 putText() 写中文 rolling 版 OpenCV 5.x ✅
想干干净净、延迟低、不装 PIL 自编译 OpenCV + freetype 🧨(警告级难度)

突然想起来我的小本本还装了WSL。
直接在Linux环境编译不就好了,何必在win上面折腾。

WSL 是编译 OpenCV 的天选之地,尤其是你不想在 Windows 上点开 57 个对话框和 GUI 的时候。


✅ 用不用 WSL 编译?答案是:

YES,千万别浪费,WSL 更适合编译 OpenCV!


🤔 为什么 WSL 更适合?

比较点 Windows 编译 WSL 编译
依赖管理 杂乱 + GUI 地狱 apt 一键装干净爽快
脚本运行 容易路径问题 没有奇怪的盘符
构建流程 Visual Studio + CMake GUI 命令行走天下
中文路径 & 空格 容易出事 零风险
速度 会慢一点 快很多(尤其用 WSL2)

✨ WSL 上该怎么做?

以下是极简路线图:


🧱 Step 1:更新系统 & 安装依赖

sudo apt update
sudo apt install -y build-essential cmake git pkg-config \
libfreetype6-dev libharfbuzz-dev libpng-dev libjpeg-dev libtiff-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
libxvidcore-dev libx264-dev libgtk-3-dev libatlas-base-dev \
gfortran python3-dev python3-pip

🧬 Step 2:拉源码

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv
mkdir build && cd build

⚙️ Step 3:CMake 配置

cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D WITH_FREETYPE=ON \
-D WITH_GTK=ON \
-D BUILD_opencv_python3=ON \
-D PYTHON3_EXECUTABLE=$(which python3) \
-D PYTHON3_INCLUDE_DIR=$(python3 -c "from sysconfig import get_paths as gp; print(gp()['include'])") \
-D PYTHON3_LIBRARY=$CONDA_PREFIX/lib/libpython3.10.so \
-D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib") \
..


image-20250407113353906

🚀 Step 4:编译并安装

make -j$(nproc)
sudo make install

大概 10~30 分钟,取决于你的电脑,别急,泡杯枸杞水。


🧪 Step 5:验证中文显示

import cv2
import numpy as np

img = np.ones((400, 800, 3), dtype=np.uint8) * 255

ft2 = cv2.freetype.createFreeType2()
ft2.loadFontData("/home/peter/NotoSansCJKsc-Regular.otf", 0) # 用你自己的路径!

ft2.putText(img, "我终于成功了!", (50, 200), fontHeight=60,
color=(0, 0, 255), thickness=-1,
line_type=cv2.LINE_AA, bottomLeftOrigin=False)

cv2.imshow("庆功图", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2
cv2.freetype.createFreeType2()

image-20250407125634224

如果没报错 = freetype 模块成功加载!🥳


🧠 Bonus:让你的 Python 用上这个 OpenCV

pip uninstall opencv-python
python3 -m pip install numpy
cd ~/opencv/build/python_loader
sudo python3 setup.py install
import cv2
import numpy as np

img = np.zeros((400, 800, 3), dtype=np.uint8)
cv2.putText(img, "𠮷野家™钛合金♻️", (50, 200), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 0), 4, cv2.LINE_AA)
cv2.imshow("Test", img)
cv2.waitKey(0)
cv2.destroyAllWindows()