OpenCV 处理中文路径、绘制中文文字的烦恼,这里通通帮你解决!
在 OpenCV 中,由于编码的缘故,对于中文的处理并不是很友好,比如中文路径的图片读取和写入以及在图片上绘制中文文字等,这几个问题都是笔者经常遇到的,本文列出这几个问题的解决办法,希望能够帮助到大家。
读取中文路径的图片
首先是中文路径的读取
一般我们使用 cv2.imread
进行图片的读取,但是一遇到中文,就会出现错误,如下:
import cv2
image = cv2.imread("F:莫山山.jpg")
print(image)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
解决的方法如下:我们借助 np.fromfile
和 cv2.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:WindowsFonts" 下查找
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()
- 安装python虚拟环境
- 各种排序算法的分析及java&python实现
- python3elk相关---根据Elasticsearch(es)日志处理,生成excel并定时邮箱发送附件
- python数据科学-数据预处理
- python3 邮箱相关邮箱的服务
- 谈一谈Python中str()和repr()的区别
- TensorFlow从0到1 - 15 - 重新思考神经网络初始化
- python2.7搬运--->TensorFlow - 深度学习破解验证码
- 来学习几个简单的Hive函数啦
- 推荐系统实战-基于用户的协同过滤
- 素数的筛法
- 听说GAN很高大上,其实就这么简单
- python3 解码base64遇到的问题与解决
- TensorFlow从0到1 - 16 - L2正则化对抗“过拟合”
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 0808-7.1.1-如何在CDP7.1.1指定Hive SQL的资源池队列
- iOS多线程之GCD、OperationQueue 对比和实践记录
- singleR的7个数据库文件下载失败的解决方案
- Spring Boot 如何快速集成 Redis 哨兵?
- 一行命令实现成“吨”测试数据的转码
- Jenkins参数化构建与触发
- 数据无法模拟,自动化受阻怎么办?
- Quickprop介绍:一个加速梯度下降的学习方法
- PandaSQL:一个让你能够通过SQL语句进行pandas的操作的python包
- 每个数据科学家都应该知道的20个NumPy操作
- 机器学习特性缩放的介绍,什么时候为什么使用
- 聊聊claudb的set command
- 聊聊claudb的zset command
- 聊聊claudb的pubsub command
- 聊聊claudb的transaction command