błąd open cv: (-215) scn == 3 || scn == 4 w funkcji cvtColor

91

Obecnie korzystam z Ubuntu 14.04, używam Pythona 2.7 i cv2.

Kiedy uruchamiam ten kod:

import numpy as np
import cv2

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

zwraca:

 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

Szukałem już tutaj i jedna odpowiedź mówiła, że ​​mogę ładować swoje zdjęcie w niewłaściwy sposób, ponieważ powinno mieć 3 wymiary: rzędy, kolumny i głębokość.

Kiedy drukuję img.shape, zwraca on tylko dwie liczby, więc chyba robię to źle. Ale nie wiem, jak załadować moje zdjęcie.

arthurckl
źródło
11
img = cv2.imread('2015-05-27-191152.jpg',0)parametr 0 już ładuje obraz jako 1-kanałowy obraz w skali szarości. Więc spróbuj img = cv2.imread('2015-05-27-191152.jpg')lub gray = cv2.imread('2015-05-27-191152.jpg',0)spójrz na różne flagi na: docs.opencv.org/modules/highgui/doc/ ...
Micka
Ja też miałem ten problem, ale okazało się, że na .../eclipse\ footage/...mojej drodze jest spacja ( ). Więc dodanie ...,0)nie naprawiło tego.
Cody

Odpowiedzi:

104

Podaj pełną ścieżkę obrazu za pomocą ukośnika. Rozwiązało to za mnie błąd.

Na przykład

import numpy as np
import cv2

img = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Ponadto, jeśli podasz 0drugi parametr podczas wczytywania obrazu używając cv2.imreadniż nie ma potrzeby konwertowania obrazu za pomocą cvtColor, jest on już załadowany jako obraz w skali szarości np.

import numpy as np
import cv2

gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0)
AdityaIntwala
źródło
6
W przypadku pobierania obrazu z kamery: pojawia się ten błąd, jeśli kamera nie jest dostępna.
ger.s.brett
1
... lub jeśli podasz złą ścieżkę do pliku wideo; P Napotkałem ten problem, gdy zepsułem ścieżkę do cholery-windows (pisząc c: / zamiast C: //)
fanny
17

Ustaw jak poniżej

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
Kalarav Parmar
źródło
6
img = cv2.imread('2015-05-27-191152.jpg',0)

Powyższy wiersz kodu odczytuje obraz w modelu kolorów w skali szarości, ponieważ na końcu jest dołączone 0. A jeśli ponownie spróbujesz przekonwertować już szary obraz na szary obraz, pokaże ten błąd.

Więc użyj powyższego stylu lub wypróbuj poniższy kod:

img = cv2.imread('2015-05-27-191152.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Gurkamal
źródło
4

Podaj tylko nazwę obrazu, bez konieczności 0:

img=cv2.imread('sample.jpg')
supriya junghare
źródło
4

Pierwszą rzeczą, którą powinieneś sprawdzić, jest to, czy obraz istnieje w katalogu głównym, czy nie. Wynika to głównie z obrazu o wysokości = 0. Co oznacza, że cv2.imread(imageName)nie odczytuje obrazu.

Farooq Khan
źródło
Ta odpowiedź rozwiązuje mój problem - czytam wideo, nie zatrzymuje się automatycznie po zakończeniu wideo, więc pojawia się ten sam błąd przy próbie cv2.cvtColorpustej klatki.
Mikhail_Sam
3

Pojawił się ten komunikat o błędzie, z powodów zupełnie niezwiązanych z flagami 0 lub 1 wymienionymi w innych odpowiedziach. Można się widząc go zbyt ponieważ cv2.imreadbędzie nie błędu, jeśli ciąg ścieżki mijamy go nie jest obraz:

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

Widzisz więc cvtColorawarię, podczas gdy w rzeczywistości jest to cichy imreadbłąd. Miej to na uwadze, gdy następnym razem marnujesz godzinę swojego życia na tę tajemniczą metaforę .

Rozwiązanie

Może być konieczne sprawdzenie, czy ciąg ścieżki reprezentuje prawidłowy plik przed przekazaniem go do 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)

Napisany w ten sposób, twój kod z wdziękiem zawiedzie.

François Leblanc
źródło
1

Ta odpowiedź dotyczy osób, które mają ten sam problem, próbując uzyskać dostęp do kamery.

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()

W systemie Linux:

jeśli próbujesz uzyskać dostęp do kamery z komputera, najprawdopodobniej występuje problem z uprawnieniami, spróbuj uruchomić skrypt Pythona z sudo, powinno to naprawić.

sudo python python_script.py

Aby sprawdzić, czy kamera jest dostępna, uruchom następujące polecenie.

ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv 
ehivan24
źródło
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

Powyższy błąd jest wynikiem nieprawidłowej nazwy obrazu lub braku pliku w katalogu lokalnym.

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

Również jeśli używasz drugiego argumentu cv2.imread () jako „0”, to jest on już przekonwertowany na obraz w skali szarości.

Różnica między konwersją obrazu przez przekazanie 0 jako parametru a zastosowaniem następującego:

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

jest to, że w tym przypadku img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)obrazy są obrazami typu 8uC1 i 32sC1.

Shikhar Johri
źródło
1

Ten kod dla tych, którzy mają ten sam problem, próbując uzyskać dostęp do kamery, można napisać z kontrolą bezpieczeństwa.

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   continue

LUB w przypadku, gdy chcesz zamknąć aparat / przerwać, jeśli wystąpi jakiś problem z samą ramką

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   break

W celach informacyjnych https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36

Vivek Patwari
źródło
0

Oto, co zaobserwowałem, gdy użyłem własnych zestawów obrazów w .jpgformacie. W przykładowym skrypcie dostępnym w dokumencie Opencv zwróć uwagę, że ma on linie undistorti crop the imagejak poniżej:

# 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)

Tak więc, kiedy uruchamiamy kod po raz pierwszy, wykonuje on wiersz cv2.imwrite('calibresult.jpg',dst)zapisujący obraz calibresult.jpgw bieżącym katalogu. Kiedy więc uruchomiłem kod po raz kolejny, wraz z moimi przykładowymi zestawami obrazów, których użyłem do kalibracji aparatu w formacie jpg, kod próbował również rozważyć ten nowo dodany obraz, z calibresult.jpgpowodu którego wyskoczył błąd

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

Zrobiłem: po prostu usunąłem ten nowo wygenerowany obraz po każdym przebiegu lub alternatywnie zmieniłem typ obrazu, aby powiedzieć pnglub tifftyp. To rozwiązało problem. Sprawdź, czy calibresultwpisujesz i piszesz tego samego typu. Jeśli tak, po prostu zmień typ.

Bhanu Chander
źródło
0

Na OS XI zdałem sobie sprawę, że chociaż cv2.imread radzi sobie z „filename.jpg”, nie może przetwarzać „file.name.jpg”. Będąc nowicjuszem w Pythonie, nie mogę jeszcze zaproponować rozwiązania, ale jak napisał François Leblanc, jest to raczej cichy błąd odczytu.

Więc ma problem z dodatkową kropką w nazwie pliku i prawdopodobnie również innymi znakami, jak z "" (Spacja), "%" i tak dalej.

Francis
źródło
0

Stwierdziłem również, że jeśli twoja kamera internetowa nie zamknęła się dobrze lub coś jej używa, to CV2 poda ten sam błąd. Musiałem ponownie uruchomić komputer, aby znów działał.

MNM
źródło
0

Najprostszym sposobem usunięcia tego błędu było uruchomienie polecenia

cap.release()
cv2.closeAllWindows()

U mnie to zadziałało, a czasami ponowne uruchomienie jądra było wymagane z powodu starych procesów działających w tle.

Jeśli obraz nie znajduje się w katalogu roboczym, to również nie będzie działać, spróbuj umieścić plik obrazu w pwd w tym samym folderze, w którym jest kod, w przeciwnym razie podaj pełną ścieżkę do pliku lub folderu obrazu.

Aby uniknąć tego problemu w przyszłości, spróbuj kodować z wyjątkową obsługą, aby w przypadku niepoprawnego zakończenia z jakiegoś przypadkowego powodu urządzenie przechwytujące zostało zwolnione po zakończeniu programu.

Vinay Verma
źródło
0

2015-05-27-191152.jpg << Patrząc wstecz na format obrazu, czasami myliłem się między .png i .jpg i napotykałem ten sam błąd.

Hong Son Nguyen
źródło
0

Myślę, że to dlatego, że cv2.imreadnie mogę odczytać .jpgobrazu, musisz zmienić .jpgna .png.

shenmeme
źródło
0

W moim przypadku błąd został rozwiązany poprzez migrację do OpenCV 4.0 (lub nowszego).

sunil manikani
źródło