본문 바로가기
Python

[Python] OpenCV를 이용한 imread중 image 한글파일 경로 입력시 문제와 해결방안.

by 신입같은 3년차 2018. 11. 29.

저는 Mac OS OpenCV와 python 개발 환경에서 영상 프로그래밍 개발을 하고있습니다 .


MacOS에서 작업을 끝내고 해당 윈도우 OS가 올라가 있는 랩탑에서 확인하는 도중 에러가 발생하여 확인해보니 한글이 포함된 파일경로에 대한 이미지 파일을 읽지 못하여 발생하는 에러였습니다.


혹시나 하여 같은 소스를 다른 OS환경에서만 돌려보니 Mac에서는 동작하고 Windows에서는 동작하지 않아서 자료를 찾아보다 해결방안을 찾았습니다 .

지금부터 그 해결방안을 알아보도록 하겠습니다 . 


기존 Mac OS에서 cv2를 통해 이미지를 불러오는 작업입니다 .


import pickle
import cv2
import numpy as np
import platform

if __name__ == '__main__':
    # OS Platform 정보
    print(platform.platform())

    filePath = "./최윤진.jpg"
    img = cv2.imread(filePath , cv2.COLOR_RGB2GRAY)
    print(img.shape) // 결과 출력 :  (480 , 640 , 3) - width 640 , height 480에 RGB 3채널로 받았다는 내용입니다.



위의 소스를 Windows에서 돌리면 print(img)가 None인것을 확인할 수 있습니다 .

그럼 한글경로를 어떻게 처리해야할까요 stackoverflow에 해당 관련 내용으로된 내용을 볼 수 있었습니다  

다음 링크를 참고하시면됩니다 - https://stackoverflow.com/questions/43185605/how-do-i-read-an-image-from-a-path-with-unicode-characters

하지만 귀찮아 하시는 분들이 있을 수 있기 때문에 그대로 구현해보도록 하겠습니다 .


import pickle
import cv2
import numpy as np
import platform

def hangulFilePathImageRead ( filePath ) :

    stream = open( filePath.encode("utf-8") , "rb")
    bytes = bytearray(stream.read())
    numpyArray = np.asarray(bytes, dtype=np.uint8)

    return cv2.imdecode(numpyArray , cv2.IMREAD_UNCHANGED)


if __name__ == '__main__':
    # OS Platform 정보
    print(platform.platform())

    filePath = "./최윤진.jpg"

    fileData = hangulFilePathImageRead(filePath)
    print(fileData)



저는 제맘대로 함수명이 hangulFilePathImageRead라는 filePath를 매개변수로 전달받을 수 있는 함수를 만들었습니다.

함수의 코드는 다음과 같습니다.

1. open() 함수를 통해 filePath를 encoding한 파일을 바이트로 읽습니다. (open은 unicode를 지원한다 )
2. bytearray타입으로 바이트를 읽습니다.
3. numpy array를 통해 bytearray를 numpy array로 convert해줍니다.
그다음 image를 cv2.imdecode를 통해 decode를 하면 mac에서 imread를 통해 읽었던 결과와 같은 값을 받을 수 있다.

해결 끝


반응형

댓글