открыть ошибку 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, добавленного в конце. И если вы снова попытаетесь преобразовать уже серое изображение в серое изображение, оно покажет эту ошибку.
Так что либо использовать выше стиль или попробовать ниже код:
img = cv2.imread('2015-05-27-191152.jpg') gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Первое, что вы должны проверить, что ли изображение существует в корневом каталоге или нет. Это в основном связано с изображением с высотой = 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 в той же папке, что и код, иначе укажите полный путь к файлу изображения или папке.
чтобы избежать этой проблемы в будущем попробуйте код с исключительной обработкой так что, если неправильное завершение происходит по какой-то случайной причине, устройство захвата будет выпущено после завершения программы.