помилка відкритого CV: (-215) scn == 3 || scn == 4 у функції cvtColor


89

В даний час я працюю в 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.shap, вона повертає лише два числа, тому я, мабуть, роблю це неправильно. Але я не знаю правильного способу завантаження своєї фотографії.


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/…
Мікка

У мене також була ця проблема, але виявилося, що на .../eclipse\ footage/...моєму шляху є пробіл ( ). Тож додавання a ...,0)не виправило.
Коді,

Відповіді:


102

Вкажіть повний шлях зображення з косою рискою вперед. Це вирішило помилку для мене.

Напр

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

... або якщо ви надасте неправильний шлях до відеофайлу, P Я зіткнувся з цією проблемою whien я зіпсував прокляті вітрини шляху (написання 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. Що означає, що cv2.imread(imageName)зображення не читається.


Ця відповідь вирішує мою проблему - я читаю відео, воно не зупиняється автоматично, коли відео закінчується, тому я отримую ту ж помилку, намагаючись cv2.cvtColorпорожній кадр.
Mikhail_Sam

2

У мене з’явилося це повідомлення про помилку з абсолютно не пов’язаних з цим причин прапорів 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 

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 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одного типу. Якщо так, просто змініть тип.


0

На OS XI зрозумів, що хоча cv2.imread може мати справу з "filename.jpg", він не може обробляти "file.name.jpg". Будучи початківцем python, я ще не можу запропонувати рішення, але, як писав Франсуа Леблан, це скоріше тиха непрочитана помилка.

Тож у нього проблема з додатковою крапкою в назві файлу та, можливо, іншими знаками, як, наприклад, з "" (Пробіл) або "%" тощо.


0

Я також виявив, що ваша веб-камера не закрилася правильно чи щось використовує її, тоді CV2 видасть цю саму помилку. Мені довелося перезапустити свій ПК, щоб він знову запрацював.


0

Найпростішим рішенням для усунення цієї помилки було виконання команди

cap.release()
cv2.closeAllWindows()

Це працювало у мене, а також іноді потрібно було перезапустити ядро ​​через старі процеси, що працюють у фоновому режимі.

Якщо зображення немає в робочому каталозі, тоді воно також не буде працювати для того, щоб спробувати розмістити файл зображення в pwd в тій самій папці, оскільки є інший код, надайте повний шлях до файлу зображення або папки.

Щоб уникнути цієї проблеми в майбутньому, спробуйте кодувати з винятковою обробкою, щоб, якщо трапиться неправильне припинення з якихось випадкових причин, захоплюючий пристрій звільнився після того, як програма закінчиться.


0

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


0

я думаю, тому що cv2.imreadне можу прочитати .jpgзображення, вам потрібно змінити .jpgна .png.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.