TroubleShooting

Invalid number of channels in input image: 'VScn::contains(scn)' 'scn' is 1 [closed]

JackSmith 2024. 8. 24.

opencv로 작업을 진행할때, 이미지를 읽어오는 과정에서 가끔 아래와 같은 오류가 발생합니다.

 

Invalid number of channels in input image: 'VScn::contains(scn)' 'scn' is 1 [closed]

 

 

이는 OpenCV에서 필터링 작업을 할때 입력 이미지의 채널수가 예상과 다를때 발생하는 오류입니다.

마치 이런거죠, add()라는 함수가 정의되어 있고, 여기에 들어가는 인수가 add(1,7) 인 것처럼, 총 두개의 인수가 들어가야 하는데, 한개의 입력밖에 안들어온 상황에서 입력되는 값의 조건을 충족하지 못해서 오류가 뜨는 것처럼요.

 

이번 오류 또한 같은 맥락입니다.

보통 컬러 이미지가 아닌 그레이스케일 이미지에 대해 컬러 이미지를 다루는 함수나 필터를 적용하려고 할때 발생합니다.

 

 

그래서 해당 문제가 코드를 살펴보겠습니다.

수정전 코드:

import cv2
import numpy as np

img = cv2.imread('./assets/images/siba.jpg', 0)
Gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray image", Gray)

kernel = 1/9*np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]])
Gray = cv2.filter2D(Gray, -1, kernel)

cv2.imshow("filtered image", Gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

위 코드에서 이미지가 그레이스케일(GrayScale)인지 컬러인지 확인하는 if문을 넣어줍니다.

그리고 그레이스케일 이미지를 컬러로 변환할 필요가 있는 경우, `cv2.cvtColor(img, cv2.COLOR_GRAY2BGR`을 사용하여 변환합니다.

 

수정후 코드(1):

import cv2
import numpy as np

img = cv2.imread('./assets/images/siba.jpg', 0)
if len(img.shape) == 2:  # 그레이스케일 이미지인 경우
    print("그레이스케일 이미지인 경우")
    img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
Gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray image", Gray)

kernel = 1/9*np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]])
Gray = cv2.filter2D(Gray, -1, kernel)

cv2.imshow("filtered image", Gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

또는 그냥 돌아가지 말고 단순하게 생각해볼 수 있습니다. 위에서 if문을 거친다는 것은 흑백(그레이스케일)이라는 뜻이고, 이는 아래와 같이 중간에 있는 코드를 싹다 날려버려도 된다는 뜻입니다.

 

수정후 코드(2):

import cv2
import numpy as np

Gray = cv2.imread('./assets/images/siba.jpg', 0)
cv2.imshow("Gray image", Gray)

kernel = 1/9*np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]])
Gray = cv2.filter2D(Gray, -1, kernel)

cv2.imshow("filtered image", Gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

근데 그러면 왜 cv2.imread()로 읽을때 바로 그레이스케일로 읽게 되는 걸까요? 그건 cv2.imread()에 있는 설정 때문입니다. 바로 cv2.imread()의 함수 정의를 보면 총 두개의

 

참고링크:

https://answers.opencv.org/question/220955/invalid-number-of-channels-in-input-image-vscncontainsscn-scn-is-1/

 

Invalid number of channels in input image: 'VScn::contains(scn)' 'scn' is 1 [closed] - OpenCV Q&A Forum

Invalid number of channels in input image: 'VScn::contains(scn)' 'scn' is 1 [closed] edit This is error: terminate called after throwing an instance of 'cv::Exception' what(): OpenCV(4.1.2-dev) /home/ztftrue/Downloads/opencv/modules/imgproc/src/color.simd_

answers.opencv.org

 

 

긴글 읽어주셔서 감사합니다:):)

 

 

댓글