opencv - 错误:OpenCV(4.1.2)/io/opencv/modules/imgproc/src/resize.cpp:3720:错误:(-215:断言失败)!ssize.empty()在函数'resize'识别中
问题描述
我正在制作一个图像识别应用程序,我在图像缩小操作(调整大小)中出错,我在谷歌 colab 上工作,这是我的代码
train_dir = '/content/drive/My Drive/training_set/training_set'
test_dir = '/content/drive/My Drive/test_set/test_set'
train_cats = os.path.join(train_dir, 'cats')
train_dogs = os.path.join(train_dir, 'dogs')
test_cats_dir = os.path.join(test_dir, 'cats')
test_dogs_dir = os.path.join(test_dir, 'dogs')
train_cats = os.listdir(train_cats)
train_dogs = os.listdir(train_dogs)
test_cats = os.listdir(test_cats_dir)
test_dogs = os.listdir(test_dogs_dir)
训练游戏中的元素示例
train_cats[1:10]
['cat.3910.jpg',
'cat.3330.jpg',
'cat.3288.jpg',
'cat.582.jpg',
'cat.3498.jpg',
'cat.3744.jpg',
'cat.355.jpg',
'cat.3604.jpg',
'cat.3807.jpg']
测试游戏中的元素示例
test_cats[1:10]
['cat.4001.jpg',
'cat.4008.jpg',
'cat.4003.jpg',
'cat.4021.jpg',
'cat.4013.jpg',
'cat.4019.jpg',
'cat.4018.jpg',
'cat.4009.jpg',
'cat.4022.jpg']
训练游戏的修改
size=4000
train_imgs = train_dogs[0:size] + train_cats[0:size]
random.shuffle(train_imgs)
print(train_imgs)
train_imgs[1:8]
['dog.1302.jpg',
'cat.1396.jpg',
'cat.3158.jpg',
'cat.2907.jpg',
'cat.1769.jpg',
'dog.568.jpg',
'dog.1743.jpg']
img_size = 150
#### On définit une fonction qui prend en entrée une liste d'image
def read_and_process_image(list_of_images):
"""
La fonctionne renvoie trois tableaux (array):
X est le tableau des images redimentionné (resize)
y est le ableau des cible (label)
l_id est un tableau qui contient les nom (chien, chat) pour la soumission du script kaggle
"""
X = [] # On initialise une liste qui comprendras les images
y = [] # On initialise une liste qui comprendras les abels
l_id = [] # On initialise une liste qui comprendras les id (dog, cat)
#### Pour chaque élement de la liste d'image
for image in list_of_images:
### On ajoute dans la liste X les images redimensionnés
X.append(cv2.resize(cv2.imread(image, cv2.IMREAD_COLOR), (img_size,img_size), interpolation=cv2.INTER_CUBIC)) #Lecture et redimensionnement de l'image
basename = os.path.basename(image)# On stocke le chemin de chaque image dans la variable basename
img_num = basename.split('.')[0] # On extrait le nom de l'animal ie 'dog' ou 'cat'
l_id.append(img_num) ### On ajoute ce nom dans la liste l_id
### On crée un vecteur de cible y pour les modalités "dog" et "cat"
if 'cat' in image: ### Si la chaine de caractère "dog" est contenu dans la liste "image" alors on ajoute un 1 à la liste y
y.append(1)
#### Sinon 0
else:
y.append(0)
return X, y, l_id #### On retourne trois élements, les images redimentionnés, le vecteur cible et l_id
#### On crée trois nouvelles variables qui correspondent aux images redimentionnégges, à la cible et a la liste de modalité kaggle
X, y, l_id = read_and_process_image(train_imgs)`
这是我得到的错误
20
21
---> 22 X.append(cv2.resize(cv2.imread(image, cv2.IMREAD_COLOR), (img_size,img_size), interpolation=cv2.INTER_CUBIC)) #Lecture et redimensionnement de l'image
23 basename = os.path.basename(image)# On stocke le chemin de chaque image dans la variable basename
24 img_num = basename.split('.')[0] # On extrait le nom de l'animal ie 'dog' ou 'cat'
error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/resize.cpp:3720: error: (-215:Assertion failed) !ssize.empty() in function 'resize'
op
解决方案
这里最有可能发生的是您正在引用一个不存在的图像,所以返回的cv2.imread
是None
. 您需要更正受影响文件的路径,或者图像本身已损坏从而返回None
. 您可以简单地检查图像以查看它是否None
在加载后。如果是None
,请跳过图像并继续。另请注意,有时如果图像损坏,它可能会返回大小为 0 的 NumPy 数组,因此请检查None
并检查它是否是大小为 0 的 NumPy 数组:
#### Pour chaque élement de la liste d'image
for image in list_of_images:
### On ajoute dans la liste X les images redimensionnés
# Vérifiez si l'image fonctionne
# Nouveau logique
im = cv2.imread(image, cv2.IMREAD_COLOR)
if type(im) is np.ndarray:
if im.size == 0:
continue
if im is None:
continue
X.append(cv2.resize(im, (img_size,img_size), interpolation=cv2.INTER_CUBIC)) #Lecture et redimensionnement de l'image
....
也许更严格的检查是查看文件是否确实存在:
import os
...
...
#### Pour chaque élement de la liste d'image
for image in list_of_images:
### On ajoute dans la liste X les images redimensionnés
# Vérifiez si l'image fonctionne
# Nouveau logique
if not os.path.isfile(image):
continue
im = cv2.imread(image, cv2.IMREAD_COLOR)
X.append(cv2.resize(im, (img_size,img_size), interpolation=cv2.INTER_CUBIC)) #Lecture et redimensionnement de l'image
....
推荐阅读
- ruby-on-rails - 如何仅使用基本 STI 类加载 STI 记录?
- javascript - 创建 javascript 对象时,“对象”对象是否只创建一次并被所有内容的 __proto__ 引用?
- r - 宽数据格式作为 Shiny mapview 应用程序的输入 - 需要反应式包装器吗?
- ruby - 系列的第 n 项的总和
- php - 从多维数组项构建唯一的字符串列表
- linux - Matlab 二进制文件在 shell 中不接受其输入值
- python - Python中的条件嵌套循环
- asp.net-core-mvc - 我可以访问其他中间件中的 AuthenticateResult.Fail 异常参数吗?
- java - libGDX : Scrollpane 是 Scrollpane 的子级,并在滚动时在它们之间切换
- scala - foldLeft 迭代的条件终止