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

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

### 解决方案 对于 Python 中使用 `cv2` 读取包含中文路径图片时遇到的问题,可以采用多种方法来解决这个问题。一种有效的方法是通过先将图像文件转换成字节数组再解码的方式处理。 #### 方法一:使用 PIL 库作为中间件 PIL (Python Imaging Library) 可以很好地处理各种类型的图像文件,并且能够正确解析带有特殊字符(包括中文)的路径名。之后可以通过 NumPy 数组的形式传递给 OpenCV 进行进一步操作[^1]。 ```python from PIL import Image import numpy as np import cv2 def read_image_with_pil(image_path): img = Image.open(image_path) img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) return img_cv ``` 这种方法利用了 Pillow 对于不同编码的支持能力,从而绕过了 OpenCV 的局限性。 #### 方法二:修改环境变量设置 另一种方式是在调用 `imread()` 函数之前更改系统的默认编码为 UTF-8 或者其他适合的语言环境。这通常适用于 Windows 平台下的应用开发场景下: ```python import os os.environ['OPENCV_IO_ENABLE_UTF8'] = 'true' image = cv2.imread('带中文路径.jpg') ``` 此配置使得 OpenCV 能够识别并正常加载具有 Unicode 字符集特征的目标文件位置信息[^2]。 #### 方法三:手动实现文件流读入功能 如果上述两种办法都不能满足需求,则还可以考虑直接从磁盘上获取原始数据流,然后借助 `cv2.imdecode()` 来完成整个过程: ```python import numpy as np import cv2 def imread(filename, flags=cv2.IMREAD_COLOR): with open(filename, "rb") as f: buf = f.read() nparr = np.frombuffer(buf, dtype=np.uint8) image = cv2.imdecode(nparr, flags=flags) return image if __name__ == '__main__': img = imread(r'带中文路径.png') cv2.imshow('Image', img) cv2.waitKey(0) ``` 这段代码展示了如何不依赖操作系统级别的 API 就能成功打开任意合法命名规则下的图形资源[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值