[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'
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
# 출력
# 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(img, cv2.COLOR_BGR2GRAY))
cv2.waitKey()
# 출력
# 흑백 고양이 이미지 사진
img_path = "D:/Animal Pictures/cat.jpg"
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
cv2.imshow("src", cv2.cvtColor(img, cv2.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'
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()
# 출력
# 흑백 고양이 이미지 사진
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 합니다.
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]
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
댓글
댓글 쓰기