读文件
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)