我收到错误,AttributeError:' NoneType' object没有属性' shape。我在views.py
中写了代码import os
import cv2
from pathlib import Path
import random
path = Path(__file__).parent
path /= "../../image1"
path1 = Path(__file__).parent
path1 /= "../../image2"
index_list =[]
for i in path.iterdir():
i = str(i)
print(i)
if i.split(".")[-1].lower() in {"jpeg", "jpg", "png"}:
list_img = cv2.imread(i)
index_list.append(list_img)
num = 0
for j in path.iterdir():
j = str(j)
if j.split(".")[-1].lower() in {"jpeg", "jpg", "png"}:
img = cv2.imread(j)
num += 1
random_int = random.randint(0, 9)
index = index_list[random_int]
height1 = index.shape[0]
width1 = index.shape[1]
print(height1)
print(width1)
当我运行此代码时,出现错误,height1 = index.shape [0] AttributeError:' NoneType'对象没有属性'形状' 。 在image1的文件夹中,有5张图片在那里,如photo1,photo2,photo3,photo4,photo5。我推出了这个程序,所以我发现photo3导致了这个错误,我从image1&#39文件夹中删除了photo3。我再次运行这个程序,photo2导致这个错误。我真的不明白为什么会发生这个错误。我想错误的文件夹路径可能导致这个错误,但是错了。我该怎么解决这个问题?我的代码有什么问题?
答案 0 :(得分:0)
变量index
为None
,表示index_list
中的一个或多个项目为None
。这可能是因为找不到先前使用cv2.imread()
打开的图像。正如the documentation所述,“即使图片路径错误,也不会产生任何错误,但print img
会给您None
。”
这是一个错误情况,您应该测试可能发生的时间,并且当找到它时,句柄(例如,通过显示错误消息并禁止从保存它进一步处理)。不要像现在这样做,忽略错误条件并允许问题传播到以后的代码,然后您必须弄清楚index
如何成为None
。如果您已经编写了最基本的错误处理,那么您的问题是“为什么cvv.imread()
找不到我的图像文件?”而不是“为什么Python抱怨NoneType
对象?”
要检测错误,您可以使用以下内容:
list_img = cv2.imread(i)
if list_img is None:
print("Couldn't open file %s" % i)
else:
index_list.append(list_img)
这至少会告诉您是否正在尝试打开您认为的文件。我的猜测是它没有找到你的任何文件,因为你从一个不是工作目录的目录中得到一个文件列表,但是在打开文件时你没有指定那个目录名。因此,它正在寻找工作目录中的文件,而不是它们。