OpenCV添加文字的方法putText(...),添加英文是没有问题的,但如果想要添加中文就会出现“???”的乱码,这是因为opencv不支持中文显示,因此需要特殊处理一下。
实现思路
首先将图像转换为PIL格式,然后使用PIL来渲染中文文本,最后将渲染后的图像再转换回OpenCV格式。
第一步,OpenCV图片格式转换成PIL的图片格式。
这一行将OpenCV图像从BGR颜色空间转换为RGB颜色空间,并使用PIL库创建一个PIL图像对象
img_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
第二步,使用PIL绘制文字。
font = ImageFont.truetype(font='msyh.ttc', size=36)
draw = ImageDraw.Draw(img_pil)
draw.text(pos, text, font=font, fill=(255, 0, 0))
第三步,PIL图片格式转换成OpenCV的图片格式。
mg_cv = np.array(img_pil)
img = cv2.cvtColor(img_cv, cv2.COLOR_RGB2BGR)
完整代码
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
# 由于opencv不支持中文显示,首先将图像转换为PIL格式,然后使用PIL来渲染中文文本,最后将渲染后的图像再转换回OpenCV格式
def show_chinese(img, text, pos):
"""
:param img: opencv 图片
:param text: 显示的中文字体
:param pos: 显示位置
:return: 带有字体的显示图片(包含中文)
"""
img_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # 这一行将OpenCV图像从BGR颜色空间转换为RGB颜色空间,并使用PIL库创建一个PIL图像对象
font = ImageFont.truetype(font='msyh.ttc', size=36) # 该字体文件通常包含中文字符
draw = ImageDraw.Draw(img_pil) # 创建一个PIL图像的绘图对象draw,以便在图像上绘制文本。
draw.text(pos, text, font=font, fill=(255, 0, 0)) # PIL中RGB=(255,0,0)表示红色
img_cv = np.array(img_pil) # PIL图片转换为numpy,以便进一步用opencv处理
img = cv2.cvtColor(img_cv, cv2.COLOR_RGB2BGR) # PIL格式转换为OpenCV的BGR格式
return img
if __name__ == '__main__':
img = cv2.imread('001.jpg')
text = '中文'
img = show_chinese(img, text, (140, 60))
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
参考博客