使OpenCV可以读取中文路径图片的方法

一.问题复现

1.代码

#! /usr/bin/env python
# -*- coding: utf-8 -*-# File: show_img.pyimport cv2# 读取图片
img = cv2.imread("车牌素材/冀A.png")# 显示图片
cv2.imshow("img", img)
cv2.waitKey(0)

2.报错截图

在这里插入图片描述

3.报错内容

[ WARN:0@0.057] global loadsave.cpp:248 cv::findDecoder imread_(‘***’): can’t open/read file: check file path/integrity
Traceback (most recent call last):
File “***”, line 7, in <module>
cv2.imshow(“img”, img)
cv2.error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:971: error: (-215:Assertion failed) size.width>0 && size.height>0 in function ‘cv::imshow’

二.解决方法

1.代码

#! /usr/bin/env python
# -*- coding: utf-8 -*-# File: show_img_with_CNpath.pyimport cv2
import numpy as np
from PIL import Image
import osdef cv_imread(file_path: str):"""使用PIL读取一张图片并转换成OpenCV格式, 从而支持读取中文路径的图片。Args:file_path (str): 图片文件的路径。这个路径可以包含中文字符, 因为PIL库能够正确处理Unicode字符串。Returns:np.ndarray: 转换后的OpenCV格式的图像数据, 形状为(H, W, C), 数据类型为np.uint8。其中H代表图像的高度, W代表图像的宽度, C代表图像的通道数( 对于彩色图像通常是3 )。OpenCV中图像的颜色通道顺序是BGR( 蓝-绿-红 ), 与PIL的RGB( 红-绿-蓝 )不同。Raises:IOError: 如果文件无法打开或读取, 将抛出IOError异常。流程说明:1. 使用PIL库的Image.open()函数打开指定路径的图片文件。PIL库能够正确处理包含中文的文件路径。2. 将PIL图像对象转换为NumPy数组。PIL图像对象本质上是一个NumPy数组, 所以这一步是直接转换。3. 使用OpenCV库的cvtColor()函数将图像从RGB颜色空间转换为BGR颜色空间。这是因为OpenCV默认使用BGR格式,而PIL和其他图像处理库通常使用RGB格式。4. 返回转换后的NumPy数组, 这个数组现在可以被OpenCV函数直接使用。注意:- 确保已经安装了Pillow和OpenCV库, 可以通过pip安装: `pip install Pillow opencv-python`。- 该函数假设输入的图片是RGB格式。如果图片是灰度图或其他格式, 可能需要额外的处理步骤。- 在使用该函数之前, 确保`cv2`和`Image`模块已经被正确导入。"""# 使用PIL打开图片文件img = Image.open(file_path)# 将PIL图像转换为NumPy数组( RGB格式 )cv_img_rgb = np.array(img)# 使用OpenCV将RGB格式的NumPy数组转换为BGR格式cv_img_bgr = cv2.cvtColor(cv_img_rgb, cv2.COLOR_RGB2BGR)# 返回转换后的BGR格式的NumPy数组return cv_img_bgrdef cv_imwrite(file_path: str, img: cv2.typing.MatLike):"""使用OpenCV将图像写入指定的文件路径, 支持中文路径。Args:file_path (str): 要保存图像的文件路径。这个路径可以包含中文字符。img (np.ndarray): 要保存的图像数据, 应该是一个OpenCV格式的NumPy数组, 形状为(H, W, C),其中H是高度, W是宽度, C是通道数。数据类型应该是np.uint8。Returns:NoneRaises:ValueError: 如果图像数据不是NumPy数组或者数据类型不正确。流程说明:1. 使用os.path.splitext()函数从文件路径中提取文件扩展名。2. 使用cv2.imencode()函数对图像进行编码。这个函数接受文件扩展名和图像数组作为参数,并返回一个包含编码图像数据的元组。3. 通过索引[1]获取cv2.imencode()返回的元组中的图像数据部分。4. 使用tofile()方法将编码后的图像数据写入指定的文件路径。如果文件已存在, 将被覆盖。注意:- 确保已经安装了OpenCV库。- 该函数假设输入的图像数据是OpenCV格式的NumPy数组, 并且数据类型为np.uint8。- 如果文件路径包含中文字符, 该函数应该能够正确处理。- 如果保存过程中发生任何错误(如文件写入权限问题), 将抛出异常。"""# 从文件路径中提取文件扩展名extension = os.path.splitext(file_path)[1]# 使用OpenCV的imencode函数对图像进行编码# 注意: extension包括点(.), 例如 '.jpg' 而不是 'jpg'# 编码后的图像数据将根据文件扩展名自动选择正确的格式encoded_img = cv2.imencode(extension, img)[1]# 将编码后的图像数据写入文件encoded_img.tofile(file_path)# 读取图片
img = cv_imread("车牌素材/冀A.png")# 显示图片
cv2.imshow("img", img)
cv2.waitKey(0)# 保存图片
cv_imwrite("车牌素材/冀A_保存.png", img)

三.其他

使用cv2.imdecode()配合np.fromfile()并不能读取中文路径的图片,但是使用cv2.imencode()可以保存图片





在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣题解记录

三元组队列、取出元组中的元素&#xff1a;腐烂的橘子

ISCC——AI

得到一个T4.pyc 回编译一下 得到下面代码 import base64def encrypt_and_compare(user_input, offset_str, target_base64):if len(user_input) ! 24:return Please enter a string with a length of 24encrypted Nonefor i, char in enumerate(user_input):offset int(off…

axios的配置项及含义

axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js。它有许多配置项可以自定义 HTTP 请求。以下列举 axios 中的五个常用配置项及其含义&#xff0c;并提供示例代码&#xff1a; 1. method 含义&#xff1a;指定请求方法&#xff08;例如 GET, POST,…

基于 Windows 的记事本简单功能开发及部署发布--迭代2.1

基于上篇文章基于 Windows 的记事本简单功能开发及部署发布--迭代2.0-CSDN博客 更新完成以下功能点&#xff1a; 1.更新字体到json文件中&#xff0c;下次打开应用能够继续生效。

Unity开发——XLua热更新之Hotfix配置(包含xlua获取与导入)

一、Git上获取xlua 最新的xlua包&#xff0c;下载地址链接&#xff1a;https://github.com/Tencent/xLua 二、Unity添加xlua 解压xlua压缩包后&#xff0c;将xlua里的Assets里的文件直接复制进Unity的Assets文件夹下。 成功导入后&#xff0c;unity工具栏会出现xlua选项。 …

到底该用英文括号还是中文括号?

这篇博客写的还挺详细的&#xff0c;不错。

TCP/IP协议族

基于这张图片的一篇blog TCP/IP模型通常被分为四个层次&#xff1a;应用层、传输层、网络层和网络接口层。在这个模型中&#xff0c;不同的网络协议负责完成不同的任务&#xff0c;以确保数据可以在网络中高效、可靠地传输。以下是对这张图中每个协议的解释&#xff1a; 应用层…

Tensorflow2.0笔记 - AutoEncoder做FashionMnist数据集训练

本笔记记录自编码器做FashionMnist数据集训练&#xff0c;关于autoencoder的原理&#xff0c;请自行百度。 import os import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics, …

Nature子刊 | 首个 双语脑机接口设备能解码西班牙语和英语单词

大脑植入装置首次帮助一名无法用语言表达的双语人士用两种语言进行交流。与大脑植入体相连的AI系统可以实时解码该人试图用西班牙语或英语表达的意思。 这项研究结果发表在5月20日的《Nature Biomedical Engineering》杂志上&#xff0c;让人们深入了解了我们的大脑是如何处理语…

使用printf的两种方法,解决printf不能使用的问题

使用printf的两种方法&#xff0c;解决printf不能使用的问题 一、微库法 我们使用printf前要加上重定向fputc //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)0);//循环发送,直到发送完毕 USART1->DR (uint8_t) ch; return…

结构型设计模式之装饰模式

文章目录 概述装饰模式原理代码案例小结 概述 装饰模式(decorator pattern) 的原始定义是&#xff1a;动态的给一个对象添加一些额外的职责. 就扩展功能而言,装饰器模式提供了一种比使用子类更加灵活的替代方案。 装饰模式原理 装饰模式中的角色&#xff1a; 抽象构件角色 …

高精度定位平板主要应用在哪些领域

高精度定位平板是一种集成了高精度定位技术和强大计算能力的设备&#xff0c;能够提供亚米级甚至厘米级的定位精度。其应用领域广泛&#xff0c;涵盖测绘、精准农业、工程建设、地理信息系统&#xff08;GIS&#xff09;、公共安全等多个方面。这种设备凭借其高精度和耐用性&am…

设置MySQL like查询时不区分大小写

背景介绍 MySQL like查看结果出现了区分大小写的情况&#xff0c;实际需求是查询的时候不去区分大小写&#xff01; 原因 MySQL的LIKE查询默认情况下是不区分大小写的。如果LIKE查询是区分大小写的&#xff0c;是因为列使用了区分大小写的字符集或校对规则。 解决办法 在l…

2024年上半年系统架构设计师真题(部分考场回忆版)

一、综合知识 1.常见的ADL语言&#xff0c;四个中选三个 2.EAI的四个层次从低到高依次是 3.反规范化设计属于数据设计的那个阶段 A.需求分析 B.概念设计 C.逻辑设计 D.物理设计 4.嵌入式往往具有实时特征&#xff0c;其典型架构 5.交换机位于OSI七层模型的那一层 6.常见…

肮脏至极的处事技巧,看懂少走十年弯路

处世技巧&#xff0c;也是肮脏至极的处事技巧&#xff0c;看懂少走十年弯路。有用的&#xff01;&#xff01;&#xff01; 1、手机响5秒再接。 2、永远提前15分钟。 3、坐领导的车&#xff0c;不要玩手机&#xff0c;只坐在副驾驶&#xff0c;不坐后排。 4、朋友给你介绍了…

深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能

深入探讨 Java 8 集合操作&#xff1a;全面解析 Stream API 的强大功能 Java 8 引入的 Stream API 使得集合操作更加简洁和高效。本文通过详细示例&#xff0c;展示如何利用 Stream API 进行各种集合操作&#xff0c;包括遍历、转换、过滤、排序、分组、去重等。 1. 遍历集合…

Spring MVC+mybatis项目入门:旅游网(四)用户注册——mybatis的配置与使用以及Spring MVC重定向

个人博客&#xff1a;Spring MVCmybatis项目入门:旅游网&#xff08;四&#xff09;用户注册2-持久化 | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代&#xff08;2024年…

使用STM32F103标准库实现自定义键盘

使用STM32F103标准库实现自定义键盘 在嵌入式系统中&#xff0c;自定义键盘的实现是一个经典的项目&#xff0c;能够帮助我们深入理解GPIO配置、按键扫描和中断处理等知识。本文将详细介绍如何使用STM32F103标准库来实现一个简单的自定义键盘。 1. 准备工作 1.1 硬件准备 S…

springboot相关知识集锦----1

一、springboot是什么&#xff1f; springboot是一个用于构建基于spring框架的独立应用程序的框架。它采用自动配置的原则&#xff0c;以减少开发人员在搭建应用方面的时间和精力。同时提升系统的可维护性和可扩展性。 二、springboot的优点 约定优于配置 版本锁定&#xf…

嵌入式0基础开始学习 ⅠC语言(9)小结补充

这一章呢&#xff0c;来讲一些之前没讲到过的一些点 1.作用域 什么是作用域&#xff1f; 一个东西(对象)起作用的范围。 变量的作用域 函数的作用域 类型的作用域 一个c语言工…