最近打算学习一下用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)
如有错误,欢迎私信纠正,谢谢支持!