ошибка открытия cv: (-215) scn == 3 / / scn == 4 в функции cvtColor

в настоящее время я нахожусь в 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.форма возвращает только два числа, поэтому я, должно быть, делаю это неправильно. Но я не знаю, как правильно загрузить мою фотографию.

16 ответов


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

Э. Г.

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)

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

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

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

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

поэтому либо используйте выше стиль, либо попробуйте undermentioned код:

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

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

img=cv2.imread('sample.jpg')

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


у меня появилось это сообщение об ошибке, по совершенно не связанным причинам с флагами 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 ошибка. Помни об этом в следующий раз, когда будешь тратить час своей жизни на эту загадку. метафора!--11-->.

решение

возможно, Вам потребуется проверить, что строка пути представляет допустимый файл, прежде чем передавать его в 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)

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


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

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 

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)

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

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

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

, что в случае img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY), изображения 8uc1 и 32sc1 типа изображений.


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

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


вот что я заметил, когда я использовал свои собственные наборы изображения в . В Примере сценария, доступном в Opencv doc обратите внимание, что он имеет 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 такого же типа. Если да, просто измените тип.


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

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


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


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

cap.release()
cv2.closeAllWindows()

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

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

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


2015-05-27-191152.jpg


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


попробуйте это в строке 11, работает для меня.Я думаю, вам не хватает параметров функции detectMultiScale ()

faces = face_cascade.detectMultiScale(gray, 1.3, 5)