Python OpenCV 支持 Unicode

如果在 cv2 中使用 Unicode 字符串,在某些系统上会无法读取。

C++ OpenCV 可以通过对应平台的编码来解决这个问题,但是 Python OpenCV 没有这个功能。

1. 使用 NumPy 读取

import cv2
import numpy as np
 
def cv_imread(path: str, flags=cv2.IMREAD_COLOR):
    cv_img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), flags)
    return cv_img

def cv_imwrite(path: str, img: np.ndarray):
    buffer: np.ndarray = cv2.imencode('.jpg', img)[1]
    buffer.tofile(path)

2. 使用 PIL 读取

import cv2
from PIL import Image

def pli_to_cv2(img: Image.Image):
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

def cv2_to_pli(img: np.ndarray):
    return Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

def cv_imread(path: str, **kwargs):
    return pli_to_cv2(Image.open(path, **kwargs))

def cv_imwrite(path: str, img: np.ndarray):
    cv2_to_pli(img).save(path)