python 解决cv2绘制中文乱码

本文介绍了一种在OpenCV图像处理中添加中文注释的方法,解决了cv2.putText()仅支持英文字符的问题。通过将OpenCV图片转换为PIL格式,使用PIL的ImageDraw和ImageFont模块绘制中文,再转换回OpenCV格式,实现了在图像上添加中文的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为使用cv2.putText() 只能显示英文字符,中文会出现乱码问题,

因此使用PIL在图片上绘制添加中文,可以指定字体文件。

大体思路:

  • OpenCV图片格式转换成PIL的图片格式;
  • 使用PIL绘制文字;
  • PIL图片格式转换成OpenCV的图片格式;

具体实现:

# coding=utf-8
# cv2解决绘制中文乱码
 
import cv2
import numpy
from PIL import Image, ImageDraw, ImageFont

 
def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
    if (isinstance(img, numpy.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(img)
    # 字体的格式
    fontStyle = ImageFont.truetype(
        "font/simsun.ttc", textSize, encoding="utf-8")
    # 绘制文本
    draw.text((left, top), text, textColor, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)


if __name__ == '__main__':
    img = cv2ImgAddText(cv2.imread('img1.jpg'), "大家好,我是片天边的云彩", 10, 65, (0, 0 , 139), 20)
    cv2.imshow('show', img)
    if cv2.waitKey(100000) & 0xFF == ord('q'):
        cv2.destroyAllWindows()   
    

效果展示:
在这里插入图片描述

### 解决 Python OpenCV `cv2.putText` 函数显示中文乱码的方法 当使用 OpenCV 的 `cv2.putText()` 方法尝试绘制中文字符时,可能会遇到乱码问题。这是因为默认情况下,OpenCV 并不支持 UTF-8 编码的字符串以及复杂的字体渲染。 一种有效的解决方案是利用 Pillow 库来处理文字绘制部分,再将其转换回 OpenCV 图像格式。具体实现如下: #### 使用 Pillow 和 NumPy 处理中文文本 通过引入 Pillow 来创建带有指定中文字体的文字图片,并最终转成适合 OpenCV 显示的形式[^1]。 ```python from PIL import Image, ImageDraw, ImageFont import numpy as np import cv2 def put_chinese_text(image_path, text, position=(50, 50)): # 加载原始图像并准备画布 img_bgr = cv2.imread(image_path) # 将 BGR 色彩模式转化为 RGB 方便后续操作 img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # 构建PIL.Image对象用于绘图 pil_image = Image.fromarray(img_rgb) draw = ImageDraw.Draw(pil_image) # 设置字体样式与大小 font_style = ImageFont.truetype("simhei.ttf", 40, encoding="utf-8") # 在图像上写入汉字 draw.text(position, text, fill=(255, 0, 0), font=font_style) # 把修改过的图像重新转化回numpy数组形式供opencv读取 final_img_np_array = np.array(pil_image) # 返回至BGR色彩空间以便于保存或展示 result_img = cv2.cvtColor(final_img_np_array, cv2.COLOR_RGB2BGR) return result_img if __name__ == "__main__": output = put_chinese_text('example.jpg', '你好世界') cv2.imshow('Result with Chinese Text', output) cv2.waitKey(0) ``` 此方法绕过了 OpenCV 对复杂字体的支持不足的问题,借助第三方库实现了高质量的中文文本渲染效果。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gmHappy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值