【opencv】cv2.putText()函数绘制中文出现乱码
OpenCV 默认不支持 UTF-8 编码的中文字符渲染
·
在使用 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()
关键点:
- 使用
PIL.ImageDraw绘制中文 - 需要下载中文字体(如 SimHei)
- 转换图像格式:
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()
常见问题解决
-
字体文件获取:
- Windows:使用
C:/Windows/Fonts/下的.ttf文件(如msyh.ttc微软雅黑) - Linux:安装字体包
sudo apt install fonts-wqy-microhei - 手动下载:Google Noto Fonts
- Windows:使用
-
PIL 安装:
pip install pillow -
OpenCV 编译 FreeType 支持:
cmake -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_MODULES_PATH=opencv_contrib/modules ..
效果对比
原生 putText |
PIL 方案 | FreeType 方案 |
|---|---|---|
| 出现方框/乱码 | ✅ 清晰 | ✅ 清晰 |
推荐优先使用 PIL 方案,兼容性好且无需特殊编译 OpenCV。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)