В настоящее время я использую 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, он возвращает только два числа, поэтому я, должно быть, делаю это неправильно. Но я не знаю, как правильно загрузить свое фото.
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/....../eclipse\ footage/...
моем пути есть пробел ( ). Так что добавление...,0)
не исправило.Ответы:
Укажите полный путь изображения с косой чертой. Это решило ошибку для меня.
Например
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)
изображение не читается.источник
cv2.cvtColor
для пустого кадра.У меня появилось это сообщение об ошибке по совершенно не связанным причинам с флагами 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, он должен исправить это.
Чтобы проверить, доступна ли камера, выполните следующую команду.
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)
Также, если вы используете второй аргумент cv2.imread () как «0», то он уже преобразован в изображение в оттенках серого.
Разница между преобразованием изображения путем передачи 0 в качестве параметра и применением следующего:
состоит в том, что в данном случае
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
источник
Вот что я наблюдал, когда использовал свои собственные наборы изображений в
.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
одного и того же типа. Если да, просто поменяйте тип.источник
В OS X я понял, что, хотя cv2.imread может работать с "filename.jpg", он не может обрабатывать "file.name.jpg". Поскольку я новичок в Python, я пока не могу предложить решение, но, как писал Франсуа Леблан, это скорее скрытая ошибка imread.
Таким образом, у него есть проблема с дополнительной точкой в имени файла и, возможно, другими знаками, такими как «» (Пробел) или «%» и так далее.
источник
Я также обнаружил, что если ваша веб-камера закрылась неправильно или что-то ее использует, CV2 выдаст ту же ошибку. Мне пришлось перезагрузить компьютер, чтобы он снова заработал.
источник
Самым простым решением для устранения этой ошибки было выполнение команды
Это сработало для меня, а также иногда требовался перезапуск ядра из-за старых процессов, работающих в фоновом режиме.
Если изображение не находится в рабочем каталоге, тогда оно также не будет работать, поэтому попробуйте поместить файл изображения в pwd в той же папке, что и код, иначе укажите полный путь к файлу или папке изображения.
Чтобы избежать этой проблемы в будущем, попробуйте кодировать с исключительной обработкой, чтобы, если по какой-то случайной причине произойдет неправильное завершение, захватывающее устройство освободится после завершения программы.
источник
2015-05-27-191152.jpg << Оглядываясь назад на ваш формат изображения, я иногда путал между .png и .jpg и обнаруживал ту же ошибку.
источник
Я думаю, это потому, что
cv2.imread
не могу прочитать.jpg
картинку, вам нужно изменить.jpg
на.png
.источник
В моем случае ошибка была устранена путем перехода на OpenCV 4.0 (или выше).
источник