300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > bufferedreader读取中文乱码_Python OpenCV与中文相关的三个常见问题

bufferedreader读取中文乱码_Python OpenCV与中文相关的三个常见问题

时间:2021-03-23 16:34:44

相关推荐

bufferedreader读取中文乱码_Python OpenCV与中文相关的三个常见问题

使用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,大家可以自行尝试。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。