使用Python版的OpenCV常会遇到三个与中文相关的问题,分别是:
① cv2.imread()读取图片路径是否可以支持中文?
②cv2.imshow()显示图像是否可以支持中文窗口名称?
③ cv2.putText()图像绘制文字是否可以支持中文?
--------------------------------------------------------------------------
一、读取图片支持中文路径
使用cv2.imread()函数读取图片,默认是不支持中文路径和包含中文的图片名的,如果你使用它去读取中文路径的图片就会失败,那么如何能够让我们也能读取包含中文路径的图片呢?
① 读取图片(支持中文路径)
img=cv2.imdecode(np.fromfile(img_path,dtype=np.uint8),1)
②保存图片(支持中文路径)
cv2.imencode('.jpg',src)[1].tofile(save_path)
完整代码:
importcv2import numpy as np if __name__ == '__main__': img = cv2.imdecode(np.fromfile("E:/图片/汽车.jpg", dtype=np.uint8),1)cv2.imshow("img", img) cv2.imencode('.jpg', img)[1].tofile("E:/图片/汽车备份.jpg") cv2.waitKey(0)cv2.destroyAllWindows()
这样就可以正常读取和保存包含中文路径的图片了
二、图像显示窗口名支持中文
使用cv2.imshow()显示图像默认是不支持中文名称的窗口的,如果你的窗口名参数中包含中文将会显示为乱码。这是由于在OpenCV-Python包中,imshow函数的窗口标题是gbk编码,而Python3默认UTF-8编码。因而窗口标题包含中文时,会显示乱码。
解决这个问题,最直接就是从标题的编码入手:
string.encode("gbk").decode(errors="ignore")
执行如下代码:
# -*- coding: utf-8 -*-import cv2import numpy as npdef zh_ch(string): return string.encode("gbk").decode(errors="ignore") if __name__ == '__main__': img = cv2.imdecode(np.fromfile("E:/图片/汽车.jpg", dtype=np.uint8),1)cv2.imshow(zh_ch('图片'), img) cv2.imencode('.jpg', img)[1].tofile("E:/图片/汽车备份.jpg") cv2.waitKey(0)cv2.destroyAllWindows()
可以看到窗口名正确显示了中文,但是,上述方案只是临时的。在编码强制转换期间,会造成某些汉字缺失,显示不全。比如将上述标题由“图片”改为“绘图”,则只能显示“图”,而“绘”字丢失了。
从根本上解决这一问题,目前有两种方案:
① 改用Python 2版本,代码改为 cv.imshow(u'绘图', img),字符串前加u;
② 改用C++开发环境
显然,哪种方法都不妥当。最妥当的就是:学好英语吧,各位!不论哪种编码,英文字符吃遍天.....
三、图像绘制文字支持中文
使用cv2.putText()绘制文字默认不支持中文,我们使用PIL库来写中文,代码如下:
# -*- coding: utf-8 -*-import cv2import numpy as npfrom PIL import Image, ImageDraw, ImageFontdef cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20): if (isinstance(img, np.ndarray)): #判断是否OpenCV图片类型 img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img) fontText = ImageFont.truetype( "simhei.ttf", textSize, encoding="utf-8") draw.text((left, top), text, textColor, font=fontText) return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) if __name__ == '__main__': img = cv2.imread("1.jpg") img = cv2ImgAddText(img, "大家好,我是星爷", 140, 60, (255, 255, 0), 20) cv2.imshow("DrawChinese", img) cv2.waitKey(0)cv2.destroyAllWindows()
效果如下:
其中字体格式一般为.ttf或.ttc,字体路径默认是C:\Windows\Fonts,大家可以自行尝试。