专栏首页机器视觉CVOpenCV 处理中文路径、绘制中文文字的烦恼,这里通通帮你解决!

OpenCV 处理中文路径、绘制中文文字的烦恼,这里通通帮你解决!

在 OpenCV 中,由于编码的缘故,对于中文的处理并不是很友好,比如中文路径的图片读取和写入以及在图片上绘制中文文字等,这几个问题都是笔者经常遇到的,本文列出这几个问题的解决办法,希望能够帮助到大家。

读取中文路径的图片

首先是中文路径的读取

一般我们使用 cv2.imread 进行图片的读取,但是一遇到中文,就会出现错误,如下:

import cv2
image = cv2.imread("F:\莫山山.jpg")
print(image)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

解决的方法如下:我们借助 np.fromfilecv2.imdecode 来实现中文路径的读取

import cv2
import numpy as np
image = cv2.imdecode(np.fromfile(file="F:\莫山山.jpg", dtype=np.uint8), cv2.IMREAD_COLOR)
# print(image)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中 np.fromfile 代表的含义是从文本或者二进制文件构造 array,参数:file 是文件名,参数 dtype 是数据类型,因为是图像,所以我们使用 np.uint8 格式其中 np.fromfile 有个 shape 属性,其值是文件的字节数

cv2.imdecode 的含义是从内存中的指定缓冲区读取图像,参数:buf 就是数据缓存了,即上面 np.fromfile 得到的内容,参数:flag 见下图,即读取什么样的图片 (彩色、灰度等)

参考:https://vovkos.github.io/doxyrest-showcase/opencv/sphinx_rtd_theme/enum_cv_ImreadModes.html

保存中文路径的图片

既然有读取,那就有写入中文路径图片的需求 通常我们使用的是 cv2.imwrite 保存图片,但是遇见中文路径时,就会出现编码错误或者保存失败(我在不同的电脑上进行过测试,如果保存成功了,得到的文件名会是乱码)。

import cv2
import numpy as np
path = "F:/莫山山.jpg"
image = cv2.imdecode(np.fromfile(file=path, dtype=np.uint8), cv2.IMREAD_COLOR)
cv2.imwrite("F:/莫山山2.jpg", image)

解决方法如下:上面我们读取用的是 imdecode 那么写入自然是 imencode

import cv2
import numpy as np
path = r"F:\莫山山.jpg"
image = cv2.imdecode(np.fromfile(file=path, dtype=np.uint8), cv2.IMREAD_COLOR)
dst = r"F:/莫山山2.jpg"
cv2.imencode(ext='.jpg', img=image)[1].tofile(dst)

cv2.imencode 中的参数:ext 是图片的扩展名,参数:img 就是 array 矩阵了。单独运行 cv2.imencode('.jpg', image) 得到的是一个元组(2 部分,第二部分才是 array),所以上面程序中有一个取 [1] 的操作

在图像中绘制中文文字

OpenCV 处理中另外一个中文会出现问题是在图上绘制中文文字,要想在图片上绘制文字,我们一般使用的是 cv2.putText() 函数,一个示例如下:

import cv2
import numpy as np
path = r"F:\莫山山.jpg"
image = cv2.imdecode(np.fromfile(file=path, dtype=np.uint8), cv2.IMREAD_COLOR)
dst = r"F:/莫山山2.jpg"

font = cv2.FONT_HERSHEY_SIMPLEX  # 指定字体
cv2.putText(image, 'Person', (60, 60), font, 2, (20, 20, 255), 2, cv2.LINE_AA)  # 绘制的图像,文字,文字左下角的坐标,字体,字体颜色,厚度等
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制英文文字一般没什么问题

但是一到绘制中文文字时,小朋友你是否会有很多问号?????

OpenCV 内置的函数不能帮助我们解决这个问题,我们需要借助另外一个库 PIL(pillow) 不过实现起来会稍微有点麻烦。

import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
path = r"F:\莫山山.jpg"
image = cv2.imdecode(np.fromfile(file=path, dtype=np.uint8), cv2.IMREAD_COLOR)
font = ImageFont.truetype('STZHONGS.TTF', 40)  # 字体设置,Windows系统可以在 "C:\Windows\Fonts" 下查找
img_PIL = Image.fromarray(image[..., ::-1])  # 转成 PIL 格式
draw = ImageDraw.Draw(img_PIL)  # 创建绘制对象
draw.text(xy=(60, 60), text="莫山山", font=font, fill=(255, 0, 0))
image = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)  # 再转成 OpenCV 的格式,记住 OpenCV 中通道排布是 BGR
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

本文分享自微信公众号 - 机器视觉CV(AIandCV),作者:Leong

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenCV 系列教程5 | OpenCV 图像处理(中)

    霍夫变换是一种特征提取技术,主要应用于检测图像中的直线或者圆。 OpenCV 中分为霍夫线变换和霍夫圆变换。

    机器视觉CV
  • OpenCV 系列教程2 - Core 组件

    若是单通道的像素,像素有 256(0-255)个值,若是三通道,则颜色数就更多(一千六百多万种),如此多的颜色进行处理,会对算法的性能造成影响。这些颜色中,有代...

    机器视觉CV
  • OpenCV 系列教程1 | OpenCV 的 GUI 特性

    Matplotlib是一个用于Python的绘图库,它提供了多种绘图方法。在这里,将学习如何使用 Matplotlib 显示图像。可以使用 Matplotlib...

    机器视觉CV
  • python3+opencv3人脸识别入

    https://blog.csdn.net/qq_30310799/article/details/80829930 本文章有circle函数的介绍

    py3study
  • pytorch读取一张图像进行分类预测需要注意的问题(opencv、PIL)

    使用opencv读取图像之后是BGR格式的,使用PIL读取图像之后是RGB格式的。

    绝命生
  • 计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测

    背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤。如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算...

    用户1332428
  • OpenCV 读写视频

    下面是完整的代码,里面额外添加了一些边缘检测,求帧差,镜像,添加文字等功能。(上传的动图像素差是腾讯的锅,压缩得太厉害)

    用户6021899
  • opencv: 形态学 转换(图示+源码)

    OpenCV中的形态学转换操作有七种:腐蚀,膨胀,开运算,闭运算,形态学梯度,礼帽,黑帽。

    JNingWei
  • OCR -- seamlessClone泊松融合

    opencv:https://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/

    MachineLP
  • 执行Spark运行在yarn上的命令报错 spark-shell --master yarn-client

    别先生

扫码关注云+社区

领取腾讯云代金券