본문 바로가기
오류 해결

[OpenCV] cv2.error: OpenCV(x.x.x) :-1: error: (-215:Assertion failed) scn == 3 || scn == 4 in function 'cvtColor'

by First Adventure 2024. 9. 16.
반응형

에러 메시지 설명

  이 오류는 OpenCV의 cv2.cvtColor() 함수를 사용하여 이미지 색상 변환을 시도할 때 발생합니다. scn == 3 || scn == 4라는 에러 메시지는 입력 이미지의 채널 수가 3(BGR) 또는 4(RGBA)가 되어야 하지만, 그렇지 않기 때문에 오류가 발생하는 것을 의미합니다. OpenCV는 이미지가 BGR 또는 RGBA 형식일 때만 cvtColor() 함수를 사용하여 색상 변환을 수행할 수 있습니다.

 

발생 원인

  이 오류는 다음과 같은 이유로 발생할 수 있습니다.

  • 이미지 로드 실패: cv2.imread()로 이미지를 로드할 때, 경로 오류나 파일 손상으로 인해 이미지가 None으로 반환된 경우.
  • 잘못된 이미지 형식: cv2.cvtColor()가 예상하는 형식(BGR 또는 RGBA)이 아닌 다른 형식의 이미지가 입력된 경우. 예를 들어, 흑백 이미지(채널이 1개)를 사용하려고 할 때 발생할 수 있습니다.
  • 비디오 프레임 또는 웹캠 입력 문제: 비디오에서 프레임을 가져오려 했지만 프레임이 제대로 읽히지 않아 빈 프레임이나 잘못된 형식의 프레임이 반환될 때.

 

해결 방법

이미지 로드 여부 확인

  가장 먼저 확인할 것은 이미지가 제대로 로드되었는지 여부입니다. cv2.imread()로 이미지를 로드한 후, 이미지가 None 값인지 확인하세요.

image = cv2.imread('path/to/image.jpg')
if image is None:
    print("이미지를 로드하지 못했습니다. 경로를 확인하세요.")
else:
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

 

입력 이미지의 채널 수 확인

  이미지의 채널 수가 3(BGR) 또는 4(RGBA)인지 확인해야 합니다. 단일 채널(예: 흑백 이미지)의 경우, cv2.cvtColor() 함수가 작동하지 않으므로 이미지 형식을 변경해야 합니다.

print(image.shape)  # 출력: (height, width, channels)
if len(image.shape) < 3 or image.shape[2] != 3:
    print("이미지에 적절한 채널이 없습니다. 이미지가 BGR 형식인지 확인하세요.")

 

비디오 프레임 확인

  비디오 프레임을 가져오려는 경우, cv2.VideoCapture()로 비디오를 열고 프레임이 제대로 읽혔는지 확인합니다. 프레임이 None이거나 예상한 형식이 아닌 경우 오류가 발생할 수 있습니다.

cap = cv2.VideoCapture(0)
ret, frame = cap.read()
if not ret:
    print("프레임을 가져올 수 없습니다.")
else:
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

 

 

흑백 이미지 처리

  흑백 이미지와 같이 채널 수가 1인 이미지를 처리하려면, 먼저 이미지의 형식을 확인한 후 그에 맞는 처리를 수행해야 합니다. 예를 들어, 흑백 이미지를 BGR로 변환하려면 다음과 같이 코드를 수정할 수 있습니다.

if len(image.shape) == 2:  # 채널이 1개인 흑백 이미지인 경우
    image_bgr = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)  # 흑백 이미지를 BGR로 변환

 

 

관련 내용 및 추가 팁

  • 파일 경로 및 확장자 확인: 이미지가 제대로 로드되지 않을 경우, 파일 경로 및 확장자가 올바른지 확인하세요.
  • 이미지 형식 변환: 이미지를 다른 색상 공간으로 변환하려면, 먼저 입력 이미지가 OpenCV가 처리할 수 있는 형식(BGR 또는 RGBA)인지 확인해야 합니다.
반응형