cv2读取有中文路径的图片(python)

本示例针对python。

问题:

通常的使用中,是img = cv2.imread(path),如果文件的路径中包含有中文,则会报错,如下的程序中:
img = cv2.imread(pic)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

报错:cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
在这里插入图片描述

解决方法:

这里不直接读取图片。而是先采用了用numpy中的fromfile读取文件,将图片按照int类型读入数据,读入的是一维数组,
然后通过cv中imdecode来对数组解码得到图片,
imdecode函数的作用是从内存缓冲区中读取图像,如果缓冲区太短或包含无效数据时,函数返回一个空矩阵(Mat::data==NULL)。
如果是彩色图像,解码后的图像将按照B G R顺序存储通道。
这函数有两个参数imdecode(buf, flags)
buf是输入数组或字节向量
flags 与cv::imread相同的flag,
cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。
cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。
cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1

示例:实验下面的方法可以,且不论文件名和路径中是否存在中文均可。

img = cv2.imdecode(np.fromfile(os.path.join(img_path, fname), dtype=np.uint8), cv2.IMREAD_COLOR)

此处img_path是文件路径,fname是文件名,flag用的和cv2.imread函数默认一样的标志 cv2.IMREAD_COLOR,也可以写成1。
这句替换得是
img = cv2.imread(os.path.join(img_path, fname)),主要就是利用numpy的fromfile函数在读取文件时,路径不受中文影响来实现的。

你可能感兴趣的:(cv2读取有中文路径的图片(python))