열린 cv 오류 : (-215) scn == 3 || cvtColor 함수의 scn == 4


91

저는 현재 python 2.7 및 cv2를 사용하는 Ubuntu 14.04에 있습니다.

이 코드를 실행할 때 :

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를 인쇄하면 두 개의 숫자 만 반환되므로 잘못하고있는 것 같습니다. 하지만 내 사진을로드하는 올바른 방법을 모르겠습니다.


11
img = cv2.imread('2015-05-27-191152.jpg',0)0 매개 변수는 이미 이미지를 1 채널 회색조 이미지로로드합니다. 따라서 docs.opencv.org/modules/highgui/doc/… 에서 다른 플래그를 시도 img = cv2.imread('2015-05-27-191152.jpg')하거나 gray = cv2.imread('2015-05-27-191152.jpg',0)살펴 보십시오 .
Micka

나도이 문제가 있었지만 .../eclipse\ footage/...내 경로에 공백 ( ) 이있는 것으로 밝혀졌습니다 . 따라서 추가 ...,0)해도 문제가 해결되지 않았습니다.
Cody

답변:


104

슬래시로 이미지의 전체 경로를 제공하십시오. 그것은 나를 위해 오류를 해결했습니다.

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

1
... 또는 비디오 파일에 잘못된 경로를 제공하는 경우; P이 문제가 발생하여 망할 윈도우 경로를 엉망으로 만들었습니다 (C : // 대신 c : / 작성)
fanny

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

3

다른 답변에서 언급 된 플래그 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 사용 :

컴퓨터에서 카메라에 액세스하려는 경우 권한 문제가있을 가능성이 높은 경우 sudo로 python 스크립트를 실행하면 문제가 해결됩니다.

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 에서 사용할 수있는 샘플 스크립트 에는 다음 undistortcrop 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"는 처리 할 수 ​​없습니다. 파이썬 초보자이기 때문에 아직 해결책을 제안 할 수는 없지만 François Leblanc이 썼 듯이 그것은 조용한 imread 오류에 가깝습니다.

따라서 파일 이름에 추가 점이 있고 ""(공백) 또는 "%"등의 다른 기호도 마찬가지로 표시되는 문제가 있습니다.


0

또한 웹캠이 제대로 닫히지 않았거나 무언가가 그것을 사용하고 있다면 CV2가 이와 동일한 오류를 표시합니다. 다시 작동하려면 내 PC를 다시 시작해야했습니다.


0

해당 오류를 제거하는 가장 간단한 솔루션은 명령을 실행하는 것입니다.

cap.release()
cv2.closeAllWindows()

그것은 나를 위해 일했으며 때로는 백그라운드에서 실행되는 오래된 프로세스 때문에 커널을 다시 시작해야했습니다.

이미지가 작업 디렉토리에 없으면 이미지 파일이나 폴더의 전체 경로를 제공하는 코드가 있기 때문에 동일한 폴더의 pwd에 이미지 파일을 배치하려고 시도하는 것도 작동하지 않습니다.

앞으로이 문제를 방지하려면 예외적으로 처리하여 코드를 작성하여 임의의 이유로 잘못된 종료가 발생하면 프로그램이 종료 된 후 캡처 장치가 해제되도록합니다.


0

2015-05-27-191152.jpg << 이미지 형식을 돌아 보면 가끔 .png와 .jpg를 혼동하고 같은 오류가 발생했습니다.


0

때문에 나는 그것을 생각 cv2.imread읽을 수없는 .jpg사진을, 당신은 변화를 필요 .jpg.png.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.