【问题标题】:How to make cv2.imread() not empty?如何使 cv2.imread() 不为空?
【发布时间】:2019-01-07 16:29:13
【问题描述】:

我遇到问题的代码部分如下。

if __name__ == '__main__':
    for n, image_file in enumerate(os.scandir(image_folder)):
        img = image_file
        fig, ax = plt.subplots(1)
#       mngr = plt.get_current_fig_manager()
#       mngr.window.setGeometry(250, 120, 1280, 1024)
        image = cv2.imread(image_file.path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

我收到以下错误

 image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    cv2.error: OpenCV(3.4.4) C:\projects\opencv-python\opencv\module\imgproc\src\color.cpp:181:error:(-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

我了解 imread() 可能为空,因为它尝试读取的图像未正确保存。我正在尝试使用保存为 000001、000002、000003 的 3 个图像来测试此代码...我对为什么保存在 C:\imagez 文件夹中的图像不起作用感到困惑。我尝试保存 3 张新图像,但仍然出现相同的错误。任何建议都会很棒!

【问题讨论】:

  • 你可以从修复你的代码开始——它似乎错过了一些',因此颜色很奇怪。您似乎还阅读了 directory - 不是文件......您可能想要在其中阅读文件.. 将其名称添加到 cv2.imread 的输入 - 并阅读其文档以修复其他错误:docs.opencv.org/3.0-beta/modules/imgcodecs/doc/…
  • @PatrickArtner 抱歉,我从错误的版本发布了我的代码,代码中的 imread 在 () 中有 (image_file.path)
  • 通常是提供的路径/字符串有问题。以这种方式测试它:创建一个新图像,使用 imwrite 将其保存到某个路径/文件名,然后再次使用 imread 加载相同的图像路径。这应该可以工作,您可以测试文件是否是在您期望的路径上创建的。

标签: python opencv cv2


【解决方案1】:

如果您阅读documentation on cv2.imread(),您会发现它可能会失败——在这种情况下,它会返回None(这就是Mat::data==NULL 在python 中的翻译):

函数 imread 从指定文件加载图像并返回。如果无法读取图像(由于缺少文件、权限不正确、格式不受支持或无效),该函数将返回一个空矩阵( Mat::data==NULL )。

如果您将None 作为输入提供给cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - 它会在检查参数(-215:Assertion failed) !_src.empty() in function 'cv::cvtColor' 并发现它是None 时引发错误:

修复:

if __name__ == '__main__':
    for n, image_file in enumerate(os.scandir(image_folder)):
        fig, ax = plt.subplots(1)
        image = cv2.imread(image_file.path)
        if image:
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        else:
            print("Unable to load image at path {}".format(image_file))

检查给您带来这些问题的路径的_exact_spelling - 这可能只是您的路径/文件名中的拼写错误。

【讨论】:

  • 谢谢帕特里克,添加 if else 语句后似乎没有出现错误。我也按照你所说的检查拼写错误,因为这发生在我身上!非常感谢您的指导!
  • ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
  • @JürgenK。 ……嗯? ...听起来好像您在使用 pandas/numpy 系列/数组做一些不正确的事情。请使用您的代码的minimal reproducible example 创建一个新问题,以便 SO 社区可以帮助您。见valueerror-the-truth-value-of-an-array-with-more-than-one-element-is-ambiguous
猜你喜欢
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2019-09-17
  • 2016-08-19
  • 2021-04-05
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
相关资源
最近更新 更多