成功解决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位浮点数。如果我们的图像数据不是这两种类型,我们就需要将其转换过来。同时,我们还需要注意图像数据的范围是否合适。如果不合适,我们需要对其进行归一化或截断操作。
🌳参考文档🌳
🌳结尾🌳
亲爱的读者,首先感谢您抽出宝贵的时间来阅读我们的博客。我们真诚地欢迎您留下评论和意见💬。
俗话说,当局者迷,旁观者清。您的客观视角对于我们发现博文的不足、提升内容质量起着不可替代的作用。
如果博文给您带来了些许帮助,那么,希望您能为我们点个免费的赞👍👍/收藏👇👇,您的支持和鼓励👏👏是我们持续创作✍️✍️的动力。
我们会持续努力创作✍️✍️,并不断优化博文质量👨💻👨💻,只为给您带来更佳的阅读体验。
如果您有任何疑问或建议,请随时在评论区留言,我们将竭诚为你解答~
愿我们共同成长🌱🌳,共享智慧的果实🍎🍏!
万分感谢🙏🙏您的点赞👍👍、收藏⭐🌟、评论💬🗯️、关注❤️💚~