AttributeError возникает при попытке прочитать изображение из текстового файла

Я пытаюсь прочитать изображения из текстового файла. Текстовый файл содержит пути к этим изображениям. Изображения находятся в разных каталогах, я проверил, что они там есть.

PATH_IN = 'D:\\user\\data\\Augmentation'
path_out = 'D:\\user\\data\\Augmentation\\images_90t'

try:
    if not os.path.exists('images_90t'):
        os.makedirs('images_90t')
except OSError:
    print ('Error: Creating directory of data')

with open('filelist.txt', 'r') as f:

    for image_path in f.readlines():
        image = cv2.imread(image_path, 1)
        print("The type of image is: " , type(image)) # OUTPUT: The type of image is:  <class 'NoneType'>
        (h, w) = image.shape[:2]
        center = (w / 2, h / 2)
        M = cv2.getRotationMatrix2D(center, 90, 1.0)
        rotated = cv2.warpAffine(image, M, (w, h))
        #cv2.imshow("rotated", rotated)
        cv2.imwrite(path_out, rotated)
        cv2.waitKey(0) 

Я искал ответы в 1 и 2, но решения не нашлось. В большинстве случаев люди предлагают изменить \ на \\ или что-то подобное, потому что пути к изображениям могут быть неправильными. Я думаю, что перепробовал все комбинации, но решения так и не нашел. Ошибка возникает в строке (h, w) = image.shape[:2], говоря

AttributeError: 'NoneType' object has no attribute 'shape'

Я полагаю, что путь к cv2.imread() не может открыть его как изображение и дает объект Nonetype. Вот несколько примеров из моего текстового файла:

D:\user\data\16_partitions_annotated\partition1\images\073-1\073-1_00311.jpg
D:\user\data\ImageNet_Utils-master\images\n03343560_url\2077528821_231f057b3f.jpg
D:\user\data\lighter\images\webcam-fire3\scene00211.jpg
D:\user\data\smoke\11\images\scene07341.jpeg
D:\user\data\smoke\11\images\scene07351.jpeg 

У меня Windows 7, 64.

Кто-нибудь может помочь? Спасибо.


person bit_scientist    schedule 02.04.2018    source источник


Ответы (1)


Когда вы используете строки чтения, вы получаете символы перевода строки/новой строки. Если вы сделаете

print(repr(image_path))

Вы увидите символы новой строки (\n) в выводе. Используйте strip() для удаления пробелов (пробелов, табуляции, новой строки, возврата каретки) в начале и в конце строк. Итак, ваш код становится:

import os
import cv2

PATH_IN = 'D:\\user\\data\\Augmentation'
path_out = 'D:\\user\\data\\Augmentation\\images_90t'

try:
    if not os.path.exists('images_90t'):
        os.makedirs('images_90t')
except OSError:
    print ('Error: Creating directory of data')

with open('filelist.txt', 'r') as f:

    for image_path in f.readlines():
        print(repr(image_path)) # will show the newlines \n in image_path
        image_path = image_path.strip()
        image = cv2.imread(image_path)
        print("The type of image is: " , type(image)) # OUTPUT: The type of image is:  <class 'NoneType'>
        (h, w) = image.shape[:2]
        center = (w / 2, h / 2)
        M = cv2.getRotationMatrix2D(center, 90, 1.0)
        rotated = cv2.warpAffine(image, M, (w, h))
        #cv2.imshow("rotated", rotated)
        path_out = os.path.join(path_out, os.path.basename(image_path))
        cv2.imwrite(path_out, rotated)
        cv2.waitKey(0) 

Я также исправил ваше задание path_out, чтобы поместить все выходные файлы в нужное место.

person bfris    schedule 27.04.2018
comment
вы правы, я решил это несколько дней назад, но забыл обновить. Проблема была в том, что пробелы. - person bit_scientist; 28.04.2018