如何从具有Unicode字符的路径中读取图像?

时间:2017-04-03 13:13:06

标签: python opencv unicode

我有以下代码但它失败了,因为它无法从磁盘读取文件。图片始终为None

# -*- coding: utf-8 -*-
import cv2
import numpy

bgrImage = cv2.imread(u'D:\\ö\\handschuh.jpg')

注意:我的文件已经保存为带有BOM的UTF-8。我用Notepad ++验证了。

在Process Monitor中,我看到Python正在从错误的路径访问该文件:

Process Monitor

我读过:

5 个答案:

答案 0 :(得分:20)

可以通过

完成
  • 使用open()打开文件,该链接答案支持Unicode,
  • 将内容作为字节数组读取,
  • 将字节数组转换为NumPy数组,
  • 解码图片
# -*- 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