调整图像大小时出错:“错误:(-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'”的主要内容,如果未能解决你的问题,请参考以下文章