【问题标题】:OpenCV Python not opening images with imread()OpenCV Python 不使用 imread() 打开图像
【发布时间】:2014-07-03 23:54:17
【问题描述】:

我不完全确定为什么会发生这种情况,但我正在制作一个程序,我在尝试让 opencv 使用 imread 打开图像时遇到了很多问题。我不断收到错误消息,说图像是 0px 宽 x 0px 高。这对我来说没有多大意义,所以我在这里搜索,我也没有从 SO 那里得到任何答案。

我拍摄了大约 20 张照片,它们都使用相同的设备。其中可能有 8 个实际上打开并正常工作,其余的则没有。它们也没有损坏,因为它们在其他程序中打开。我对路径进行了三次检查,它们使用的是完整路径。

还有其他人有这样的问题吗?我所有的文件都是.jpgs,我没有看到任何问题。这是一个错误还是我做错了什么?

这是我正在使用的代码的 sn-p,它在我的端重现错误。

imgloc = "F:\Kyle\Desktop\Coinjar\Test images\ten.png"
img = cv2.imread(imgloc)
cv2.imshow('img',img)

当我更改文件时,我只是调整文件本身的名称,整个路径不会改变它只是拒绝接受我的一些本质上相同的图像。

我在尝试使用 img.shape 的代码后面部分收到此错误

Traceback (most recent call last):
  File "F:\Kyle\Desktop\Coinjar\CoinJar Test2.py", line 14, in <module>
    height, width, depth = img.shape
AttributeError: 'NoneType' object has no attribute 'shape'

当我尝试从上面的代码 sn-p 显示一个窗口时,我收到了这个错误。

Traceback (most recent call last):
  File "F:\Kyle\Desktop\Coinjar\CoinJar Test2.py", line 11, in <module>
    cv2.imshow('img',img)
error: ..\..\..\..\opencv\modules\highgui\src\window.cpp:261: error: (-215) size.width>0 && size.height>0 in function cv::imshow

【问题讨论】:

  • 代码为我工作。尝试安装ImageMagick 并使用identify 命令验证映像是否损坏。很奇怪。
  • imshow() 中使用img 之前,请务必检查img == None。如果imgNone 则文件有问题 - 它可能已损坏,甚至不存在。
  • 或者文本中 ` \ ` 的特殊含义可能存在问题 - 例如\t\n

标签: python opencv image-loading


【解决方案1】:

您可能对文本中 \ 的特殊含义有疑问 - 例如 \t\n

使用\\ 代替\

imgloc = "F:\\Kyle\\Desktop\\Coinjar\\Test images\\ten.png"

或使用前缀r''(它会将其视为raw文本,没有特殊代码)

imgloc = r"F:\Kyle\Desktop\Coinjar\Test images\ten.png"

编辑:

有些模块甚至接受/,就像在 Linux 路径中一样

imgloc = "F:/Kyle/Desktop/Coinjar/Test images/ten.png"

【讨论】:

  • 真是废话。那究竟是做什么的?你不知道这对我有多大帮助。我确实已经有这个问题好几个星期了。
  • 除了F:/Kyle/Desktop/Coinjar/Test images/ten.png之外的一些模块(类似于Linux路径)
【解决方案2】:

在 Windows 上遇到同样的问题:cv.imread 从子文件夹中读取 jpg 文件时返回 None。相同的代码和文件夹结构适用于 Linux。

发现cv.imread 处理相同的 jpg 文件,如果它们与 python 文件位于同一文件夹中。

我的解决方法:

  • 将图片文件复制到python文件夹中
  • cv.imread中使用这个文件
  • 删除多余的图片文件
import os
import shutil
import cv2 as cv

image_dir = os.path.join('path', 'to', 'image')
image_filename = 'image.jpg'
full_image_path = os.path.join(image_dir, image_filename)

image = cv.imread(full_image_path)
if image is None:
    shutil.copy(full_image_path, image_filename)
    image = cv.imread(image_filename)
    os.remove(image_filename)
...

【讨论】:

    【解决方案3】:

    根据我的经验,过长的文件路径(取决于操作系统)也可能导致 cv2.imread() 失败。

    此外,当它确实失败时,它通常会默默地失败,因此甚至很难意识到它失败了,而且通常代码会引发错误。

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      注意:

      • 用可靠的图片试试imread()
      • 以及您上下文中的正确路径(请参阅 Kyle772 答案)。对我来说//\

      我浪费了几个小时尝试在浏览器中单击左键保存的 2 张图像。一旦我拍摄了个人相机图像,它就可以正常工作。

      Spyder screen shot

          #context  windows10 / anaconda / python 3.2.0
          import cv2
          print(cv2.__version__) # 3.2.0
          imgloc = "D:/violettes/Software/Central/test.jpg" #this path works fine.  
          # imgloc = "D:\\violettes\\Software\\Central\\test.jpg"   this path works fine also. 
          #imgloc = "D:\violettes\Software\Central\test.jpg" #this path fails.
      
          img = cv2.imread(imgloc)
          height, width, channels = img.shape
          print (height, width, channels)
      

      【讨论】:

        【解决方案5】:

        我对面临同样问题的每个人的建议是试试这个:

        cv2.imshow("image", img)
        

        img 是关键字。永远不要忘记。

        【讨论】:

          【解决方案6】:

          cv.imread() 找不到我的图片给我带来了很多麻烦。我想我尝试了所有涉及改变路径的事情。 os.path.exists(file_path) 函数也给了我一个 True。

          我最终通过使用imageio 加载图像解决了这个问题。

          img = imageio.imread('file_path')
          

          这也将 img 加载到一个 numpy 数组中,您可以在此对象上使用 cv.matchTemplate() 之类的功能。但是我会建议您是否使用多个图像进行处理,然后使用 imageio 读取所有图像,因为我发现 .imread() 从文件上的两个库(opencv,imageio)生成的数组中存在差异,它们都可以打开.

          我希望我能帮助别人

          【讨论】:

            【解决方案7】:

            我知道问题已经得到解答,但万一有人仍然无法加载带有 imread 的图像。可能是因为imread不接受的字符串路径中有字母。
            例如变音符号和变音符号:
            .../äöü/image.jpg
            .../tèst/image.jpg

            【讨论】:

              【解决方案8】:

              当你得到这样的错误时 AttributeError: 'NoneType' object has no attribute 'shape'

              试试 new_image=image.copy

              【讨论】:

                猜你喜欢
                • 2013-10-17
                • 2017-10-31
                • 1970-01-01
                • 2016-02-28
                • 2017-03-20
                • 1970-01-01
                • 2020-01-20
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多