OpenCV Python无法使用imread()打开图像

11

我不太确定为什么会出现这种情况,因为我正在制作一个程序,但是在尝试使用imread打开图像时遇到了很多问题。我一直收到错误提示,称图像宽度和高度都为0像素。这让我感到困惑,所以我在这里搜索了很多内容,并没有从SO上得到任何答案。

我拍了约20张照片,它们都使用同一设备。其中大约有8张可以正确打开和工作,其余的则不行。它们也不是损坏的,因为它们在其他程序中可以打开。我已经三次检查了路径,它们都是完整的路径。

还有其他人遇到类似的问题吗?我的所有文件都是.jpg格式,我自己也没有发现任何问题。这是一个bug还是我做错了什么?

这里是我正在使用并出现错误的代码片段:

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'

当我尝试从上面的代码片段中展示一个窗口时,我遇到了这个错误。

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”命令验证图像是否未损坏。奇怪。 - johntellsall
1
在使用imshow()之前,始终检查img == None。如果imgNone,则文件存在问题 - 可能已损坏,甚至可能不存在。 - furas
1
或者文本中的 \ 具有特殊含义,例如 \t\n。可能存在问题。 - furas
8个回答

16

也许你在文本中遇到了特殊含义的 \,例如 \t\n

可以使用 \\ 替代 \

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

或者使用前缀r''(它将把其视为没有特殊代码的原始文本)。
imgloc = r"F:\Kyle\Desktop\Coinjar\Test images\ten.png"

编辑:

一些模块接受像Linux路径中那样的/

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

1
天啊,这个可行。那到底是做什么的?你不知道这对我有多大帮助。我真的已经遇到这个问题好几周了。 - Kyle772
除了 F:/Kyle/Desktop/Coinjar/Test images/ten.png 这个模块之外的一些模块(类似于 Linux 路径)。 - furas

5
面对相同的问题,在Windows上:cv.imread在读取子文件夹中的jpg文件时返回None。但是在Linux上,相同的代码和文件夹结构可以正常工作。
发现了这样一个事实:cv.imread会处理与python文件在同一个文件夹下的相同的jpg文件。
我的解决方法:
  • 将图像文件复制到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)
...

5

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

此外,当它失败时,通常会悄无声息地失败,因此很难意识到它失败了,通常是代码后面的一些东西引发错误。

希望这有所帮助。


2

我曾经遇到了很多问题,cv.imread() 找不到我的图像。我尝试了所有与更改路径有关的方法。使用 os.path.exists(file_path) 函数也返回了 True。

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

img = imageio.imread('file_path')

这还将图像加载到numpy数组中,您可以在此对象上使用cv.matchTemplate()等函数。但如果您正在处理多个图像,则建议使用imageio读取所有图像,因为我发现两个库(opencv,imageio)在打开文件时.imread()产生的数组存在差异。

希望能对某人有所帮助。


1

请注意:

  • 使用可靠的图片尝试imread()函数,
  • 并在上下文中使用正确的路径(参见Kyle772的回答)。对于我来说,可以使用//或者\

我花费了几个小时尝试从浏览器左键另存为2张图片。但只要我使用自己相机拍摄的图片,程序就能正常运行。

Spyder截图

    #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)


1

我知道这个问题已经有答案了,但是如果仍然无法使用imread加载图像的话,可能是因为路径字符串中有imread不接受的字母。
例如umlauts和变音符号。


0

我对于所有遇到同样问题的人的建议是尝试这个:

cv2.imshow("image", img)

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


-1

当您遇到此类错误时 AttributeError: 'NoneType' object has no attribute 'shape'

请尝试使用 new_image=image.copy


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接