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

12 投票
8 回答
73650 浏览
提问于 2025-04-18 12:04

我不太明白为什么会出现这种情况,但我正在制作一个程序,遇到了很多问题,尤其是在用opencv打开图片时,使用imread这个函数总是出错。每次都提示说图片的宽度和高度都是0像素。这让我很困惑,所以我在这里搜索了一下,但也没有在StackOverflow上找到答案。

我拍了大约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

8 个回答

2

我知道这个问题已经有人回答过了,但如果还有人无法用imread加载图片,可能是因为路径字符串中有imread不接受的字母。
比如说,像变音符号和重音符号这样的字符。

2

我在使用 cv.imread() 加载图片时遇到了很多麻烦,它总是找不到我的图片。我试了各种方法来更改路径。即使使用 os.path.exists(file_path) 这个函数也返回了 True,说明文件确实存在。

最后,我通过 imageio 成功解决了这个问题,加载了图片。

img = imageio.imread('file_path')

这个方法也会把图片加载到一个 numpy 数组里,你可以在这个对象上使用像 cv.matchTemplate() 这样的函数。不过,如果你要处理多张图片,我建议你都用 imageio 来读取,因为我发现用这两个库(opencv 和 imageio)读取同一个文件时,生成的数组会有差异。

希望我的经验能帮到某些人。

5

我在Windows上遇到了同样的问题:用cv.imread读取子文件夹里的jpg文件时,它返回了None。而在Linux上,使用相同的代码和文件夹结构却没有问题。

我发现,如果jpg文件和python文件在同一个文件夹里,cv.imread就能正常处理这些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()这个函数出错。

而且,当它出错的时候,通常不会有任何提示,所以你可能根本意识不到出错了,通常是代码后面的某个地方才会引发错误。

希望这对你有帮助。

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"

撰写回答