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

一.问题复现

1.代码

#! /usr/bin/env python
# -*- coding: utf-8 -*-

# File: show_img.py

import 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.py

import cv2
import numpy as np
from PIL import Image
import os


def 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_bgr


def 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:
        None

    Raises:
        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()可以保存图片





在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单好用的文本识别方法--付费的好用,免费的更有性价比

文章目录 先说付费的进入真题&#xff0c;免费的来喏&#xff01;PixPin微信 先说付费的 直达网址!!! 进入真题&#xff0c;免费的来喏&#xff01; PixPin 商店里就有 使用示例&#xff1a; 可以看到&#xff1a;贴在桌面上的图片可以复制图片中的文字&#xff0c;真的很…

第一篇【传奇开心果系列】Python的跨平台开发工具beeware技术点案例示例:使用beeware实现跨平台开发,从hello world开始

传奇开心果博文系列 系列博文目录Python的跨平台开发工具beeware技术点案例示例系列 博文目录前言一、BeeWare套件主要功能介绍二、Toga相对于其他Python UI库具有的优势介绍三、使用toga开发安卓手机应用hello world步骤和示例代码四、使用toga写一个iOS 苹果手机应用hello wo…

红蓝对抗-HW红蓝队基本知识(网络安全学习路线笔记)

第一, 什么是蓝队 蓝队&#xff0c;一般是指网络实战攻防演习中的攻击一方。 蓝队一般会采用针对目标单位的从业人员&#xff0c;以及目标系统所在网络内的软件、硬件设备同时执行多角度、全方位、对抗性的混合式模拟攻击手段&#xff1b;通过技术手段实现系统提权、控制业务、…

高速数据采集与传输(一):ADC08D500调研

前言&#xff1a;高速ADC数据采集的应用和开发&#xff0c;涉及的技术面非常的广泛&#xff0c;后续阶段博主将尝试以纯项目开发的形式做一次专题技术分享&#xff0c;将基于高速数据采集的相关内容进行一系列的技术文档更新。博主全凭兴趣在更新和总结&#xff0c;很难做到一直…

unity开发Hololens 制作滑动框

一定要做到最后一步&#xff0c;才会有效果 1、创建空物体 ,并添加组件 创建空物体 命名ScrollingObjectCollection&#xff0c; 添加组件如下图 下面是各个组件展开的内容 2、在ScrollingObjectCollection 下面创建两个空物体&#xff0c;分别命名Container、Clipping…

[AI Google] 介绍 VideoFX,以及 ImageFX 和 MusicFX 的新功能

VideoFX 是来自 labs.google 的最新实验&#xff0c;您可以查看音乐效果和图像效果的新更新&#xff0c;现在在 110 多个国家可用。 生成式媒体正在改变人们构思创意并增强我们的创造力能力的方式。我们致力于与创作者和艺术家合作构建人工智能&#xff0c;以更好地理解这些生成…

C++第三方库 【HTTP/HTTPS】— httplib库

目录 认识httplib库 安装httplib库 httplib的使用 httplib请求类 httplib响应类 Server类 Client类 httplib库搭建简单服务器&客户端 认识httplib库 httplib库&#xff0c;是一个C11单头文件的&#xff0c;轻量级的跨平台HTTP/HTTPS库&#xff0c;可以用来创建简单的…

软件设计师干货资料分享

从2月份备考&#xff0c;到5月份结束&#xff0c;满打满算四个月准备时间。在此我想提醒一句&#xff0c;世界上没有什么不劳而获的事情&#xff0c;never&#xff0c;只要你是一个普通人&#xff0c;但凡你想索取一些什么&#xff0c;无一例外你都需要付出&#xff0c;而且是踏…

【每日力扣】84. 柱状图中最大的矩形 与 295. 数据流的中位数

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为…

Linux操作指令大全

目录 &#x1f349;引言 &#x1f349; 基础命令 &#x1f348;pwd &#x1f348;cd &#x1f348;ls &#x1f348;mkdir &#x1f348;rmdir &#x1f348;cp &#x1f348;mv &#x1f348;rm &#x1f349; 文件操作命令 &#x1f348;cat &#x1f348;tac …

CentOS 7.9安装NVIDIA P40显卡驱动、CUDA和cuDNN

文章目录 1、安装P40显卡驱动1.1 查看机器上有哪些显卡1.2 禁用nouveau1.3 安装依赖1.4 安装驱动 2、安装CUDA2.1 安装2.2 测试是否安装成功 3、安装cuDNN3.1 安装3.2 测试是否安装成功 4、总结 1、安装P40显卡驱动 1.1 查看机器上有哪些显卡 lspci | grep -i vga lspci | gr…

《欢乐钓鱼大师》辅助:新手钓鱼全新攻略大全!

《欢乐钓鱼大师》是一款充满趣味和挑战的钓鱼游戏。在游戏中&#xff0c;玩家不仅可以体验钓鱼的乐趣&#xff0c;还可以通过不同的钓鱼竿和鱼卡来提升自己的钓鱼技能。为了帮助新手和老玩家更好地体验游戏&#xff0c;本文将为您提供详细的游戏攻略。 1. 游戏目标 在《欢乐钓…

2024年蓝桥杯Web开发【大赛大纲】15届

一、 组别 Web应用开发分为&#xff1a;大学组和职业院校组。 每位选手只能申请参加其中一个组别的竞赛。各个组别单独评奖。 研究生和本科生只能报大学组。 其它高职高专院校可自行选择报任意组别。 二. 竞赛赛程 省赛时长&#xff1a;4小时。 决赛时长&#xff1a;4小…

c语言——宏offsetof

1.介绍 &#xff01;&#xff01;&#xff01; offsetof 是一个宏 2.使用举例 结构体章节的计算结构体占多少字节需要先掌握&#xff08;本人博客结构体篇章中已经讲解过&#xff09; 计算结构体中某变量相对于首地址的偏移&#xff0c;并给出说明 首先&#xff0c;结构体首个…

SpringBoot项目中redis序列化和反序列化LocalDateTime失败

实体类中包含了LocalDateTime 类型的属性&#xff0c;把实体类数据存入Redis后变成这样&#xff1a; 此时&#xff0c;存入redis不会报错&#xff0c;但是从redis获取的时候&#xff0c;会报错&#xff1a; com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Ca…

[7] CUDA之常量内存与纹理内存

CUDA之常量内存与纹理内存 1. 常量内存 NVIDIA GPU卡从逻辑上对用户提供了 64KB 的常量内存空间&#xff0c;可以用来存储内核执行期间所需要的恒定数据常量内存对一些特定情况下的小数据量的访问具有相比全局内存的额外优势&#xff0c;使用常量内存也一定程序上减少了对全局…

项目日记(1): boost搜索引擎

目录 1. 项目相关背景 2. 搜索引擎的相关宏原理 3. 搜索引擎的技术栈和项目环境 4. 正排索引, 倒排索引, 搜索引擎具体原理 5. 编写数据去标签化和数据清洗的模块parser(解析器). 1.项目相关背景 百度, 搜狗, 360等都有搜索引擎, 但是都是全网的搜索; boost是进行站内搜索…

深入理解 Spring 上下文(Context)层次结构

前言 在使用 Spring 框架进行应用程序开发时&#xff0c;Spring 上下文&#xff08;Context&#xff09;是一个非常重要的概念。Spring 上下文提供了一个环境&#xff0c;用于管理应用程序中的对象&#xff08;通常称为 Bean&#xff09;及其之间的依赖关系。在复杂的应用程序…

大模型效能工具之智能CommitMessage

01 背景 随着大型语言模型的迅猛增长&#xff0c;各种模型在各个领域的应用如雨后春笋般迅速涌现。在研发全流程的效能方面&#xff0c;也出现了一系列贯穿全流程的提效和质量工具&#xff0c;比如针对成本较高的Oncall&#xff0c;首先出现了高质量的RAG助手&#xff1b;在开…

【二叉树】:LeetCode:100.相同的数(分治)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;初阶初阶结构刷题 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 1.问题描述&#xff1a; 2.问题分析&#xff1a; 二叉树是区分结构的&#xff0c;即左右子树是不一…