#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
.