открыть ошибку 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 73

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, добавленного в конце. И если вы снова попытаетесь преобразовать уже серое изображение в серое изображение, оно покажет эту ошибку.

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

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

решение

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

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

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