ошибка открытого резюме: (-215) scn == 3 || scn == 4 в функции cvtColor

91

В настоящее время я использую Ubuntu 14.04, использую python 2.7 и cv2.

Когда я запускаю этот код:

import numpy as np
import cv2

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

он возвращает:

 File "face_detection.py", line 11, in <module>
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

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

Когда я печатаю img.shape, он возвращает только два числа, поэтому я, должно быть, делаю это неправильно. Но я не знаю, как правильно загрузить свое фото.

Артуркль
источник
11
img = cv2.imread('2015-05-27-191152.jpg',0)параметр 0 уже загружает ваше изображение как 1-канальное изображение в оттенках серого. Так что либо попробовать img = cv2.imread('2015-05-27-191152.jpg')или gray = cv2.imread('2015-05-27-191152.jpg',0)посмотреть на различные флаги на: docs.opencv.org/modules/highgui/doc/...
Micka
У меня тоже была эта проблема, но оказалось, что на .../eclipse\ footage/...моем пути есть пробел ( ). Так что добавление ...,0)не исправило.
Cody

Ответы:

104

Укажите полный путь изображения с косой чертой. Это решило ошибку для меня.

Например

import numpy as np
import cv2

img = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Кроме того, если вы укажете 0второй параметр при загрузке изображения, используя cv2.imreadчем нет необходимости конвертировать изображение cvtColor, оно уже загружено как изображение в градациях серого, например.

import numpy as np
import cv2

gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0)
АдитьяИнтвала
источник
6
Если вы захватываете изображение с камеры: вы получите эту ошибку, если камера недоступна.
ger.s.brett 01
1
... или если вы укажете неправильный путь к вашему видеофайлу; P Я столкнулся с этой проблемой, когда испортил путь проклятого окна (написав c: / вместо C: //)
Фанни,
17

Пожалуйста, установите как показано ниже

img = cv2.imread('2015-05-27-191152.jpg',1)     // Change Flag As 1 For Color Image
                                                //or O for Gray Image So It image is 
                                                //already gray
Каларав Пармар
источник
6
img = cv2.imread('2015-05-27-191152.jpg',0)

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

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

img = cv2.imread('2015-05-27-191152.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Гуркамал
источник
4

Передайте только имя изображения, не нужно 0:

img=cv2.imread('sample.jpg')
Supriya Junghare
источник
4

Первое, что вы должны проверить, это то, существует ли изображение в корневом каталоге или нет. В основном это связано с изображением с высотой = 0. Это означает, что cv2.imread(imageName)изображение не читается.

Фарук Хан
источник
Этот ответ решает мою проблему - я читаю видео, оно не останавливается автоматически, когда видео заканчивается, поэтому я получаю ту же ошибку, что и cv2.cvtColorдля пустого кадра.
Mikhail_Sam
3

У меня появилось это сообщение об ошибке по совершенно не связанным причинам с флагами 0 или 1, упомянутыми в других ответах. Возможно, вы тоже это видите, потому cv2.imreadчто не выдаст ошибку, если строка пути, которую вы передаете, не является изображением:

In [1]: import cv2
   ...: img = cv2.imread('asdfasdf')  # This is clearly not an image file
   ...: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   ...:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp, line 10638
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-4-19408d38116b> in <module>()
      1 import cv2
      2 img = cv2.imread('asdfasdf')  # This is clearly not an image file
----> 3 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:10638: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

Итак, вы видите cvtColorсбой, хотя на самом деле это скрытая imreadошибка. Имейте это в виду, когда в следующий раз вы потратите час своей жизни на эту загадочную метафору .

Решение

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

import os


def read_img(path):
    """Given a path to an image file, returns a cv2 array

    str -> np.ndarray"""
    if os.path.isfile(path):
        return cv2.imread(path)
    else:
        raise ValueError('Path provided is not a valid file: {}'.format(path))


path = '2015-05-27-191152.jpg'
img = read_img(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Написанный таким образом, ваш код завершится неудачно.

Франсуа Леблан
источник
1

Это ответ для людей, испытывающих ту же проблему при попытке доступа к камере.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Используя Linux:

Если вы пытаетесь получить доступ к камере со своего компьютера, скорее всего, возникла проблема с разрешением, попробуйте запустить скрипт python с помощью sudo, он должен исправить это.

sudo python python_script.py

Чтобы проверить, доступна ли камера, выполните следующую команду.

ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv 
ehivan24
источник
1
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

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

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Также, если вы используете второй аргумент cv2.imread () как «0», то он уже преобразован в изображение в оттенках серого.

Разница между преобразованием изображения путем передачи 0 в качестве параметра и применением следующего:

img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY) 

состоит в том, что в данном случае img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)изображения являются изображениями типа 8uC1 и 32sC1.

Шихар Джохри
источник
1

Этот код для тех, кто испытывает ту же проблему при попытке доступа к камере, может быть написан с проверкой безопасности.

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   continue

ИЛИ, если вы хотите закрыть камеру / прекратить работу, если возникнут проблемы с самой рамкой

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   break

Для справки https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36

Вивек Патвари
источник
0

Вот что я наблюдал, когда использовал свои собственные наборы изображений в .jpgформате. В примере сценария доступны в OpenCV документ , отметим , что она имеет undistortи crop the imageлинии , как показано ниже:

# undistort
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

# crop the image
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.jpg',dst)

Итак, когда мы запускаем код в первый раз, он выполняет строку, cv2.imwrite('calibresult.jpg',dst)сохраняющую изображение calibresult.jpgв текущем каталоге. Итак, когда я в следующий раз запустил код вместе с моими наборами образцов изображений, которые я использовал для калибровки камеры в формате jpg, код также попытался учесть это недавно добавленное изображение, calibresult.jpgиз-за которого выскочила ошибка.

error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\color.cpp:7456: error: (-215) scn == 3 || scn == 4 in function cv::ipp_cvtColor

Что я сделал: я просто удалил это вновь созданное изображение после каждого запуска или, альтернативно, изменил тип изображения, чтобы сказать pngили tiffввести. Это решило проблему. Убедитесь, что вы вводите и пишете calibresultодного и того же типа. Если да, просто поменяйте тип.

Бхану Чандер
источник
0

В OS X я понял, что, хотя cv2.imread может работать с "filename.jpg", он не может обрабатывать "file.name.jpg". Поскольку я новичок в Python, я пока не могу предложить решение, но, как писал Франсуа Леблан, это скорее скрытая ошибка imread.

Таким образом, у него есть проблема с дополнительной точкой в ​​имени файла и, возможно, другими знаками, такими как «» (Пробел) или «%» и так далее.

Фрэнсис
источник
0

Я также обнаружил, что если ваша веб-камера закрылась неправильно или что-то ее использует, CV2 выдаст ту же ошибку. Мне пришлось перезагрузить компьютер, чтобы он снова заработал.

MNM
источник
0

Самым простым решением для устранения этой ошибки было выполнение команды

cap.release()
cv2.closeAllWindows()

Это сработало для меня, а также иногда требовался перезапуск ядра из-за старых процессов, работающих в фоновом режиме.

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

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

Vinay Verma
источник
0

2015-05-27-191152.jpg << Оглядываясь назад на ваш формат изображения, я иногда путал между .png и .jpg и обнаруживал ту же ошибку.

Хонг Сон Нгуен
источник
0

Я думаю, это потому, что cv2.imreadне могу прочитать .jpgкартинку, вам нужно изменить .jpgна .png.

Шенмэм
источник
0

В моем случае ошибка была устранена путем перехода на OpenCV 4.0 (или выше).

Сунил Маникани
источник