Python3/OpenCV显示带变音符号字符的问题求助
解决OpenCV cv2.putText()显示变音符号为问号的问题
嘿,这个问题我之前也碰到过!OpenCV自带的cv2.putText()确实有个坑——它默认的字体(比如FONT_HERSHEY_SIMPLEX这类)只支持ASCII字符,像é、ä、ô这类带变音符号的Unicode字符根本没法正常渲染,所以才会被替换成问号。而控制台能正常显示,是因为你的终端使用的字体本身支持Unicode字符集。
下面给你两个靠谱的解决方案,任选其一就行:
方案一:用PIL(Pillow)库绘制文本后转OpenCV格式
PIL对Unicode字符的支持更好,我们可以先把OpenCV的图像转成PIL格式,用PIL绘制文本,再转回OpenCV格式显示:
步骤与代码示例
import cv2 from PIL import Image, ImageDraw, ImageFont import numpy as np # 假设你的摄像头帧是frame,带变音符号的文本是message message = "Café, Äpfel, Ômega" # 1. 将OpenCV的BGR图像转为RGB格式(PIL用RGB) frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 2. 转换为PIL Image对象 pil_image = Image.fromarray(frame_rgb) # 3. 加载支持Unicode的字体(比如DejaVuSans、Arial、Noto Sans) # 可以指定字体文件路径,比如系统字体路径或项目里的字体文件 font = ImageFont.truetype("DejaVuSans.ttf", 40) # 字体大小设为40 # 4. 创建绘图对象 draw = ImageDraw.Draw(pil_image) # 5. 绘制文本:位置(20,180),颜色用RGB格式的绿色(0,255,0) draw.text((20, 180), message, font=font, fill=(0, 255, 0)) # 6. 转回OpenCV的BGR格式 frame = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) # 显示画面 cv2.imshow('Webcam', frame)
方案二:使用OpenCV的freetype模块(需安装扩展包)
OpenCV的扩展包opencv-contrib-python里有cv2.freetype模块,支持加载TrueType字体,直接渲染Unicode字符:
步骤与代码示例
- 先安装扩展包:
pip install opencv-contrib-python
- 编写代码:
import cv2 # 初始化FreeType字体加载器 ft = cv2.freetype.createFreeType2() # 加载支持Unicode的字体文件,比如DejaVuSans.ttf ft.loadFontData(fontFileName='DejaVuSans.ttf', id=0) message = "Café, Äpfel, Ômega" # 绘制文本:参数依次是图像、文本、位置、字体高度、颜色、厚度 ft.putText(img=frame, text=message, org=(20, 180), fontHeight=40, color=(0, 255, 0), thickness=3) cv2.imshow('Webcam', frame)
注意事项
- 确保你使用的字体文件确实支持这些变音符号,推荐用DejaVu Sans、Arial、Noto Sans这类通用字体
- 字体路径说明:
- Windows系统:字体通常在
C:\Windows\Fonts\,比如arial.ttf - Linux系统:字体路径一般是
/usr/share/fonts/或~/.fonts/ - Mac系统:字体在
/Library/Fonts/ - 也可以下载一个支持Unicode的TrueType字体,放在项目目录里,直接用相对路径引用
- Windows系统:字体通常在
内容的提问来源于stack exchange,提问作者Materia Dura
相关产品推荐
相关产品推荐

