我有以下代码但它失败了,因为它无法从磁盘读取文件。图片始终为None
。
# -*- coding: utf-8 -*-
import cv2
import numpy
bgrImage = cv2.imread(u'D:\\ö\\handschuh.jpg')
注意:我的文件已经保存为带有BOM的UTF-8。我用Notepad ++验证了。
在Process Monitor中,我看到Python正在从错误的路径访问该文件:
我读过:
open()
功能有关,与OpenCV无关。答案 0 :(得分:20)
可以通过
完成open()
打开文件,该链接答案支持Unicode,# -*- coding: utf-8 -*-
import cv2
import numpy
stream = open(u'D:\\ö\\handschuh.jpg', "rb")
bytes = bytearray(stream.read())
numpyarray = numpy.asarray(bytes, dtype=numpy.uint8)
bgrImage = cv2.imdecode(numpyarray, cv2.IMREAD_UNCHANGED)
答案 1 :(得分:2)
受托马斯·韦勒答案的启发,您还可以使用np.fromfile()
读取图像并将其转换为ndarray,然后使用cv2.imdecode()
将该数组解码为三维numpy ndarray(假设这是没有alpha通道的彩色图像):
import numpy as np
# img is in BGR format if the underlying image is a color image
img = cv2.imdecode(np.fromfile('测试目录/test.jpg', dtype=np.uint8), cv2.IMREAD_UNCHANGED)
np.fromfile()
会将磁盘上的映像转换为numpy一维ndarray表示形式。 cv2.imdecode
可以解码此格式并转换为普通的3D图像表示形式。 cv2.IMREAD_UNCHANGED
是用于解码的标志。完整的标志列表可以在here中找到。
PS。有关如何将图像写入具有Unicode字符的路径的信息,请参见here。
答案 2 :(得分:1)
我将它们复制到一个临时目录。对我来说效果很好。
import os
import shutil
import tempfile
import cv2
def cv_read(path):
"""
:param path: path of a single image or a directory which contains images
:return: a single image or a list of images
"""
with tempfile.TemporaryDirectory() as tmp_dir:
if os.path.isdir(path):
shutil.copytree(path, tmp_dir, dirs_exist_ok=True)
elif os.path.isfile(path):
shutil.copy(path, tmp_dir)
else:
raise FileNotFoundError
img_arr = [
cv2.imread(os.path.join(tmp_dir, img))
for img in os.listdir(tmp_dir)
]
return img_arr if len(img_arr) > 1 else img_arr[0]
答案 3 :(得分:0)
我的问题与您相似,但是,我的程序将在
image = cv2.imread(filename)
声明。
我通过首先将文件名编码为utf-8,然后将其解码为
解决了此问题 image = cv2.imread(filename.encode('utf-8', 'surrogateescape').decode('utf-8', 'surrogateescape'))
答案 4 :(得分:-3)
bgrImage = cv2.imread(filename.encode('utf-8'))
将文件的完整路径编码为utf-8