2016-04-25 3 views
1

Я работаю над панелью инструментов в Python, где я использую функцию cv2.imread для загрузки изображений.cv2.imread не читает файлы jpg

Пока я работаю с .png файлами, это нормально, но он возвращает NoneType, когда я хочу прочитать файл .jpg из той же папки.

  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) 

Две картины находятся в моей домашней папке:

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

Возможно, проверьте вывод 'print cv2.getBuildInformation()' и посмотрите, была ли библиотека построена с поддержкой JPEG. –

+0

, пожалуйста, проверьте 'os.access ('pic1.jpg', os.R_OK)' и сообщите нам возвращаемое значение – wim

+0

Есть ли вероятность того, что 'pic1.png' существует в нескольких каталогах, так что открытие PNG будет успешным, даже если это глядя в неправильном месте? –

ответ

2

Что-то выключен в вашем билде cv2. Восстановите его из источника или получите из диспетчера пакетов.

В качестве временного решения, загрузите файлы в формате JPEG с Matplotlib вместо:

>>> 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.imread и plt.imread должны возвращать одинаковые результаты для файлов в формате JPEG. Они оба загружаются в 3-канальные массивы uint8 numpy.

+0

@win Без исключения! Может быть, у моей сборки cv2 есть ошибка, не знаю !!! ?? – Ali

+0

@win Позвольте мне перестроить cv2. Спасибо за внимание :-) – Ali

Смежные вопросы