一.起因
首先opencv的puttext函数是不支持中文显示的,如果有中文显示会显示????
,但是有的时候我们就是想要显示汉字啊,咋办?OpenCV提供了cv2.freetype()的方法帮助解决问题,但是不要高兴太早,如果我们直接通过终端直接安装,会发现显示cv2' has no attribute 'freetype'
也就是说明没有freetype
模块,可是如果我们看opencv的官方介绍,可以知道opencv-contrib是有freetype模块的,这是为什么?
pip install opencv-python
或者pip install opencv-contrib-python(官方拓展库,有一些其他拓展)
二.原因
运行下列代码:
import cv2
print(cv2.getBuildInformation())
终端的显示结果如下:
可以发现模块freetype
在unavailable中,说明这个模块不在预编译之中,所以我们不可以使用。首先我们可以通过预编译的过程解决,但是笔者是个小白,预编译过程设计Cmake等操作所以我也不会解释这种方法,感兴趣的可以去找找博客(因为你知道是没有预编译的原因就好找多了)
三.代替方法
路是死的,人是活的,别在一棵树上吊死。我们可以通过别的函数库解决,可能回绕一点弯,但是并不难。
import cv2
import numpy as np
from PIL import Image,ImageDraw,ImageFont
#创建空白图像
img=np.zeros((100,300,3),dtype=np.uint8)
#使用PIL绘制中文
img_pil=Image.fromarray(img)#fro-array:转换数组的格式,返回一个pil图像对象
draw=ImageDraw.Draw(img_pil)#在纸上画的对象
font=ImageFont.truetype('msyh.ttc',40)#字体选择,字号
draw.text((15,20),'你好中文',font=font,fill=(255,255,255))#fill表示文本颜色
#转换opencv
img=np.array(img_pil)
cv2.namedWindow('chinese',0)
cv2.imshow('chinese',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行的结果:
实战在图片上配中文:
import cv2
import numpy as np
from PIL import Image,ImageDraw,ImageFont
#导入图片
img=cv2.imread('OpenCV-Python-Tutorial-master\LENA.webp')
img_pil=Image.fromarray(img)
img_draw=ImageDraw.Draw(img_pil)
font=ImageFont.truetype('msyh.ttc',40)
img_draw.text((0,0),text='莉娜',fill=(255,255,255),font=font)
#展示图片
img=np.array(img_pil)
cv2.imshow('lena',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
四.总结
学什么东西都要知道学什么,不要因为一个库函数不可以用就转去学习cmake等然后逐渐忘记自己最初要学什么(笔者就是这样,为了这个小函数找了三个小时的原因,真的是方脑壳了,呜呜呜)别再一棵树上吊死,愿你我共勉。