python-opencv读取中文路径下的图片

最近打算学习一下用python处理图像,于是今天接触 opencv,结果出师不利,上来就遇到了问题。


opencv 进行图像处理的话,我们直接用 pip install opencv-python安装就好了。安装成功后,导入模块测试一下cv2是否安装成功,发现没什么问题。来吧,展示,读取一张图片

import cv2

img = cv2.imread("E:\python\OpenCV/resource\code.jpg")   # 读取图片
cv2.imshow("code", img)	 # 展示图片时窗口名称
cv2.waitKey(1000)   # 图像展示时间,单位:毫秒(ms)


Emm,不错。于是我换了一张图片进行测试,发现它竟然报错了。此时的我是一脸茫然,开始我以为是代码的问题,可是经检查图片路径没有问题,代码该加引号的地方也加了,为此,我还专门使用PS检查了一下,可以正常打开,完全没问题啊。那到底是哪里的问题呢?这时我仔细看了一下报错提示

Traceback (most recent call last):
  File "E:/python/OpenCV/ex.py", line 17, in <module>
    cv2.imshow("pic", img)   
cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-2b5g8ysb\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

这时我猜测,cv2只能读取英文路径,中文路径会报错,查找资料过后证实了我的猜测,原来这里需要numpy来对中文路径的图片进行解码处理,之后就可以打开图片了。


解决方法:

先不直接读取图片,而是采用numpy中的fromfile读取文件,将图片按照int类型读入数据,读入的是一维数组,然后通过cv中imdecode来对数组解码得到图片,imdecode函数的作用是从内存缓冲区中读取图像,如果缓冲区太短或包含无效数据时,函数返回一个空矩阵(Mat::data==NULL)。

如果是彩色图像,解码后的图像将按照B G R顺序存储通道。这函数有两个参数imdecode(buf,flags),buf是输入数组或字节向量,flags 与cv::imread相同的flag,

cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1
cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0
cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1

经过测试,不论文件名和路径中是否存在中文均可。

import cv2
import numpy as np

img = cv2.imdecode(np.fromfile("E:\壁纸\壁纸\code.jpg", dtype=np.uint8), 1)   # 可读取中文路径图片
cv2.imshow("code", img)   # 展示图片时窗口名称
cv2.waitKey(0)   # 图像展示时间,单位:毫秒(ms)

如有错误,欢迎私信纠正,谢谢支持!

你可能感兴趣的:(python,opencv,python)