赞
踩
opencv直接读写路径包含中文的文件会出错。这是因为 cv2.imread
内部处理文件路径时,默认使用的是 C++ 标准库中的字符串处理函数,这些函数对于非 ASCII 字符可能处理不当,导致无法正确读取文件。
1、使用 numpy.fromfile
读取文件内容,可以绕过文件路径的编码问题。numpy.fromfile
方法直接从文件系统中读取原始的字节流,并将其存储在一个 numpy
数组中。这样就避免了文件路径编码的问题。
2、使用cv2.imdecode 方法从内存中的字节流解码图像数据。将 numpy.fromfile 读取的字节流传递给 cv2.imdecode,它能够正确地解析这些字节数据并生成图像矩阵。
- import cv2
- import numpy as np
-
- # 文件路径包含中文字符
- file_path = '路径包含中文字符的图像文件.jpg'
-
- # 使用 numpy 从文件中读取字节流
- file_bytes = np.fromfile(file_path, dtype=np.uint8)
-
- # 使用 OpenCV 从字节流中解码图像
- img = cv2.imdecode(file_bytes, -1)
-
- # 显示图像
- cv2.imshow('image', img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
简化代码:
img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), -1)
同样的原理,逆操作,先将图像数据编码成numpy数组,再将其存为文件
- import cv2
- import numpy as np
-
- # 文件路径包含中文字符
- file_path = '路径包含中文字符的图像文件.jpg'
-
- # 使用 numpy 从文件中读取字节流
- file_bytes = np.fromfile(file_path, dtype=np.uint8)
-
- # 使用 OpenCV 从字节流中解码图像
- img = cv2.imdecode(file_bytes, -1)
-
- write_bytes = cv2.imencode('.jpg', img)[1]
- write_bytes.tofile('路径包含中文字符的图像文件2.jpg')
-
- # 显示图像
- cv2.imshow('image', img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
简化代码:
cv2.imencode('.jpg', orig_img)[1].tofile(file_path)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。