OpenCV不支持中文路径的解决方法

一波操作猛如虎:

img_gbr = cv2.imread(img_path)
img = cv2.cvtColor(img_gbr, cv2.COLOR_BGR2RGB)

输出直接红一片:

[ WARN:0@3.382] global loadsave.cpp:248 cv::findDecoder imread_('input\阿洛娜\arona.jpg'): can't open/read file: check file path/integrity



    img = cv2.cvtColor(img_gbr, cv2.COLOR_BGR2RGB)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cv2.error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.cpp:196: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

这是因为OpenCV遇到了中文路径,为什么不支持的原因我暂时不知道。

解决方法:

改为:

img_gbr = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), -1)
img = cv2.cvtColor(img_gbr, cv2.COLOR_BGR2RGB)

解释:

np.fromfile 函数用于从文件中读取数据并将其转换为 NumPy
### OpenCV 处理中文路径问题的解决方案 OpenCV 的 `cv2.imread` 函数默认不支持读取带有中文字符的文件路径。这是因为底层函数依赖于 C++ 实现,而标准 C++ 文件 I/O 并未设计为兼容 UTF-8 路径编码。因此,在 Python 中使用 OpenCV 时,需要通过替代方法解决这个问题。 以下是具体的解决方案及其说明: --- #### 替代方法:使用 `numpy` 和 `cv2.imdecode` 可以通过组合 `numpy.fromfile` 和 `cv2.imdecode` 来实现对中文路径的支持。这种方法的核心在于利用 NumPy 提供的更灵活的文件读取能力,绕过 OpenCV路径解析的限制。 ##### 示例代码 ```python import cv2 import numpy as np def imread_chinese_path(img_path): """ 支持读取包含中文路径的图片。 参数: img_path (str): 图片路径,可以包含中文字符 返回: ndarray: 图像数据矩阵 """ with open(img_path, 'rb') as f: data = f.read() nparr = np.frombuffer(data, dtype=np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) # IMREAD_COLOR 表示以 BGR 形式读取 return img # 测试读取中文路径图片 img_path = r"./测试/彩色图像.tiff" img = imread_chinese_path(img_path) if img is not None: print("成功读取图片!") else: print("无法读取图片,请检查路径是否正确。") ``` 上述代码中,`np.frombuffer` 将二进制流转换为 NumPy 数组,随后传递给 `cv2.imdecode` 完成解码过程[^1]。 --- #### 自定义保存函数:支持中文路径 同样地,当需要保存图片到含有中文字符的路径时,也需要采取类似的策略。具体来说,可以结合 `cv2.imencode` 和 `.tofile` 方法来完成。 ##### 示例代码 ```python def imwrite_chinese_path(output_path, img): """ 支持将图片保存至包含中文字符的路径。 参数: output_path (str): 输出路径,可以包含中文字符 img (ndarray): 待保存的图像数据矩阵 """ ext = output_path[output_path.rfind('.'):] # 获取文件扩展名 result, n = cv2.imencode(ext, img) # 编码为特定格式 if result: with open(output_path, "wb") as f: n.tofile(f) # 使用 tofile 方法写入文件 print("图片已成功保存至:", output_path) else: print("图片编码失败!") # 测试保存中文路径图片 out_path = "./测试/输出图像.tiff" imwrite_chinese_path(out_path, img) ``` 这里的关键是使用 `cv2.imencode` 将图像数据编码为目标格式(如 TIFF),再通过 `.tofile` 方法将其写入目标路径[^4]。 --- #### 验证两种方式的一致性 为了验证 `cv2.imdecode` 和 `cv2.imread` 是否一致,可以比较两者的像素值或颜色通道分布。以下是一个简单实验: ##### 示例代码 ```python import cv2 import numpy as np # 使用传统方法读取英文路径图片 img1 = cv2.imread("./color.tiff") # 使用改进方法读取相同图片 with open("./color.tiff", "rb") as f: data = f.read() nparr = np.frombuffer(data, dtype=np.uint8) img2 = cv2.imdecode(nparr, cv2.IMREAD_COLOR) # 检查一致性 print("两张图片是否完全一致?", np.array_equal(img1, img2)) ``` 如果返回结果为 `True`,则表明这两种方法在功能上是一致的[^2]。 --- ### 总结 针对 OpenCV 默认不支持中文路径的问题,推荐使用 `numpy.fromfile` 结合 `cv2.imdecode` 的方式进行图片读取;对于保存操作,则建议采用 `cv2.imencode` 和 `.tofile` 的组合形式。这些方法不仅解决路径兼容性问题,还保持了与原有 API 的行为一致性。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值