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是如何实现视频的下载以及合成的,文中的实现步骤讲解详细,感兴趣的小伙伴快跟随小编一起学习一下吧
    2022-04-04
  • python实现连续变量最优分箱详解--CART算法

    python实现连续变量最优分箱详解--CART算法

    今天小编就为大家分享一篇python实现连续变量最优分箱详解--CART算法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • django vue3实现大文件分段续传(断点续传)

    django vue3实现大文件分段续传(断点续传)

    本文介绍了使用Django和Vue3实现大文件分段上传(断点续传)的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • python numpy查询定位赋值数值所在行列

    python numpy查询定位赋值数值所在行列

    这篇文章主要介绍了python numpy查询定位赋值数值所在行列,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Python中号称神仙的六个内置函数详解

    Python中号称神仙的六个内置函数详解

    这篇文章主要介绍了Python中号称神仙的六个内置函数,今天分享的这6个内置函数,在使用 Python 进行数据分析或者其他复杂的自动化任务时非常方便,需要的朋友可以参考下
    2022-05-05
  • Apache,wsgi,django 程序部署配置方法详解

    Apache,wsgi,django 程序部署配置方法详解

    这篇文章主要介绍了Apache,wsgi,django 程序部署配置方法,结合实例形式详细分析了Linux环境下Apache,wsgi,django程序部署配置的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-07-07
  • Python核心内置函数len()、list()、locals()实用指南解析

    Python核心内置函数len()、list()、locals()实用指南解析

    Python作为一门以简洁、易读和强大功能著称的高级编程语言,其内置函数是语言核心能力的重要体现,也是初学者快速上手、中高级开发者提升编码效率的关键基石,这篇文章主要介绍了Python核心内置函数len()、list()、locals()实用指南的相关资料,需要的朋友可以参考下
    2026-03-03
  • Python+tkinter实现动态连接数据库

    Python+tkinter实现动态连接数据库

    在使用 Tkinter (tk) 开发 GUI 程序时,可以通过多种方式让用户自由更改数据库连接地址,本文主要介绍了三种常用方法,感兴趣的小伙伴可以了解下
    2025-03-03
  • Python实现的单向循环链表功能示例

    Python实现的单向循环链表功能示例

    这篇文章主要介绍了Python实现的单向循环链表功能,简单描述了单向循环链表的概念、原理并结合实例形式分析了Python定义与使用单向循环链表的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Python模拟用户登录验证

    Python模拟用户登录验证

    这篇文章主要为大家详细介绍了Python模拟用户登录验证的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09

最新评论