Как читать изображение с пути с символами Unicode?

У меня есть следующий код, и он не работает, потому что он не может прочитать файл с диска. Изображение всегда None.

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

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

Примечание: мой файл уже сохранен как UTF-8 с спецификацией. Я проверен с Notepad++.

В Process Monitor я вижу, что Python обращается к файлу по неправильному пути:

Process Monitor

Я читал о:

Ответ 1

Это можно сделать с помощью

  • открытие файла с помощью 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)

Ответ 2

Вдохновленный ответом Томаса Веллера, вы также можете использовать np.fromfile(), чтобы прочитать изображение и преобразовать его в ndarray, а затем использовать cv2.imdecode() для декодирования массива в трехмерный нудистый ndarray (предположим, это цветное изображение без альфа-канала):

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() преобразует изображение на диске в одноуровневое 1-мерное представление. cv2.imdecode может декодировать этот формат и преобразовывать его в обычное трехмерное представление изображения. cv2.IMREAD_UNCHANGED является флагом для декодирования. Полный список флагов можно найти здесь.

PS. Как записать изображение в путь с помощью символов Юникода, см. здесь.

Ответ 3

bgrImage = cv2.imread(filename.encode('utf-8'))

закодировать полный путь файла к utf-8