调整图像大小时出错:“错误:(-215:Assertion failed) func != 0 in function 'resize'”

Posted

技术标签:

【中文标题】调整图像大小时出错:“错误:(-215:Assertion failed) func != 0 in function \'resize\'”【英文标题】:Error while resizing image: "error: (-215:Assertion failed) func != 0 in function 'resize'"调整图像大小时出错:“错误:(-215:Assertion failed) func != 0 in function 'resize'” 【发布时间】:2019-08-21 01:45:46 【问题描述】:

我正在尝试通过将图像重新缩放为 (10, 10) 来预处理图像数据集,该数据集以 numpy 数组表示,形状为 (28, 28) 的图像。我为此写了一个函数:

def resize_dataset(images):
    resized_images = []
    for img in images:
            img = img.reshape((28,28))
            resized_img = cv2.resize(img, dsize=(10, 10))
            resized_images.append(resized_img)
    return numpy.array(resized_images)

但当我真正尝试重新调整它们时,cv2.resize 中出现以下错误:

error: OpenCV(4.0.0) /io/opencv/modules/imgproc/src/resize.cpp:3662: error: (-215:Assertion failed) func != 0 in function 'resize'

在谷歌中,我只发现在 c++ 上写同样错误的人在做非常不同的事情,比如这个:resize an image and changing its depth 和这个:http://answers.opencv.org/question/19715/error-215-func-0-in-function-convertto/

我该如何解决?

【问题讨论】:

【参考方案1】:

哦,我真的想通了。数据集中的图像类型为numpy.int64。我只需要将图像转换为float32,如下所示:

def resize_dataset(images):
    resized_images = []
    for img in images:
            img = img.reshape((28,28)).astype('float32')  # <-- convert image to float32
            resized_img = cv2.resize(img, dsize=(10, 10))
            resized_images.append(resized_img)
    return numpy.array(resized_images)

现在它运行良好。看起来cv2.resize 无法处理以 int 表示的图像。希望这对任何人都有帮助

【讨论】:

有谁知道为什么它不适用于int64?我还发现它不适用于int32,但它确实适用于uint8 如果错误信息能解释这一点就好了:\ 感谢您分享解决方案!我也被这个问题困住了。这是我第一次发现 opencv 函数只接收浮点数据,但为什么呢?而且我没有在文档中看到这一点。【参考方案2】:

实际上cv2.resize可以处理以整数表示的图像,但您需要使用默认的插值方法。

这里列出了您可以使用的不同插值标志:cv2 resize interpolation flags。

默认情况下,cv2 使用 INTER_LINEAR 方法,顾名思义,该方法是线性的。因此,大多数情况下,它会为您提供必须表示为浮点数的值。与 INTER_CUBIC、INTER_AREA、INTER_LANCZOS4 相同...

但是有些方法可以应用于整数,例如 INTER_NEAREST(最近邻)或 INTER_LINEAR_EXACT(与 INTER_LINEAR 相同,但四舍五入到最接近的整数)。

在上述情况下,我会建议尝试:

resized_img = cv2.resize(img, (10,10), interpolation=cv2.INTER_LINEAR_EXACT)

【讨论】:

INTER_LINEAR_EXACT 仍然给我同样的错误 int32 图像(OpenCV(4.5.4-dev),C++)。 INTER_NEAREST 工作。【参考方案3】:

首先,让我们检查图像的范围是否在 [0 1] 之间。我收到一个错误,因为我的 RGB 范围在 255。

【讨论】:

【参考方案4】:

对此我没有任何解释。解决方案是让您的输入图像采用uint8 格式或float32

使用numpy,就变成了……

my_image = np.array(my_image, dtype='uint8')

【讨论】:

以上是关于调整图像大小时出错:“错误:(-215:Assertion failed) func != 0 in function 'resize'”的主要内容,如果未能解决你的问题,请参考以下文章

在 Nativescript App 中调整从 URL 接收到的图像大小时出错

二进制图像大小调整出错

如何在Java中裁剪调整大小的图像?

使用 python 生成裁剪图像时出错

调整对象矢量大小时出错

在 Swift 中调整 UICollectionViewCell 大小时出错