解决cv2.putText()函数不能在图片或视频流上打印中文

首先在linux系统下面安装配置字体文件

先到win10下面的windows/fonts/目录下将需要的字体文件拷贝出来;然后到linux系统下执行以下命令:

sudo mkdir /usr/share/fonts/win10  #在Ubuntu 系统目录/usr/share/fonts 下创建一个名为win10的目录,存放我们将要安装的字体文件
sudo cp /home/liuxiang/fonts/* /usr/share/fonts/win10  #将/home/liuxiang/fonts/下存放的字体文件复制到/usr/share/fonts/win10目录中
cd /usr/share/fonts/win10  #进入创建的字体目录

sudo mkfontscale  #创建字体的fonts.scale文件,它用来控制字体旋转缩放

sudo mkfontdir    #创建字体的fonts.dir文件,它用来控制字体粗斜体产生

sudo fc-cache -f -v  #建立字体缓存信息也就是让系统认识安装字体

 

近期在做人脸识别小项目,最后将识别的结果显示在图片或者视频上时,出现乱码;以这篇博客来做一个学习笔记。

经过查阅资料才知道cv2.putText()这个函数只能输出英文,对中文输出会出现乱码,上网找了好多教程,都只有在图片上打印中文的,最后才知道在视频中打印中文也是同样的方式。在上代码之前还是先介绍一下cv2.putText()这个函数,直接上代码吧。

cv2.putText(img, str(i), (123,456), font, 2, (0,255,0), 3)

上面参数解释(图片,需要打印的文本,打印的位置座标,字体,字体大小,颜色,字体粗细)

opencv在视频中通过putText函数能添加文字,但对于中文则会出现乱码。

需要打印中文的话,还需要将图片格式先转换一下,使用PIL在图片上绘制添加中文,可以指定字体文件。

现将在图片+视频中打印中文封装成一个函数,进行整体的调用:

import cv2
from PIL import Image,ImageDraw,ImageFont
import numpy as np

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

#在图片中打印中文
img = cv2.imread('C:\\Users\\liuxiang\\Desktop\\tupian\\huge.jpg')
img  = cv2AddChineseText(img,'胡歌',(100,100),(255, 0 , 0), 30)
cv2.imshow('img',img)
cv2.waitKey(0)

#在视频中打印中文
cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret,frame = cap.read()
    frame  = cv2AddChineseText(frame,'视频中打印中文',(100,100),(255, 0 , 0), 30)
    cv2.imshow('real_time',frame)
    k = cv2.waitKey(1)
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

 

用了一张胡歌的照片做了一个简单测试:

紧接着是在视频上打印中文的测试:将自己的摄像头简单的对准自己屏幕做了一个截图。


                                                                                       总结

视频中打印中文,使用frame=cv2ImgAddText(frame,)来调用函数,不要使用的img=cv2ImgAddText(frame,)来调用函数,因为视频传入的是一帧一帧的图像。我之前就这样调用,结果一直失败,对opencv的学习还需努力,现在做个笔记加深一下印象!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章