opencv自带的putText函数无法输出utf8类型的字符,因此无法将中文打印到图片上。用的freetype可以实现中文输出,但是需要将字符解码转码比较麻烦,而Pillow的Image函数输出中文则相对容易些,因此这里的做法是现将图片从从cv2格式转到PIL格式,加上中文后再转成cv2格式输出。
1. 下载中文字体库
这里可以参考之前matplotlib输出中文的的第一部分。
2. cv2转PIL
import Image, ImageDraw, ImageFont, cv2cap = cv2.VideoCapture(0) # 从视频流中截取图片ret, im = cap.read()cv2_im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同pil_im = Image.fromarray(cv2_im)
3. PIL图片上打印中文
draw = ImageDraw.Draw(pil_im) # 括号中为需要打印的canvas,这里就是在图片上直接打印font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8) # 第一个参数为字体文件路径,第二个为字体大小draw.text((0, 0), "eg:打印在这里", (0, 0, 255), font=font) # 第一个参数为打印的坐标,第二个为打印的文本,第三个为字体颜色,第四个为字体
4. PIL图片转cv2
import numpy as npcv2_text_im = cv2.cvrColor(np.array(pil_im), cv2.COLOR_RGB2BGR))cv2.imshow("Video", cv2_text_im)