cv2.imread不读取jpg文件

时间:2016-04-25 17:39:48

标签: python opencv

我正在使用Python中的工具箱,我使用cv2.imread函数来加载图像。

当我使用.png文件时,没关系,但当我想从同一文件夹中读取NoneType文件时,它会返回.jpg

  1. 为什么会这样?我该如何解决?
  2. 如何从子文件夹中读取图像?
  3. 由于

    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)
    

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

    enter image description here

      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
    

1 个答案:

答案 0 :(得分:4)

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阵列中。