【问题标题】:error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:4045: error: (-215:Assertion failed)错误:OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:4045: error: (-215:Assertion failed)
【发布时间】:2020-05-06 08:29:34
【问题描述】:

我有一个灰度图像列表。我用这段代码读了它们:

import glob
import cv2


folders = glob.glob(r'path\to\images\*')
imagenames_list = []
for folder in folders:
    for f in glob.glob(folder+'/*.png'):
        imagenames_list.append(f)

read_images = []        

for image in imagenames_list:
    read_images.append(cv2.imread(image, cv2.IMREAD_GRAYSCALE))

现在,我正在尝试使用此功能调整 read_images 中所有图像的大小:

def resize_images(img, new_width, new_height):
    size = (new_width, new_height)
    resized_img = cv2.resize(img, size)
    return resized_img

我应用函数如下:

resized_img = [resize_images(img, new_width=128, new_height=32) for img in read_images]

而 Python 返回了这个错误:

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-21-9352534280fd> in <module>
      1 #Anwenden der Funktion auf die Liste col_image
----> 2 resized_img = [resize_images(img, new_width=128, new_height=32) for img in read_images]

<ipython-input-21-9352534280fd> in <listcomp>(.0)
      1 #Anwenden der Funktion auf die Liste col_image
----> 2 resized_img = [resize_images(img, new_width=128, new_height=32) for img in read_images]

<ipython-input-20-e4d9e7d9b2fa> in resize_images(img, new_width, new_height)
      2 def resize_images(img, new_width, new_height):
      3     size = (new_width, new_height)
----> 4     resized_img = cv2.resize(img, size)
      5     return resized_img

error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:4045: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'

有人可以帮忙吗? 您需要什么进一步的信息?我已经将此功能应用于数量较少的图像列表(大约 650 个图像)并且它有效。现在,这个列表包含超过 180k 的图像。此外,图像的大小不同,但其他 650 张图像的大小也不同。

【问题讨论】:

  • 您可以运行循环并将print(size) 添加到您的resize_images 函数中吗?它打印什么?
  • 感谢您的回答!我将代码更改为import cv2 def resize_images(img, new_width, new_height): size = (new_width, new_height) resized_img = cv2.resize(img, size) print(size) return resized_img。现在,它会打印 (128, 32) 多次,直到它在某个点停止并且我再次遇到相同的错误。
  • 我明白了。它断裂的图像是什么样的?尝试同时打印图像shapeprint(img.shape).
  • 好的,我也让函数打印img.shape。现在我得到AttributeError: 'NoneType' object has no attribute 'shape'。似乎任何地方都有一个 NoneType 对象。我如何确定它在哪里?
  • 好的,这就是我认为正在发生的事情。当您从文件中加载图像时,其中一些可能不是图像。当您在这些文件上运行 cv2.imread(image, cv2.IMREAD_GRAYSCALE) 时,它会返回 None。我建议你print(f) 看看是否一切正常。

标签: python list image opencv error-handling


【解决方案1】:

试试这个以找出哪里出错了。希望它会告诉您哪个文件导致循环崩溃。

import glob
import cv2
from cv2 import error


def resize_images(img_, new_width, new_height):
    size = (new_width, new_height)
    resized_img_ = cv2.resize(img_, size)
    return resized_img_


folders = glob.glob(r'path\to\images\*')
img_names_list = []
read_imgs = []
resized_imgs = []
for folder in folders:
    for file in (glob.glob(folder+'/*.png')):
        img_names_list.append(file)
        img = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
        read_imgs.append(img)
        try:
            resized_img = resize_images(img, new_width=128, new_height=32)
            resized_imgs.append(resized_img)
            # print(file, img, resized_img)
        except error as err:
            print(f'{file} returns {img}. Resize does not work')
            print(err)

【讨论】:

  • 太好了!效果很好!你会直接删除这张图片吗?正如错误代码所建议的那样,没有关于文件路径的图像......
  • 所以你是说它返回一个不存在的图像的文件路径?或者只是以某种方式损坏的图像?在第二种情况下,是否要保留它真的取决于您。如果是,您应该看看是否可以以某种方式将其替换为非损坏版本。但是我不能告诉你如何处理你的文件。
  • 好的,完美!它返回损坏的图像的文件路径。所以,我认为最好的方法是删除这个文件。你帮了我很多!谢谢! :)
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2018-05-15
  • 2022-07-18
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多