You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 2.7.14+OpenCV绘制日文文本显示乱码(?????)求助

解决OpenCV在Python2.7中绘制日文文本乱码的问题

这个问题我太熟了——OpenCV的cv2.putText天生就不支持日文这类非ASCII字符,默认的FONT_HERSHEY系列字体只兼容ASCII,所以才会显示一堆?????。给你个靠谱的解决方案,用PIL(Pillow)绕开这个限制,步骤清晰,亲测有效:

核心思路

OpenCV的文本渲染对复杂字符集支持极差,所以我们换用PIL来绘制日文文本,再把处理后的图像转回OpenCV兼容的格式。

1. 安装兼容Python2.7的Pillow

Python2.7只能用旧版本的Pillow,执行以下命令安装:

pip install pillow==6.2.2

2. 准备日文字体

你需要一个支持日文的字体文件,比如:

  • Windows系统:自带的msjh.ttc(微软黑体,路径一般是C:\Windows\Fonts\msjh.ttc)
  • Mac系统:/Library/Fonts/NotoSansCJKjp-Regular.otf
  • 跨平台:可以下载开源的Noto Sans CJK JP字体放到项目目录里

3. 替换原有的cv2.putText代码

用下面的函数替代原有的文本绘制逻辑,完全适配你的需求:

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

def draw_japanese_text(frame, text, pos, font_path, font_size, color, thickness):
    # 把OpenCV的BGR帧转成PIL的RGB格式
    img_pil = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(img_pil)
    
    # 加载指定的日文字体
    font = ImageFont.truetype(font_path, font_size)
    
    # Python2.7必须用Unicode字符串(加u前缀),否则会有编码问题
    draw.text(pos, text, font=font, fill=color)
    
    # 转回OpenCV的BGR格式返回
    return cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)

# 替换你原来的cv2.putText调用
# 注意:把font_path改成你实际的字体路径
frame = draw_japanese_text(
    frame,
    u"電撃文庫",  # 必须加u前缀声明Unicode字符串
    (left + 6, bottom - 6),
    "C:/Windows/Fonts/msjh.ttc",  # 示例路径,换成你自己的
    40,  # 对应原代码的2.0字号,这里是像素大小,可按需调整
    (255, 255, 255),  # RGB颜色,和原代码的白色一致
    1
)

关键注意事项

  • 字体路径必须正确:如果找不到字体,PIL会直接报错,一定要确认路径无误
  • Python2的Unicode字符串:务必给日文文本加u前缀,比如u"電撃文庫",否则会出现编码乱码
  • 字号调整:原代码的2.0是相对字号,这里用像素大小(比如40),你可以根据显示效果微调
  • 颜色顺序:PIL用RGB颜色,和OpenCV的BGR顺序一致,所以直接填(255,255,255)就是白色,和你原来的需求匹配

内容的提问来源于stack exchange,提问作者Elsammak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:07:58