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.
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óbujimg = cv2.imread('2015-05-27-191152.jpg')
lubgray = cv2.imread('2015-05-27-191152.jpg',0)
spójrz na różne flagi na: docs.opencv.org/modules/highgui/doc/ ....../eclipse\ footage/...
mojej drodze jest spacja ( ). Więc dodanie...,0)
nie naprawiło tego.Odpowiedzi:
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
0
drugi parametr podczas wczytywania obrazu używająccv2.imread
niż 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)
źródło
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
źródło
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)
źródło
Podaj tylko nazwę obrazu, bez konieczności
0
:img=cv2.imread('sample.jpg')
źródło
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.źródło
cv2.cvtColor
pustej klatki.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.imread
bę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
cvtColor
awarię, podczas gdy w rzeczywistości jest to cichyimread
błą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.
źródło
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ć.
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
źródło
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:
jest to, że w tym przypadku
img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)
obrazy są obrazami typu 8uC1 i 32sC1.źródło
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
źródło
Oto, co zaobserwowałem, gdy użyłem własnych zestawów obrazów w
.jpg
formacie. W przykładowym skrypcie dostępnym w dokumencie Opencv zwróć uwagę, że ma on linieundistort
icrop the image
jak 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 obrazcalibresult.jpg
w 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, zcalibresult.jpg
powodu którego wyskoczył błąderror: 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ć
png
lubtiff
typ. To rozwiązało problem. Sprawdź, czycalibresult
wpisujesz i piszesz tego samego typu. Jeśli tak, po prostu zmień typ.źródło
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.
źródło
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ł.
źródło
Najprostszym sposobem usunięcia tego błędu było uruchomienie polecenia
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.
źródło
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.
źródło
Myślę, że to dlatego, że
cv2.imread
nie mogę odczytać.jpg
obrazu, musisz zmienić.jpg
na.png
.źródło
W moim przypadku błąd został rozwiązany poprzez migrację do OpenCV 4.0 (lub nowszego).
źródło