Python opencv 库cv.imread()读取图片为空None,cv.imshow()报错:error: (-215:Assertion failed) _src.empty() in ..

报错原因:

         cv.imread()读取图片为空None,原因很大可能是路径有问题,要么是在路径下找不到图片,要么就是路径中包含有中文(特别要注意是不是路径含有中文);图片读取为空从而导致了在显示图片时cv.imshow()会报错:error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'。

解决办法:

        1.一个最简单的解决办法就是把路径中的中文全部改成英文就可以了。

2.如果不愿修改路径中的中文,可以加入中文编码来读取图片,具体使用方法参照下面代码:

# 导入相关库
import cv2 as cv
import numpy as np

# 图片路径
img_path = r"C:\Users\Desktop\图片\天空.jpg"
# 读取图片
img = cv.imdecode(np.fromfile(img_path, dtype=np.uint8), 1)
print(img)    # 打印图片对象
# 显示图片
cv.imshow("image", img)
cv.waitKey(0)    # 按任意键退出图片显示

        至此,你的问题应该解决了。如果想学习或交流更多python相关技术,可以点击博主头像。

### OpenCV 中 `imshow` 函数断言失败的原因分析 在使用 OpenCV 的 `imshow` 函数显示图像时,如果遇到断言失败错误(Assertion failed),通常是因为输入的图像数据存在问题。具体来说,当错误码为 `-215` 时,表示条件 `(size.width>0 && size.height>0)` 不成立[^1]。 #### 原因解析 1. **图像未成功加载** 如果通过 `imread` 加载图像失败,则返回的对象为矩阵(empty matrix)。此时调用 `imshow` 将触发断言失败。可以通过检查矩阵是否为来验证这一点。 2. **图像尺寸异常** 当图像的高度或宽度小于等于零时,也会引发此问题。这种情况可能发生在图像处理过程中,例如裁剪操作超出了原始范围或者转换格式导致的数据丢失[^2]。 3. **数据类型不匹配** 使用某些自定义函数修改图像时,可能会改变其数据类型。例如,在引用中的噪声添加函数中,图像被转换为了浮点数类型 (`float32`) 并重新截取回整型 (`uint8`)。这种类型的强制转换如果没有正确处理边界值,也可能引起显示问题。 #### 解决方法 以下是几种常见的解决方案: 1. **确认图像已成功加载** 在读取文件之后立即检查图像对象的状态: ```python image = cv2.imread('image_path') if image is None: raise ValueError("无法加载图像,请检查路径和文件名") ``` 2. **调整窗口大小适应大图** 对于非常大的图片,可以直接缩放至适合屏幕的比例后再展示: ```python scale_percent = 60 # 缩小比例 width = int(image.shape[1] * scale_percent / 100) height = int(image.shape[0] * scale_percent / 100) dim = (width, height) resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA) cv2.imshow('Resized Image', resized_image) ``` 3. **确保图像维度有效** 显示前打印出图像的基本属性以排查潜在隐患: ```python print(f"Width: {image.shape[1]}, Height: {image.shape[0]}") assert image.shape[1] > 0 and image.shape[0] > 0, "图像尺寸无效" ``` 4. **修正数据类型冲突** 若涉及复杂运算需注意最终输出仍保持标准视觉化所需格式(`uint8`),并合理运用 NumPy 方法如 clip 防范越界风险: ```python processed_img = np.clip(processed_img, 0, 255).astype(np.uint8) ``` 综上所述,针对上述提到的各种可能性逐一排查即可定位根本原因并妥善修复该类错误。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值