Ошибка UnicodeDecodeError при циклическом просмотре всех изображений в папке с помощью CV2

#python #opencv #computer-vision

#питон #opencv #компьютерное зрение

Вопрос:

Мой код:

 folder_angry = 'C:/Users/User/Desktop/test' all_vald_img = []   for filename_valid in os.listdir(folder_angry):  img_valid = cv2.imread(os.path.join(folder_angry,filename_valid))  if img_valid is not None:  all_vald_img.append(img_valid)   true_image = image.load_img(img_valid)  img = image.load_img(img_valid, color_mode="grayscale", target_size=(48, 48))  

Сообщение об ошибке:

 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 1: invalid start byte  

Я столкнулся с этой ошибкой, просматривая всю папку с изображениями, используя cv2.imread. Я пробовал такие решения, как

 with open(path, 'rb') as f:  contents = f.read()  

или любые другие решения начинаются с with open того, что предлагали многие люди, но ни одно из них на самом деле не работает. Однако, если я использую картинку одну за другой без цикла, например

 filename_valid = "path" true_image = image.load_img(filename_valid) img = image.load_img(filename_valid, color_mode="grayscale", target_size=(48, 48))  

это работает, но я должен делать это один за другим.

Есть ли какой-нибудь хороший способ справиться с этим?

Ответ №1:

Вы получаете ошибку , потому что вы передаете само изображение (в виде массива NumPy) image.load_img , в то время image.load_img как ожидаете имя файла изображения в качестве аргумента.

В основном вы пытаетесь прочитать каждое изображение дважды:

  • Использование OpenCV:
    cv2.imread возвращает изображение (в виде массива NumPy) в случае успешного чтения и возвращается None при сбое чтения.
  • Использование Подушки:
    image.load_img(file_name) загружает изображение с помощью подушки и возвращает объект типа PIL.Image.Image .

Проблема в том, что image.load_img в качестве аргумента ожидается имя файла, и вы передаете ему изображение (массив NumPy) вместо имени файла.
Массив NumPy не является допустимой строкой utf-8, поэтому вы получаете сообщение об ошибке:

Ошибка UnicodeDecodeError: кодек ‘utf-8’ не может декодировать байт 0xfd в позиции 1: недопустимый начальный байт.


Предполагая, что чтение каждого изображения дважды не является проблемой…
Вы можете использовать что-то вроде следующего примера кода:

 import os import cv2 from keras.preprocessing import image   folder_angry = 'C:/Users/User/Desktop/test' all_vald_img = [] all_vald_img_files = []   for filename_valid in os.listdir(folder_angry):  image_file_name = os.path.join(folder_angry,filename_valid)  img0 = cv2.imread(image_file_name) # Return the image as NumPy array in case of valid reading, and None if not valid.  if img0 is not None:  all_vald_img_files.append(image_file_name) # Append file name to the list (not the image).   true_image = image.load_img(image_file_name) # Use file name as argument to image.load_img  img = image.load_img(image_file_name, color_mode="grayscale", target_size=(48, 48))  all_vald_img.append(img)  # Showing images in all_vald_img for testing: for img in all_vald_img:  img.show()  

Примечание: Я предполагал, что вы хотите сохранить только загруженные изображения image.load_img .