OpenCV Python 无法用 imread() 打开图像
我不太明白为什么会出现这种情况,但我正在制作一个程序,遇到了很多问题,尤其是在用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 个回答
我知道这个问题已经有人回答过了,但如果还有人无法用imread加载图片,可能是因为路径字符串中有imread不接受的字母。
比如说,像变音符号和重音符号这样的字符。
我在使用 cv.imread()
加载图片时遇到了很多麻烦,它总是找不到我的图片。我试了各种方法来更改路径。即使使用 os.path.exists(file_path)
这个函数也返回了 True,说明文件确实存在。
最后,我通过 imageio
成功解决了这个问题,加载了图片。
img = imageio.imread('file_path')
这个方法也会把图片加载到一个 numpy 数组里,你可以在这个对象上使用像 cv.matchTemplate()
这样的函数。不过,如果你要处理多张图片,我建议你都用 imageio
来读取,因为我发现用这两个库(opencv 和 imageio)读取同一个文件时,生成的数组会有差异。
希望我的经验能帮到某些人。
我在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)
...
根据我的经验,文件路径如果太长(这跟操作系统有关)也可能导致cv2.imread()
这个函数出错。
而且,当它出错的时候,通常不会有任何提示,所以你可能根本意识不到出错了,通常是代码后面的某个地方才会引发错误。
希望这对你有帮助。
可能你遇到了文本中\
的特殊含义,比如\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"