cv2.imread does not read jpg files

I am working on a toolbox in Python where I use cv2.imread function to load images.

While I am working with .png files it is OK, but it returns NoneType when I want to read a .jpg file from the same folder.

  1. Why does this happen? and how can I fix it?
  2. How can I read images from a subfolder?

Thanks

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)

Two pictures are in my home folder:

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

Something is off in your build of cv2. Rebuild it from source, or get it from the package manager.

As a workaround, load jpeg files with matplotlib instead:

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

Note that opencv and matplotlib read the colour channels differently by default (one is RGB and one is BGR). So if you rely on the colours at all, you had better swap the first and third channels, like this:

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

Other than that, cv2.imread and plt.imread should return the same results for jpeg files. They both load into 3-channel uint8 numpy arrays.