OpenCV Python не открывает изображения с помощью imread()

Я не совсем уверен, почему это происходит, но я нахожусь в процессе создания программы, и у меня возникают тонны проблем, пытающихся заставить opencv открывать изображения с помощью imread. Я продолжаю получать сообщения о том, что изображение имеет ширину 0px и высоту 0px. Это не имеет особого смысла для меня, поэтому я искал здесь, и я также не получаю никаких ответов от SO.

Я сделал около 20 снимков, и все они используют одно устройство. Вероятно, 8 из них действительно открываются и работают правильно, остальные нет. Они также не повреждены, потому что они открываются в других программах. Я трижды проверил пути, и они используют полные пути.

У кого-нибудь еще есть такие проблемы? Все мои файлы являются.jpgs, и я не вижу никаких проблем с моей стороны. Это ошибка или я что-то не так делаю?

Вот фрагмент кода, который я использую, который воспроизводит ошибку на моем конце.

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

9 ответов

Решение

Возможно, у вас есть проблемы с особым значением \ в тексте - как \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"

По моему опыту, слишком длинные пути к файлам (зависят от ОС) также могут вызывать cv2.imread() терпеть неудачу.

Кроме того, когда он действительно терпит неудачу, он часто выходит из строя тихо, поэтому трудно даже понять, что он потерпел неудачу, и обычно что-то еще в коде будет тем, что вызывает ошибку.

Надеюсь это поможет.

Столкнулся с той же проблемой в Windows: вернулся Noneпри чтении файлов jpg из подпапки. Тот же код и структура папок работали в Linux.

Выяснилось, что обрабатывает одни и те же файлы jpg, если они находятся в той же папке, что и файл python.

Мое обходное решение:

  • скопируйте файл изображения в папку с файлами 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)
...

У меня было много проблем с cv.imread()не находит свое изображение. Думаю, я пробовал все, что связано с изменением пути. В os.path.exists(file_path) функция также вернула мне Истину.

Я наконец решил проблему, загрузив изображения с помощью imageio.

      img = imageio.imread('file_path')

Это также загружает img в массив numpy, и вы можете использовать такие функции, как cv.matchTemplate()на этом объекте. Но я бы порекомендовал, если вы делаете что-то с несколькими изображениями, которые затем читаете все с помощью imageio, потому что я обнаружил различия в массивах, созданных .imread() из двух библиотек (opencv, imageio) в файле, оба они могут открываться.

Я надеюсь, что смогу кому-то помочь

Позаботьтесь о том, чтобы:

  • пытаться imread() с достоверной картинкой,
  • и правильный путь в вашем контексте, как (см. Kyle772 ответ). Для меня либо //или же \,

Я потерял пару часов, пытаясь сохранить 2 изображения из левого клика в браузере. Как только я снял персональное изображение с камеры, все работает нормально.

Снимок экрана Spyder

    #context  windows10 / anaconda / python 3.2.0
    import cv2
    print(cv2.__version__) # 3.2.0
    imgloc = "D:/violettes/Software/Central/test.jpg" #this path works fine.  
    # imgloc = "D:\\violettes\\Software\\Central\\test.jpg"   this path works fine also. 
    #imgloc = "D:\violettes\Software\Central\test.jpg" #this path fails.

    img = cv2.imread(imgloc)
    height, width, channels = img.shape
    print (height, width, channels)

python opencv загрузка изображений imread

Я знаю, что на этот вопрос уже дан ответ, но в случае, если кто-то все еще не может загрузить изображения с помощью imread. Это может быть связано с тем, что в строке пути есть буквы, которые imread не принимает.
Примеры умляутов и диакритических знаков:
... / äöü / image.jpg
... / tèst / image.jpg

Я предлагаю всем, кто сталкивается с одной и той же проблемой, попробовать следующее:

cv2.imshow("image", img)

В imgключевое слово. Никогда не забуду.

Для, cv2.imread(img_url) не используйте обратную косую черту для выхода из пробела (в img_url).

Когда вы получаете ошибку, подобную этой AttributeError: у объекта 'NoneType' нет атрибута 'shape'

Попробуйте с new_image=image.copy

Другие вопросы по тегам