Масштабирование и сохранение изображений (AttributeError: объект «NoneType» не имеет атрибута «форма»)

Я пытаюсь масштабировать и сохранить тысячу изображений в каталог.

Мне удалось изменить размер изображений. Однако при сохранении возникают ошибки.

Код ниже. Помогите мне, пожалуйста.

import cv2
import numpy as np
import os

def scaling_shirink(addr):
    img = cv2.imread(addr)
    height, width = img.shape[:2]
    shrink = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
    cv2.imshow('Shrink', shrink)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

count = 0
IMAGE_DIR_BASE = 'C:/ClassShared\Data/CM_ML_IMG_181011/CASE_01/FPS_10_PNG'
image_file_list = os.listdir(IMAGE_DIR_BASE)
for file_name in image_file_list:
    image = scaling_shirink(IMAGE_DIR_BASE + '/' + file_name)
    cv2.imwrite('C:/ClassShared\Data/CM_ML_IMG_181011/CASE_01/34_sdetect_db1/' + '_' + "%04d" % (count) + '.png', image)
    count = count + 1

Сообщения об ошибках следующие.

Traceback (most recent call last):
  File "C:/PycharmProjects/TS_S/Scailing.py", line 19, in <module>
    image = scaling_shirink(IMAGE_DIR_BASE + '/' + file_name)
  File "C:/PycharmProjects/TS_S/Scailing.py", line 8, in scaling_shirink
    height, width = img.shape[:2]
AttributeError: 'NoneType' object has no attribute 'shape'

Я не понимаю, почему он говорит AttributeError: объект «NoneType» не имеет атрибута «форма»


person makatyu    schedule 15.10.2018    source источник
comment
cv2.imread(addr) вернулся None. Вы уверены, что addr правильно? Есть ли в этом каталоге файлы, не являющиеся изображениями?   -  person John Gordon    schedule 15.10.2018
comment
уверен, что это правильно, и если я запускаю без оператора for, то он работает хорошо.   -  person makatyu    schedule 15.10.2018
comment
Приведенный выше код немного неверен, и функция scaling_shirink возвращает значение shirink.   -  person makatyu    schedule 15.10.2018
comment
Если не так, то поправьте. Мы не сможем помочь, если вы не покажете нам настоящий код.   -  person John Gordon    schedule 15.10.2018
comment
Я решил эту проблему, ха-ха, это было просто! спасибо за ответ Джону :)   -  person makatyu    schedule 15.10.2018


Ответы (1)


ИЗМЕНИТЬ:

Проверьте правильность пути к изображению и действительно ли это изображение с форматами, принятыми Opencv. Потому что, если ваш путь неверен, img = cv2.imread(addr) вернет None, а height, width = img.shape[:2] выдаст ошибку

Кроме того, ваша функция scaling_shirink() возвращает None. Чтобы исправить это, просто измените его на функцию ниже:

def scaling_shirink(addr):
    img = cv2.imread(addr)
    height, width = img.shape[:2]
    shrink = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
    cv2.imshow('Shrink', shrink)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    #this return was missing
    return shrink 

Это должно сработать!

person Guilherme Uzeda    schedule 15.10.2018
comment
Это не проблема, вызывающая ошибку (хотя это еще одна проблема для OP); img.shape выдает ошибку еще до того, как произойдет оператор return, потому что функция imread() возвращает None. - person alkasm; 16.10.2018
comment
@AlexanderReynolds ты прав! Хотя отсутствие возврата в функции тоже проблема. Спасибо за чаевые - person Guilherme Uzeda; 16.10.2018