python opencv的imread方法无法读取图片问题

 更新时间:2023年08月22日 16:51:38   作者:ZXF-BW  
这篇文章主要介绍了python opencv的imread方法无法读取图片问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

python opencv的imread方法无法读取图片

读取的路径、文件名只能带有英文数字及一些特定字符,不能带有中文、日文等字符!!!

利用cv2.imread()读取文件夹中的四个图片文件:

在这里插入图片描述

在这里插入图片描述

读取’error副本.png’图片(文件名带有中文),结果为None,未能读取;

读取‘新建文件夹/error.png’图片(路径中带中文),结果为None,未能读取;

读取‘トニカクカワイイ.png’图片(文件名带日文),结果为None,未能读取;

而文件名改为英文时得到’numpy.ndarray’类型,说明成功读取。

再看展示图片操作:

在这里插入图片描述

用cv2.imshow(‘错误’, d)显示图片时,将标题设为’错误‘,但弹窗标题显示为乱码,说明是编码错误。

总结原因:

是字符编码的问题,导致cv2.imread未能找到对应图片文件。

目前找到的解决方法是修改路径和文件名为英文数字及部分特定字符。

python opencv imread()中文路径返回为空None的解决(imdecode函数的使用)

本质原因并非网上某些地方说的是中文编码UNICODE、UTF-8之类的问题,其实是python版opencv不接受NON-ASCII的中文路径,为了使用中文路径,可以借助一些其他的库。

首先介绍一种通过numpy库(毕竟这个是python中几乎最常用库之一了)的方法。

借助Numpy库

读取图像时,借助numpy库的fromfile函数先把图像文件以数据的方式读入内存,然后在内存缓冲区内用opencv提供的imdecode函数将该数据解码成图像数据,

核心代码如下:

path = r"D:\Learn4Python\中文路径\中文文件名.jpg"
dat = np.fromfile(path,dtype=np.uint8)
img = cv2.imdecode(dat,cv2.IMREAD_UNCHANGED)

写入(保存)图像时,用opencv提供的imencode函数将图像数据编码成numpy的数据,然后借助numpy的tofile函数把数据写入到路径文件,

核心代码如下:

path_zh_write = r"D:\Learn4Python\中文路径\中文文件名写入图像.jpg"
out = cv2.imencode(".jpg",img)
out[1].tofile(path_zh_write)

为了方便学习和完整理解,写了一段实验代码供大家参考

完整代码如下

import cv2
import numpy as np
#试验四种情况:路径无中文、仅文件名中文、目录和文件名均有中文、仅目录有中文
path1 = r"D:\Learn4Python\EnglishFileName.jpg"
path2 = r"D:\Learn4Python\中文文件名.jpg"
path3 = r"D:\Learn4Python\中文路径\中文文件名.jpg"
path4 = r"D:\Learn4Python\中文路径\EnglishFileName.jpg"
path_zh_write = r"D:\Learn4Python\中文路径\中文文件名写入图像.jpg"
path_en_write = r"D:\Learn4Python\EnglishFileName_writeImg.jpg"
img1 = cv2.imread(r"D:\Learn4Python\EnglishFileName.jpg")
img2 = cv2.imread(r"D:\Learn4Python\中文文件名.jpg")
img3 = cv2.imread(r"D:\Learn4Python\中文路径\中文文件名.jpg")
img4 = cv2.imread(r"D:\Learn4Python\中文路径\EnglishFileName.jpg")
#检查读取情况,结果只有路径无中文的情况读取成功
if img1 is None:
    print("img1 imread failed.")
else:
    print("img1 imread ok:",img1.shape)
if img2 is None:
    print("img2 imread failed.")
else:
    print("img2 imread ok:",img2.shape)
if img3 is None:
    print("img3 imread failed.")
else:
    print("img3 imread ok:",img3.shape)
if img4 is None:
    print("img4 imread failed.")
else:
    print("img4 imread ok:",img4.shape)
#借助numpy读取图像
dat1 = np.fromfile(path1,dtype=np.uint8)
img_d1 = cv2.imdecode(dat1,cv2.IMREAD_UNCHANGED)
dat2 = np.fromfile(path2,dtype=np.uint8)
img_d2 = cv2.imdecode(dat2,cv2.IMREAD_UNCHANGED)
dat3 = np.fromfile(path3,dtype=np.uint8)
img_d3 = cv2.imdecode(dat3,cv2.IMREAD_UNCHANGED)
dat4 = np.fromfile(path4,dtype=np.uint8)
img_d4 = cv2.imdecode(dat4,cv2.IMREAD_UNCHANGED)
#结果全部读取成功
if img_d1 is None:
    print("img_d1 imdecode failed.")
else:
    print("img_d1 imdecode ok:",img_d1.shape)
if img_d2 is None:
    print("img_d2 imdecode failed.")
else:
    print("img_d2 imdecode ok:",img_d2.shape)
if img_d3 is None:
    print("img_d3 imdecode failed.")
else:
    print("img_d3 imdecode ok:",img_d3.shape)
if img_d4 is None:
    print("img_d4 imdecode failed.")
else:
    print("img_d4 imdecode ok:",img_d4.shape)
#尝试用imwrite将图像写入文件,
#结果:无中文的路径写入成功,含中文的路径写入失败
if cv2.imwrite(path_en_write,img1):
    print("english path writing is ok!(use imwrite)")
else:
    print("english path writing is failed.(use imwrite)")
if cv2.imwrite(path_zh_write,img1):
    print("chinese path writing is ok!(use imwrite)")
else:
    print("chinese path writing is failed.(use imwrite)")
#借助numpy将图像写入含中文路径的文件,结果成功
out = cv2.imencode(".jpg",img1)
out[1].tofile(path_zh_write)
try:
    f = open(path_zh_write)
    f.close()
    print("chinese path writing is ok!(use imencode and tofile)")
except:
    print("chinese path writing is failed.(use imencode and tofile)")

以上代码运行结果如下:

img1 imread ok: (129, 186, 3)
img2 imread failed.
img3 imread failed.
img4 imread failed.
img_d1 imdecode ok: (129, 186, 3)
img_d2 imdecode ok: (129, 186, 3)
img_d3 imdecode ok: (129, 186, 3)
img_d4 imdecode ok: (129, 186, 3)
english path writing is ok!(use imwrite)
chinese path writing is failed.(use imwrite)
chinese path writing is ok!(use imencode and tofile)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python图像文字识别详解(附实战代码)

    Python图像文字识别详解(附实战代码)

    这篇文章主要给大家介绍了关于Python图像文字识别的相关资料,本文介绍使用python进行图像的文字识别,将图像中的文字提取出来,可以帮助我们完成很多有趣的事情,需要的朋友可以参考下
    2024-02-02
  • 三分钟内解决cfgrib的安装问题

    三分钟内解决cfgrib的安装问题

    这篇文章主要介绍了三分钟内解决cfgrib的安装问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python中itertools库的四个函数介绍

    Python中itertools库的四个函数介绍

    这篇文章主要介绍了Python中itertools库的四个函数,主要讨论itertools库中的十分使用的几个函数,并重点介绍什么时候我们应该考虑使用它们,需要的朋友可以参考一下
    2022-04-04
  • python 发送get请求接口详解

    python 发送get请求接口详解

    这篇文章主要介绍了python 发送get请求接口详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • python实现滑雪者小游戏

    python实现滑雪者小游戏

    这篇文章主要为大家详细介绍了python实现滑雪者小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • python 爬取英雄联盟皮肤图片

    python 爬取英雄联盟皮肤图片

    还记得那些年一起网吧开黑通宵的日子吗?《英雄联盟》绝对是大学时期的风靡游戏,即使毕业多年的大学同学相聚,难免不怀念一番当时一起玩《英雄联盟》的日子。今天就给大家分享一下英雄及皮肤图片的爬虫。
    2021-05-05
  • 详解Python中魔法方法的使用

    详解Python中魔法方法的使用

    Python的魔法方法,也称为dunder(双下划线)方法,是可以让你对类添加“魔法”的特殊方法。本文主要来和大家聊聊魔法方法的使用,需要的可以参考一下
    2022-12-12
  • Python学习之str 以及常用的命令

    Python学习之str 以及常用的命令

    下面小编就为大家带来一篇Python的str 以及常用的命令。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-10-10
  • 浅谈对Python变量的一些认识理解

    浅谈对Python变量的一些认识理解

    变量(variable)是编程的基础概念,Python 的变量看似简单,深入了解却不易.文中有非常详细的介绍及代码示例,对正在学习python的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Python numpy实现二维数组和一维数组拼接的方法

    Python numpy实现二维数组和一维数组拼接的方法

    今天小编就为大家分享一篇Python numpy实现二维数组和一维数组拼接的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论