Opencv,imag=cv2.cvtColor(imag,cv2.COLOR_BGR2GRAY) 报错:!_src.empty() in function ‘cv::cvtColor解决方案汇总

本文探讨了在使用OpenCV将BGR图像转换为灰度图像时可能出现的报错,分析了代码一运行就报错和训练过程中延迟报错两种情况的原因,提供了详细的解决方案,包括检查数据路径、文件格式和图像损坏等问题。
摘要由CSDN通过智能技术生成

一.报错解释

这一报错产生于调用OpenCV库将BGR图像转灰度图像时,而对于这个报错具体理解来说就是在调用cvtColor函数时,该函数读取到的imag信息为空。

二.解决方案汇总

读取到的图像信息为空,产生的原因有很多方面,我具体将其分为两类,请根据具体你的实际报错情况选择解决方案。

1如果代码一运行到该函数就报错

这种情况表明你所要读入的数据全体都有问题,这种情况也是站内有关答案数最多的。

此时,请先检查你的数据读取路径

1)看在你的数据路径下有没有中文字符,中文路径会导致cvtColor函数无法读取该路径下的图像。

2)检查你的图像是否放在了该路径下,可以简单写一下如下这种程序,检验你路径下的图片数量是不是等于你想要读入模型的数量

import os

def count_images_in_path(path):
    # 检查路径是否存在
    if not os.path.exists(path):
        print(f"Error: Path '{path}' does not exist.")
        return

    # 初始化计数器
    image_count = 0

    # 遍历指定路径下的文件
    for file_name in os.listdir(path):
        # 检查文件是否为图片文件(这里假设只考虑常见的图片格式,如jpg、png等)
        if file_name.lower().endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp')):
            image_count += 1

    print(f"Number of images in path '{path}': {image_count}")

# 指定要统计图片数量的路径
path_to_count = "your path"
count_images_in_path(path_to_count)

2.在进行诸如深度学习模型训练时,代码运行一小段时间才出现此报错

这种情况是本博客主要想分享的,也是我在实际训练中遇到,被狠狠折磨的一种情况。需要理解的是,既然代码已经可以跑起来一段时间的训练,说明无论是图像读取路径还是库的兼容性都一定是没问题的。

如果运行一段时间才报错,且每次报错的图片都不一样,在深度学习训练中,甚至产生该报错的batch数都不一样。此时有很大可能是因为,你的图像数据中有几张图像因为损坏等各种原因,cvtColor函数无法对这几张图片进行读取。

此时的解决方案是,在代码中将有问题的图片名称打印出来,并在数据集中对这些问题图片进行剔除,我是在对图像重建模型训练时出现这一问题的,可以在源代码中加入打印产生报错的图像名称的代码块,示例如下:

img_rainy = cv2.imread(self.imglist[index][0])
img_gt = cv2.imread(self.imglist[index][1])

#####此处为插入的代码块,目的是打印产生报错的图像名称
if img_rainy is None or img_gt is None:
    if img_rainy is None:
        print(f"Error: Image at index {index} is empty: {self.imglist[index][0]}")
    if img_gt is None:
        print(f"Error: Image at index {index} is empty: {self.imglist[index][1]}")
    return None
#####################################################

img_rainy = cv2.cvtColor(img_rainy, cv2.COLOR_BGR2RGB)
img_gt = cv2.cvtColor(img_gt, cv2.COLOR_BGR2RGB)

如果你的报错信息中已经包含了产生报错的图像名称,可以直接在数据集中对该图像进行剔除,不用引入上一步骤,这里还请仔细分析你的报错信息。

如果你的代码可以完成训练完一个epoch而不再产生报错,说明全部有问题的图像已经被剔除了,此时,就可以放心去进行长时间训练了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值