[opencv-python] error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'



!_src.empty() in function 'cv::cvtColor' 해결법



imread는 이미지를 제대로 읽어오지 못할 경우 None을 반환합니다. [1]

1. File Path 확인 [2]

아래와 같은 에러가 발생하는 원인은 이미지를 제대로 불러오지 못했기 때문입니다.

import cv2

img_path = "D:/Animal Picture/cat.jpg" 
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
cv2.imshow("src", cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
cv2.waitKey()

# 출력
# error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'


cv2.imread 과정에서 이미지를 제대로 읽어왔는지 확인해보면
아래와 같이 None값을 가져옵니다.

print(img)

# 출력
# None

img None인 경우에는 대부분의 경우 File Path를 잘못 지정했기 때문입니다.
내가 읽고자 하는 파일의 경로를 제대로 입력했는지 확인해보시기 바랍니다.


File Path: Animal Picture -> Animal Pictures 수정

import cv2

img_path = "D:/Animal Pictures/cat.jpg"
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
cv2.imshow("src"cv2.cvtColor(imgcv2.COLOR_BGR2GRAY))
cv2.waitKey()

# 출력
# 흑백 고양이 이미지 사진



2. 한글 File Path 사용

아래와 같이 제대로 된 File Path를 사용해도 한글이 들어가 있으면 에러가 발생합니다.

import cv2

img_path = "D:/동물 사진/cat.jpg"
hangul_img = cv2.imread(img_path, cv2.IMREAD_COLOR) 
cv2.imshow("hangul_img", cv2.cvtColor(hangul_img, cv2.COLOR_BGR2GRAY))
cv2.waitKey()

# 출력
# error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

python에서는 unicode를 지원하지만
OpenCV imread가 직접적으로 unicode 경로를 다루지 못하기에 한글이 들어가면 Path 인식을 제대로하지 못해 None을 반환합니다.

아래와 같이 프로그래밍하면 unicode 경로의 이미지를 읽어올 수 있습니다. [3, 4]

import cv2
import numpy as np

def  imread_hangul_path(path):
    with open(path, "rb") as fp:
        bytes = bytearray(fp.read())
        numpy_array = np.asarray(bytes, dtype=np.uint8)
    return cv2.imdecode(numpy_array, cv2.IMREAD_UNCHANGED)

img_path = "D:/동물 사진/cat.jpg"
hangul_img = imread_hangul_path(img_path) 
cv2.imshow("hangul_img", cv2.cvtColor(hangul_img, cv2.COLOR_BGR2GRAY))
cv2.waitKey()

# 출력
# 흑백 고양이 이미지 사진

1. open 함수는 unicode를 지원하기 때문에 open 함수를 이용해 File을 fp로 읽습니다.
2. fp는 _io.BufferedReader class이기 때문에 이를 bytearray로 형변환합니다.
3. bytearray를 numpyArray로 바꾸어줍니다. 이 때 array 값을 uint8 형식으로 지정합니다.
4. numpyArray를 decode 합니다.

아래의 코드를 보면 cv2 imread로 읽어온 값과 imread_hangul로 읽어온 값이 동일한걸 확인할 수 있습니다.

img_path = "D:/동물 사진/cat.jpg"
hangul_img = imread_hangul_path(img_path)
print("hangule shape = {0}, dtype = {1} [0][0][:] = {2}".format(hangul_img.shape, hangul_img.dtype, hangul_img[0][0][:]))

img_path = "D:/Animal Pictures/cat.jpg"i
mg = cv2.imread(img_path, cv2.IMREAD_COLOR)
print("img shape = {0}, dtype = {1} [0][0][:] = {2}".format(img.shape, img.dtype, img[0][0][:]))

# 출력
# hangule shape = (256, 256, 3), dtype = uint8 [0][0][:] = [183 186 190]
# img shape      = (256, 256, 3), dtype = uint8 [0][0][:] = [183 186 190]


참고문헌

[1]  https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html [2]  https://stackoverflow.com/questions/52676020/opencv-src-empty-in-function-cvtcolor-error
[3]  https://zzdd1558.tistory.com/228
[4]  https://stackoverflow.com/questions/43185605/how-do-i-read-an-image-from-a-path-with-unicode-characters

댓글

이 블로그의 인기 게시물

[opencv-python] 이미지 크기조절(resize) 하는 법

[python]파이썬: csv reader header skip (첫번째 행 무시하기, 안읽기)

[python] selenium close와 quit 차이점