OpenCV 中文路径问题

在使用Python3 + OpenCV时,遇到读取/写出中文路径的图片,在使用时会遇到报错的问题。通过一个小函数即可解决,转载自知乎 冰不语 的回答,侵删。

OpenCV 中文路径问题

1 问题描述

我在Python3环境下使用OpenCV(cv2)处理图片,通过imread读取并通过imshow显示时,会出现报错,

1
2
3
4
5
img = cv2.imread(curimg_path)
cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

执行时,提示Assertion failed的报错:

1
2
3
  File "d:\Codes\ForestrySecurity\DataPreprocessing\insects500.py", line 28, in main
cv2.imshow('image',img)
cv2.error: OpenCV(3.4.2) C:\Miniconda3\conda-bld\opencv-suite_1534379934306\work\modules\highgui\src\window.cpp:356: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

imgsize的宽、高到底有没有问题呢?

事实上,我尝试输出图片尺寸img.shape

1
print("image shape: shape{0}".format(img.shape))

结果还是报错:

1
2
3
  File "d:\Codes\ForestrySecurity\DataPreprocessing\insects500.py", line 26, in main
print("image shape: shape{0}".format(img.shape))
AttributeError: 'NoneType' object has no attribute 'shape'

报错信息显示,img对象成了NoneType目标,显然,img对象的读取出现了问题,即,问题定位在imread环节。

2 解决方案

2.1 imread

经过搜索和调试验证,我发现通过一个小函数即可解决,转载自知乎 冰不语 的回答,侵删。

1
2
3
def cv_imread(file_path):
cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), -1)
return cv_img

通过numpy读取文件,再编码为cv2的图片对象,避免了OpenCV不支持中文路径的问题。

调用时,替换cv2.imread即可:

1
2
# img = cv2.imread(curimg_path)
img = cv_imread(curimg_path)

2.2 imwrite

同样地,图片输出到含有中文的路径也需要使用一个小函数:

1
2
3
def cv_imwrite(img, path):
suffix = os.path.splitext(path)[-1]
cv2.imencode(suffix, img)[1].tofile(path)

调用时,替换cv2.imwrite即可:

1
2
# cv2.imwrite(path, img)
cv2_imwrite(img, path)

3 链接

关于该问题的知乎讨论:

Python 3.x 使用 opencv 无法读取中文路径如何解决?

OpenCV官方文档:

OpenCV documentation index

Python版OpenCV的中文教程,方便易读:

OpenCV Python中文教程