在使用 OpenCV 的 cv2.putText() 函数绘制中文时会出现乱码问题,因为 OpenCV 默认不支持 UTF-8 编码的中文字符渲染。以下是两种可靠的解决方案:


方案 1:使用 PIL (Python Imaging Library) 绘制中文(推荐)

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

# 创建黑色背景
image = np.zeros((200, 400, 3), dtype=np.uint8)

# 将 OpenCV 图像转换为 PIL 格式
image_pil = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(image_pil)

# 指定中文字体路径(确保字体文件存在)
font_path = "simhei.ttf"  # 黑体常见路径(Windows:C:/Windows/Fonts/simhei.ttf)
font_size = 30
font = ImageFont.truetype(font_path, font_size)

# 绘制中文
text = "你好,OpenCV!"
position = (50, 80)  # 文字位置
text_color = (255, 255, 255)  # 白色
draw.text(position, text, font=font, fill=text_color)

# 转换回 OpenCV 格式
image_cv = cv2.cvtColor(np.array(image_pil), cv2.COLOR_RGB2BGR)

# 显示结果
cv2.imshow("Chinese Text", image_cv)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键点

  1. 使用 PIL.ImageDraw 绘制中文
  2. 需要下载中文字体(如 SimHei
  3. 转换图像格式:BGR ↔ RGB

方案 2:使用 FreeType 扩展(OpenCV 贡献版本)

适用于编译了 freetype 模块的 OpenCV 版本:

import cv2
import numpy as np

# 检查是否支持 freetype
print(cv2.__version__)  # 需 > 3.4.1

# 创建图像
image = np.zeros((200, 400, 3), dtype=np.uint8)

# 加载 FreeType2
ft = cv2.freetype.createFreeType2()
font_path = "simhei.ttf"  # 字体路径
ft.loadFontData(font_path, 0)

# 绘制中文
text = "你好,FreeType!"
position = (50, 100)
font_size = 30
text_color = (255, 255, 255)  # 白色
ft.putText(image, text, position, font_size, text_color, -1, 
           cv2.LINE_AA, True)

# 显示结果
cv2.imshow("Chinese via FreeType", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

常见问题解决

  1. 字体文件获取

    • Windows:使用 C:/Windows/Fonts/ 下的 .ttf 文件(如 msyh.ttc 微软雅黑)
    • Linux:安装字体包 sudo apt install fonts-wqy-microhei
    • 手动下载:Google Noto Fonts
  2. PIL 安装

    pip install pillow
    
  3. OpenCV 编译 FreeType 支持

    cmake -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_MODULES_PATH=opencv_contrib/modules ..
    

效果对比

原生 putText PIL 方案 FreeType 方案
出现方框/乱码 ✅ 清晰 ✅ 清晰

推荐优先使用 PIL 方案,兼容性好且无需特殊编译 OpenCV。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐