成功解决error: (-215:Assertion failed) src_depth != CV_16F && src_depth != CV_32S in function ‘conve

本文探讨了在使用OpenCV时遇到的错误(-215:Assertionfailed),源于图像数据类型不符合cv2.imshow的需求。解决方法是将生成的随机噪声图像从int32类型转换为uint8。通过实例和解释,阐述了处理图像数据时数据类型和范围的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

成功解决error: (-215:Assertion failed) src_depth != CV_16F && src_depth != CV_32S in function ‘conve


🌳引言🌳

在计算机视觉和图像处理领域,OpenCV是一个非常流行的库,用于处理和操作图像数据。然而,在使用OpenCV的过程中,我们有时会遇到一些错误,其中之一就是"error: (-215:Assertion failed) src_depth != CV_16F && src_depth != CV_32S in function ‘convolve’"。在本文中,我们从一个需求场景出发,探究该BUG在此需求场景的解决方案。

🌳需求场景🌳

现在欲生成一个随机噪声灰度图像,像素值是范围[0, 256)内的整数,图像形状为(512, 512),并显示图像,源码如下

```python
import numpy as np
import cv2

def generate_noise_image():
    """
    生成随机噪声图像。
    
    Returns:
        np.ndarray: 形状为[512, 512]的随机噪声图像。
    """
    img = np.random.randint(0, 256, size=[512, 512])
    cv2.imshow("noise img", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    return img

当运行上面的代码时,出现如下报错:

cv2.error: OpenCV(4.8.1)
D:/a/opencv-python/opencv-python/opencv/modules/highgui/src/precomp.hpp:155:
error: (-215:Assertion failed) src_depth != CV_16F && src_depth !=
CV_32S in function ‘convertToShow’

完整Bug截图如下所示:

这个错误说明的是输入图像的深度不应该是CV_16F或CV_32S。这两种深度表示图像数据是半浮点数(16位)或整数(32位),对于大多数的图像操作(如显示图像),我们需要的是8位无符号整数(CV_8U)或者32位浮点数(CV_32F)的图像。

错误原因分析

在代码中,我们通过np.random.randint()来生成噪声图像。np.random.randint() 是 NumPy 库中的一个函数,可用于生成随机整数。

函数的基本语法如下:

numpy.random.randint(low, high=None, size=None, dtype='l')

参数说明如下:

参数说明
low生成随机整数的下限(包含该值)
high生成随机整数的上限(不包含该值,如果未指定,则默认为100)
size生成的随机整数的形状。例如,size=5 会生成一个包含5个随机整数的数组
dtype返回数组的数据类型。例如,dtype='i' 会返回一个整数数组(32位)

np.random.randint()函数生成的numpy数组,其元素默认的数据类型是32位整数(int32),而cv2.imshow函数要求输入数组数据类型是无符号8位整数(uint8)。因此,将数组数据类型从int32更改为uint8即可

解决方案

我们只需要把代码中的img,通过 np.array()重新封装一下,并指定元素的数据类型为np.uint8即可:

import numpy as np
import cv2

def generate_noise_image():
    """
    生成随机噪声图像。
    
    Returns:
        np.ndarray: 形状为[512, 512]的随机噪声图像。
    """
    img = np.random.randint(0, 256, size=[512, 512])
    
	img = np.array(img, dtype=np.uint8) # revise
	
    cv2.imshow("noise img", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    return img

运行结果:

程序运行成功,报错解决~

🌳总结🌳

在处理图像数据时,我们需要特别注意数据类型和范围的问题。在OpenCV中,大部分的函数都要求输入的图像数据是8位无符号整数或32位浮点数。如果我们的图像数据不是这两种类型,我们就需要将其转换过来。同时,我们还需要注意图像数据的范围是否合适。如果不合适,我们需要对其进行归一化或截断操作。

🌳参考文档🌳

OpenCV Python 教程


🌳结尾🌳

亲爱的读者,首先感谢抽出宝贵的时间来阅读我们的博客。我们真诚地欢迎您留下评论和意见💬
俗话说,当局者迷,旁观者清。的客观视角对于我们发现博文的不足、提升内容质量起着不可替代的作用。
如果博文给您带来了些许帮助,那么,希望能为我们点个免费的赞👍👍/收藏👇👇,您的支持和鼓励👏👏是我们持续创作✍️✍️的动力
我们会持续努力创作✍️✍️,并不断优化博文质量👨‍💻👨‍💻,只为给带来更佳的阅读体验。
如果有任何疑问或建议,请随时在评论区留言,我们将竭诚为你解答~
愿我们共同成长🌱🌳,共享智慧的果实🍎🍏!


万分感谢🙏🙏点赞👍👍、收藏⭐🌟、评论💬🗯️、关注❤️💚~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高斯小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值