2021-01-08 13:41:13

cv2.imread 한글 경로 인식 문제 해결법

opencv 라이브러리의 cv2.imread 함수를 사용할 때 이미지 파일의 경로에 한글이 있는 경우에 제대로 읽어내지 못합니다. 다음 코드를 실행하면 에러가 뜹니다. 

 

1
2
3
4
5
6
7
8
9
10
11
import cv2
 
path = 'D:/티스토리/티스토리 포스팅/python/cv2.imread 한글 파일 경로 인식 실패 문제 해결 방법'
img_name = '교훈.jpg'
full_path = path + '/' +img_name
 
img = cv2.imread(full_path, cv2.IMREAD_COLOR)
 
cv2.imshow('이미지', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cs

 

 

imshow 부분에서 뭔가 에러가 났다고 하는데, 근본적인 원인은 imread가 잘 안되었기 때문입니다. 다음과 같이 이미지의 Type이 NoneType인 상태입니다. 한글 경로로 인해 흔히 발생하는 문제입니다. 

 

 

이 문제를 해결하기 위해서는 위 코드를 다음과 같이 변경해주면 됩니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import cv2
import numpy as np
 
path = 'D:/티스토리/티스토리 포스팅/python/cv2.imread 한글 파일 경로 인식 실패 문제 해결 방법'
img_name = '교훈.jpg'
full_path = path + '/' +img_name
 
img_array = np.fromfile(full_path, np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
 
cv2.imshow('test', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cs

 

위 코드를 간략히 설명하자면, 이미지를 cv2.imread로 바로 읽는 대신 np.fromfile 함수를 이용해서 바이너리 데이터를 넘파이 행렬로 읽습니다. 그 다음에 cv2.imdecode 함수로 복호화해줌을 통해 opencv에서 사용할 수 있는 형태로 바꿔줍니다. 

 

 

변경된 코드를 실행하면 이미지를 잘 읽어내서 잘 보여줍니다. 

 

 

cv2.imwrite 한글 경로 인식 문제 해결법

imread로 읽는 것도 문제지만, imwrite로 쓸 때도 한글이 포함된 경로라면 문제를 일으킵니다. 다음 코드를 실행하면 에러 메시지는 뜨지 않지만, 해당 폴더에 "교훈_그레이스케일.jpg"라는 이미지 파일이 저장되어 있지 않습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import cv2
import numpy as np
 
path = 'D:/티스토리/티스토리 포스팅/python/cv2.imread 한글 파일 경로 인식 실패 문제 해결 방법'
img_name = '교훈.jpg'
full_path = path + '/' +img_name
 
img_array = np.fromfile(full_path, np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
 
grayscale_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
cv2.imwrite('./교훈_그레이스케일.jpg', grayscale_img)
cs

 

이것 역시 코드의 수정이 필요합니다. 아까는 디코딩이 필요했다면, 이번에는 인코딩이 필요합니다. 인코딩한 것을 바이너리 파일로 써줍니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2
import numpy as np
import os
 
path = 'D:/티스토리/티스토리 포스팅/python/cv2.imread 한글 파일 경로 인식 실패 문제 해결 방법'
img_name = '교훈.jpg'
full_path = path + '/' +img_name
 
img_array = np.fromfile(full_path, np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
 
grayscale_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
new_img_name = '교훈_그레이스케일.jpg'
 
extension = os.path.splitext(new_img_name)[1# 이미지 확장자
 
result, encoded_img = cv2.imencode(extension, grayscale_img)
 
if result:
    with open(new_img_name, mode='w+b'as f:
        encoded_img.tofile(f)
cs

 

이 코드를 실행하면 다음과 같이 이미지 파일명을 한글로 했음에도 이미지가 잘 저장된 것을 확인하실 수 있습니다.