cv2.imread 无法读取 jpg 文件。

8

我正在使用Python制作一个工具箱,在其中使用cv2.imread函数来加载图像。

当我使用.png文件时,它没有问题,但当我尝试从同一文件夹读取.jpg文件时,它返回NoneType

  1. 为什么会发生这种情况?该如何修复?
  2. 如何从子文件夹读取图像?

谢谢

import sys
import numpy as np
import os
sys.path.append("/usr/local/lib1/python2.7/site-packages")
import cv2
im1=cv2.imread('pic1.png')
print im1.shape
#output: (512, 512, 3)
im2=cv2.imread('pic1.jpg')
print im2.shape
#output:
-------------------------------------------------------------------------
AttributeError                         Traceback (most recent call last)
<ipython-input-8-2d36ac00eca0> in <module>()
----> 1 print im2.shape
AttributeError: 'NoneType' object has no attribute 'shape'


print cv2.getBuildInformation()

Media I/O: 
ZLib:                        /lib64/libz.so (ver 1.2.8)
JPEG:                        /lib64/libjpeg.so (ver 80)
WEBP:                        /lib64/libwebp.so (ver encoder: 0x0202)
PNG:                         /lib64/libpng.so (ver 1.6.17)
TIFF:                        /lib64/libtiff.so (ver 42 - 4.0.2)
JPEG 2000:                   /lib64/libjasper.so (ver 1.900.1)

我的主文件夹中有两张图片:

在这里输入图片描述

  from os import getcwd, listdir, path
  current_dir = getcwd()
  files = [f for f in listdir('.') if path.isfile(f)]
  print(('Current directory: {c_dir}\n\n'
         'Items in the current directory:\n   {files}').format(
         c_dir=current_dir, 
         files=str.join('\n   ', files)))
  #Output:
  Items in the current directory:
  .node_repl_history
  mysh.sh~
  test.sh
  blender_tofile.sh
  **pic1.jpg**
  rapid.sh
  matlab_crash_dump.8294-1
  .gtk-bookmarks
  any2any
  beethoven.ply
  Face.blend
  Untitled1.ipynb
  sphere1.pbrt
  multirow.log
  .Xauthority
  .gtkrc-2.0-kde4
  Theory and Practice.pdf
  simple_example.gpx~
  pbrt.sh
  blender.sh~
  Untitled4.ipynb
  java.log.3414
  kinect_test.py
  matlab_crash_dump.7226-1
 .bashrc~~
 .ICEauthority
 infoslipsviewer.desktop
 GTW_Global_Numbers.pdf
 index.htm
 Untitled2.ipynb
 **pic1.png**



 os.access('pic1.jpg', os.R_OK)
 #output:
 True

2
也许可以检查 print cv2.getBuildInformation() 的输出,看看该库是否支持 JPEG。 - Dan Mašek
请检查 os.access('pic1.jpg', os.R_OK) 并告诉我们返回值。 - wim
1
@PouriaHadjibagheri йӮЈж ·еҒҡжҳҜиЎҢдёҚйҖҡзҡ„гҖӮcv2.imread дёҚзҗҶи§Ј ~ еҝ«жҚ·ж–№ејҸгҖӮйңҖиҰҒдҪҝз”Ё os.path.expanduserгҖӮ - wim
是的,它也在主目录中。 - Ali Sharifi B.
请参考此页面获取可能的解决方案。 - Ali Sharifi B.
显示剩余4条评论
1个回答

13

您的cv2构建存在问题。请从源代码重新构建,或通过软件包管理器获取它。

作为解决方法,请改用matplotlib加载jpeg文件:

>>> import cv2
>>> import matplotlib.pyplot as plt
>>> a1 = cv2.imread('pic1.jpg')
>>> a1.shape
(286, 176, 3)
>>> a2 = plt.imread('pic1.jpg')
>>> a2.shape
(286, 176, 3)

请注意,OpenCV和Matplotlib默认情况下以不同的方式读取颜色通道(一个是RGB,一个是BGR)。因此,如果您需要依赖颜色,请最好交换第一和第三个通道,如下所示:

>>> a2 = a2[..., ::-1]  # RGB --> BGR
>>> (a2 == a1).all()
True

除此之外,cv2.imreadplt.imread 对于jpeg文件应该返回相同的结果。它们都加载到3通道uint8 numpy数组中。


@win 让我重新构建cv2。谢谢关注 :-) - Ali Sharifi B.
可能只是文件路径问题。在使用 cv2.imread(file_path) 时,请确保路径正确。我遇到了同样的问题,并使用完整符号更改了我的文件路径。 - Willy satrio nugroho

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