Чтение / загрузка изображений с символами Юникода в пути к изображениям (китайский, японский, корейский) с Python OpenCV - PullRequest
2 голосов
/ 20 января 2020

У меня есть каталог изображений, каждое изображение имеет китайский символ в названии. Я пытаюсь перечислить все изображения, l oop в списке, прочитать и отобразить каждое изображение.

Изображения Путь это что-то вроде https://github.com/sirius-ai/LPRNet_Pytorch/tree/master/data/test

Используя glob в python3 .6.9 , имена изображений выглядят так:

enter image description here

Причинение Segmentation Fault, когда я прочитайте их cv2.imread

Как мне решить эту проблему?.

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Один из способов - использовать np.fromfile() для преобразования изображения в 1-D ndarray, затем использовать cv2.imdecode() для преобразования его в обычную 3-D форму BGR формат изображения. В зависимости от формата изображения (если оно имеет прозрачность), вы можете изменить флаг декодирования. Посмотрите здесь для полного списка флагов.

import cv2
import numpy as np
import glob

for path in glob.glob("images/*.jpg"):
    # Image is in BGR format
    image = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
    cv2.imshow('image', image)
    cv2.waitKey(1000)

enter image description here

Примечание: Кажется, что работает с любым файлом изображения Unicode (китайский, японский, корейский, русский, и др c.)

0 голосов
/ 20 января 2020

Это не проблема opencv, скорее она получает правильное строковое представление имени вашего файла. Мы могли бы вникнуть в то, как все это работает, но такая проблема должна быть исправлена ​​в python3, поэтому сначала: вы уверены , используете ли вы python3, а не python2? Я буду следить, если вы уверены.

Comparison

Продолжение: Итак, если вы выполните эти две команды, вы также получите ошибку сегмента?

wget https://raw.githubusercontent.com/sirius-ai/LPRNet_Pytorch/master/data/test/%E4%BA%ACPL3N67.jpg

python3 -c 'import cv2; import glob; print(cv2.imread(glob.glob("*")[0]).shape)'

Вы должны напечатать (800,800,3) на экране.

Если нет, то что дает python3 -c 'import subprocess; subprocess.call(["ls"])'? Это могут быть только что загруженные файлы, которые сохраняются с «именами байтов».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...