Как читать изображение с пути с символами 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