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, вы можете попробовать:
убедитесь, что ранее проверенный код еще не запущен, и перезапустите ядро Jupyter Notebook
ОТДЕЛЬНЫЙ код "frame = cv2.VideoCapture(0)" в отдельной ячейке на том месте, где он находится [предыдущий код помещен в ячейку выше, код ниже помещен в ячейку вниз]
затем запустите весь код выше ячейки, где "frame = cv2.VideoCapture(0)"
затем попробуйте запустить следующую ячейку с ее единственным кодом "frame = cv2.VideoCapture(0)" - И - до тех пор, пока вы не продолжите выполнение других ячеек - УБЕДИТЕСЬ, что вместо этого отображается ASTERIX слева от этой конкретной ячейки DISAPEAR и порядковый номер команды - только потом продолжай
теперь вы можете попробовать выполнить остальную часть кода, так как вход камеры больше не должен быть пустым:-)
После завершения убедитесь, что вы закрыли всю свою программу и перезапустили ядро, чтобы подготовить его к следующему запуску.
Решение состоит в том, чтобы добавить './' перед именем изображения перед его чтением...
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