前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python OpenCV与中文相关的三个常见问题

Python OpenCV与中文相关的三个常见问题

作者头像
Color Space
发布2020-05-19 12:45:18
3.3K0
发布2020-05-19 12:45:18
举报

使用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)

完整代码:

import cv2import 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 np
def 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, ImageFont
def 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,大家可以自行尝试。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档