OpenCV!_Src.empty() в функции 'cvtColor' ошибка

Я пытаюсь сделать базовое преобразование цветов в Python, но я не могу обойти следующую ошибку. Я переустанавливал python, opencv и пробовал как на python 3.4.3 (последний), так и на python 2.7 (который находится на моем Mac).

Я установил opencv с помощью менеджера пакетов python opencv-python.

Вот код, который не работает:

frame = cv2.imread('frames/frame%d.tiff' % count)
frame_HSV= cv2.cvtColor(frame,cv2.COLOR_RGB2HSV)

Это сообщение об ошибке:

cv2.error: OpenCV(3.4.3) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'

23 ответа

Решение

Эта ошибка произошла из-за неправильной загрузки изображения. Итак, у вас есть проблемы с предыдущей строкой cv2.imread мое предложение:

  • проверьте, существуют ли изображения в указанном вами пути

  • проверьте переменную count, если у него есть действительный номер

Если кто-то испытывает такую ​​же проблему при чтении кадра с веб-камеры:

Просто убедитесь, что ваша веб-камера используется для другой задачи, и закройте ее. Это решит проблему.

Я провел некоторое время с этой ошибкой, когда понял, что моя камера была в сети в группе видеовстреч Google.

Я продолжал получать эту ошибку тоже:

Traceback (most recent call last):
  File "face_detector.py", line 6, in <module>
    gray_img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor

мой cv2.cvtColor(...) работал нормально с \photo.jpg но не с \news.jpg, Что касается меня, я наконец-то понял, что при работе на Windows с python эти escape-символы будут получать вас каждый раз! Таким образом, моя "плохая" фотография сбежала из-за имени файла, начинающегося с "n". Питон взял \n как escape-символ и OpenCV не может найти файл!

Решение:
Предисловие имен файлов в Windows Python с r"...\...\" как в

cv2.imread(r".\images\news.jpg")

Если путь правильный и имя изображения в порядке, но вы все равно получаете сообщение об ошибке

использование:

from skimage import io

img = io.imread(file_path)

вместо того:

cv2.imread(file_path)

Функция imread загружает изображение из указанного файла и возвращает его. Если изображение не может быть прочитано (из-за отсутствия файла, неправильных разрешений, неподдерживаемого или недопустимого формата), функция возвращает пустую матрицу ( Mat::data==NULL).

проверьте, существует ли изображение в пути, и проверьте расширение изображения (.jpg или .png)

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

  • Скорее всего, произошла ошибка при загрузке изображения, попробуйте еще раз проверить каталог.
  • Распечатайте изображение, чтобы подтвердить, действительно ли оно загружено или нет

Еще одна причина, которая может вызывать это, - это "странный" символ в именах файлов и каталогов. Все символы умлаута (äöå) и другие (éóâ и т. Д.) Должны быть удалены из имен файлов и папок. Иногда у меня возникала такая же проблема из-за этих персонажей.

Я сталкиваюсь с проблемой, когда пытаюсь загрузить изображение с пути, отличного от ASCII. Если я просто использую imread для загрузки изображения, я могу получить только None.

Вот мое решение:

      import cv2
import numpy as np
path = r'D:\map\上海地图\abc.png'
image = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)

То же самое произойдет, когда я сохраню изображение по пути, отличному от ASCII. Он не будет успешно сохранен без каких-либо предупреждений. И вот что я сделал.

      import cv2
import numpy as np
path = r'D:\map\上海地图\abc.png'
cv2.imencode('.png', image)[1].tofile(path) 

В моем случае изображение было названо неправильно. Проверьте, существует ли изображение и попробуйте

import numpy as np
import cv2

img = cv2.imread('image.png', 0)
cv2.imshow('image', img)

Я тоже был в такой же ситуации, и мой случай был из-за корейской буквы на пути...

После удаления корейских букв из названия папки все заработало.

ИЛИ поставить

[#-*- coding:utf-8 -*-]

(Кроме [ ] на краю)

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

Так что, похоже, что-то есть в пути или в букве. Люди, ответившие, говорят то же самое. Надеюсь, вы его решите!

Я проверил путь к файлу изображения, и он был правильным. Я убедился, что нет поврежденных изображений. Проблема была с моим Mac. Иногда у него есть скрытый файл с именем .DS_Store , который сохраняется вместе с путем к файлу изображения. Поэтому у cv2 возникла проблема с этим файлом. Поэтому я решил проблему, удалив .DS_Store.

В моем случае это была проблема с разрешением. Мне пришлось:

  • chmod a+wrx изображение,

тогда это сработало.

У меня была такая же проблема, и оказалось, что в названиях моих изображений содержались специальные символы (например, château.jpg), которые не могли быть обработаны cv2.imread, Мое решение состояло в том, чтобы сделать временную копию файла, переименовав его, например, temp.jpg, который может быть загружен cv2.imread без проблем.

Примечание: я не проверял производительность shutil.copy2 наоборот другие варианты. Так что, вероятно, есть лучшее / более быстрое решение для создания временной копии.

import shutil, sys, os, dlib, glob, cv2

for f in glob.glob(os.path.join(myfolder_path, "*.jpg")):
    shutil.copy2(f, myfolder_path + 'temp.jpg')
    img = cv2.imread(myfolder_path + 'temp.jpg')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    os.remove(myfolder_path + 'temp.jpg')

Если есть только несколько файлов со специальными символами, переименование также может быть сделано в качестве исключения, например

for f in glob.glob(os.path.join(myfolder_path, "*.jpg")):
    try:
        img = cv2.imread(f)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    except:
        shutil.copy2(f, myfolder_path + 'temp.jpg')
        img = cv2.imread(myfolder_path + 'temp.jpg')
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        os.remove(myfolder_path + 'temp.jpg')

Как @shaked litbak, эта ошибка возникла при моем первоначальном использовании с генератором ASCII, так как я наивно думал, что мне просто нужно добавить в каталог ./data с его загрузкой автоматически.
Мне пришлось добавить параметр --input с желаемым путем к файлу.

У меня была такая же проблема при загрузке тысяч изображений. Судя по всему, некоторые файлы не были допустимыми изображениями, но имели правильные расширения. Возможно ошибка при сохранении? Я исправил это, поместив функцию загрузки в блок try-catch, распечатав имена файлов-нарушителей и продолжив выполнение сценария.

      # Process the images
 for image_path in image_paths:
        """
     try-catch block to handle errors in processing individual images.
        """
        try:
            process_image(image_path, pass_folder, reject_folder)
        except cv2.error as e:
            print(f"Error processing image {image_path.name}: {str(e)}")

Я также столкнулся с ошибкой такого типа:

ошибка: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/color.cpp:182: ошибка: (-215: утверждение не удалось) !_src.empty() в функции 'cvtColor'

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

Ваш код не может найти цифру или имя вашей фигуры, названной сообщением об ошибке. Решение:

import cv2
import numpy as np 
import matplotlib.pyplot as plt 
img=cv2.imread('哈哈.jpg')#solution:img=cv2.imread('haha.jpg')
print(img)

Если кто-то испытывает ту же проблему при чтении кадра с веб-камеры [с кодом, похожим на "frame = cv2.VideoCapture(0)"] и работает в Jupyter Notebook, вы можете попробовать:

  1. убедитесь, что ранее проверенный код еще не запущен, и перезапустите ядро ​​Jupyter Notebook

  2. ОТДЕЛЬНЫЙ код "frame = cv2.VideoCapture(0)" в отдельной ячейке на том месте, где он находится [предыдущий код помещен в ячейку выше, код ниже помещен в ячейку вниз]

  3. затем запустите весь код выше ячейки, где "frame = cv2.VideoCapture(0)"

  4. затем попробуйте запустить следующую ячейку с ее единственным кодом "frame = cv2.VideoCapture(0)" - И - до тех пор, пока вы не продолжите выполнение других ячеек - УБЕДИТЕСЬ, что вместо этого отображается ASTERIX слева от этой конкретной ячейки DISAPEAR и порядковый номер команды - только потом продолжай

  5. теперь вы можете попробовать выполнить остальную часть кода, так как вход камеры больше не должен быть пустым:-)

  6. После завершения убедитесь, что вы закрыли всю свою программу и перезапустили ядро, чтобы подготовить его к следующему запуску.

Решение состоит в том, чтобы добавить './' перед именем изображения перед его чтением...

      path = os.path.join(raw_folder, folder, file)
print('[DEBUG] path:', path)

img = cv2.imread(path)   #read path Image 

if img is None: # check if the image exists in the path you give
    print('Wrong path:', path)
else: # It completes the steps
    img = cv2.resize(img, dsize=(128,128))
    pixels.append(img)

Просто попробуйте деградировать OpenCV в оболочке python (в cmd)

      >>> import cv2
>>> cv2.__version__

после проверки в cmd

      pip uninstall opencv-python

после удаления версии установки opencv

      pip install opencv-python==3.4.8.29

Пожалуйста, увидите, ребята, что ошибка в cv2.imread() . Укажите правильный путь к изображению. и во-первых, посмотрите, загружает ли ваша система изображение или нет. это можно проверить сначала простой загрузкой изображения с помощью cv2.imread() . после этого посмотрите этот код для распознавания лиц

import numpy as np
import cv2

cascPath = "/Users/mayurgupta/opt/anaconda3/lib/python3.7/site-   packages/cv2/data/haarcascade_frontalface_default.xml"

eyePath = "/Users/mayurgupta/opt/anaconda3/lib/python3.7/site-packages/cv2/data/haarcascade_eye.xml"

smilePath = "/Users/mayurgupta/opt/anaconda3/lib/python3.7/site-packages/cv2/data/haarcascade_smile.xml"

face_cascade = cv2.CascadeClassifier(cascPath)
eye_cascade = cv2.CascadeClassifier(eyePath)
smile_cascade = cv2.CascadeClassifier(smilePath)

img = cv2.imread('WhatsApp Image 2020-04-04 at 8.43.18 PM.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Здесь cascPath,eyePath,smilePath должны иметь правильный фактический путь, взятый из lib/python3.7/site-packages/cv2/data, здесь этот путь должен быть для получения файлов haarcascade

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