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
相关产品推荐
相关产品推荐

