ปรับขนาดและบันทึกรูปภาพ (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
แน่ใจว่ามันถูกต้อง และถ้าฉันทำงานโดยไม่มีคำสั่ง มันก็จะทำงานได้ดี   -  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