软硬件环境
ubuntu 18.04 64bit
anaconda with python 3.6
OpenCV 3.1.0
Pillow 3.4.2
问题
opencv
中的 cv2.putText
方法可以将字符显示出来,不过遗憾的是,显示中文时会出现乱码。putText
方法只支持 ascii
中的一个很小的子集,而不是 unicode
或者是 utf
字符。找了找源码,可以看出一点端倪 /home/xugaoxiang/anaconda3/pkgs/opencv3-3.1.0-py36_0/include/opencv2/core.hpp
,其它环境路径会有差异,可以通过文件名来查找。默认情况下,opencv
使用的是 hershey
这种字体,而且不支持自定义字体。
//!OnlyasubsetofHersheyfonts//!<http://sources.isc.org/utils/misc/hershey-font.txt>aresupportedenumHersheyFonts{FONT_HERSHEY_SIMPLEX=0,//!<normalsizesans-seriffontFONT_HERSHEY_PLAIN=1,//!<smallsizesans-seriffontFONT_HERSHEY_DUPLEX=2,//!<normalsizesans-seriffont(morecomplexthanFONT_HERSHEY_SIMPLEX)FONT_HERSHEY_COMPLEX=3,//!<normalsizeseriffontFONT_HERSHEY_TRIPLEX=4,//!<normalsizeseriffont(morecomplexthanFONT_HERSHEY_COMPLEX)FONT_HERSHEY_COMPLEX_SMALL=5,//!<smallerversionofFONT_HERSHEY_COMPLEXFONT_HERSHEY_SCRIPT_SIMPLEX=6,//!<hand-writingstylefontFONT_HERSHEY_SCRIPT_COMPLEX=7,//!<morecomplexvariantofFONT_HERSHEY_SCRIPT_SIMPLEXFONT_ITALIC=16//!<flagforitalicfont};
代码实践
既然官方不支持,我们就找其它的方法,图片处理的话,第一感觉就是能不能用 Pillow
这个库,果然经过一番的查找资料(详细的请见参考资料),把乱码的问题给解决了
#!/usr/bin/envpython#-*-coding:utf-8-*-#@Date:2018-08-1514:05:21#@Author:xugaoxiang(xugx.ai@gmail.com)#@Link:link#@Version:1.0.0#-*-coding:utf-8-*-importcv2importnumpyfromPILimportImage,ImageDraw,ImageFontif__name__=='__main__':#opencv读取本地图片文件,数据类型是numpy.ndarrayimg_OpenCV=cv2.imread('dj.jpeg')#将opencv图像格式转换成PIL格式,数据类型是PIL.Image.Imageimg_PIL=Image.fromarray(cv2.cvtColor(img_OpenCV,cv2.COLOR_BGR2RGB))#字体,默认的路径/usr/share/fonts/opentype/noto/NotoSansCJK-Black.ttc,我把它拷贝过来了font=ImageFont.truetype('NotoSansCJK-Black.ttc',26)#字体颜色fillColor=(0,0,255)#文字输出位置position=(50,50)#输出内容str='\t\t\t\t\t\t\t\t\t\t\t\t我的独立博客:\nhttps://xugaoxiang.com'draw=ImageDraw.Draw(img_PIL)draw.text(position,str,font=font,fill=fillColor)#转换回OpenCV格式img_OpenCV=cv2.cvtColor(numpy.asarray(img_PIL),cv2.COLOR_RGB2BGR)#在窗口中显示cv2.imshow("image",img_OpenCV)whileTrue:key=cv2.waitKey(1)&0xFFifkey==ord('q'):breakcv2.destroyAllWindows()
执行效果如下:
参考资料
http://pillow.readthedocs.io/en/2.8.1/reference/ImageFont.html