读文件      

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)

参考链接:OpenCV中读取中文路径、窗口命名中文、图片加中文乱码问题汇总-CSDN博客

07-21 13:31