1 분 소요

imread() 또는 imresize 에러

test_image

위와 같은 에러가 cv2를 사용할 때 나오게 된다. 이유가 생기는 것은 간단하다.

test_debug

디버그를 해주면 답이 나오는데 이는 cv2 이미지를 읽는 과정에서 생기는 에러로 Nonetype이라고 빈 값으로 들어오기 때문이다.
문제를 해결하기 위해서는 해당 이미지 1개를 지정해서 cv2.imread("test.jpg") 와 같이 ‘‘가 아닌 ““의 문자열로 지정해서 해결해주면 된다.

하지만 나처럼 여러 개의 이미지를 불러와야하는 경우 해당 값을 처음부터 numpy array로 불러와주면 해결된다.

이미지 numpy array로 불러오기

  • 이미지가 1개인 경우
import numpy as np
import cv2

# 이미지가 1개인 경우
test_img = input("여기에 이미지 주소를 넣어주세요")
image = open(test_img, 'rb')
image_bytes = bytearray(image.read())
image_array = np.asarray(image_bytes, dtype=np.uint8)
test_image = cv2.imdecode(image_array, cv2.IMREAD_UNCHANGED)
resize_image = cv2.resize(test_image, (180, 180))
  • 이미지가 여러개인 경우
import numpy as np
import cv2

# 이미지가 여러개인 경우
test_imgs = input("여기에 이미지들 주소를 넣어주세요")

for test_img in test_imgs:
    image = open(test_img)
    image_bytes = bytearray(image.read())
    image_array = np.asarray(image_bytes, dtype=np.uint8)
    test_image = cv2.imdecode(image_array, cv2.IMREAD_UNCHANGED)
    resize_image = cv2.resize(test_image, (180, 180))

이런 현상이 일어나는 이유

CV2의 imread 또는 imresize는 이미지를 바이너리 형태(또는 Byte 단위)로 읽은 다음 jpg로 디코딩하는 방법을 이용하여 해당 오류를 해결한 케이스이다.

보통 이미지를 읽어오게 되면 해당 이미지의 화소 행 또는 열 좌표를 통해서 이미지를 저장하게 되고 그것을 스케일화로 우리에게 보여주게 된다.
그래서 정상적으로 불러온 이미지의 shape를 확인하면 (1,2,3) 과 같이 열의 수, 행의 수, 채널 수(또는 색상의 수)와 같은 배열 속성 값을 얻을 수 있다. 그리고 위의 코드에서 해결할 때 dtype=np.uint8을 사용했는데 이는 이미지 데이터형이 uint8로 저장되기 때문에 이를 디코딩하기 위해서 옵션을 지정해주는 것이다.

OpenCV에서 가장 많은 오류가 디버깅시 맞지 않는 데이터형으로 인해서 발생한다.