opencv 是一个强大的图像处理模块,本节介绍一下基本操作
安装
详情请百度
pip install opencv-python
查看版本
import cv2 as cv ### 查看版本 print(cv.__version__) # 4.5.2
创建图像
直接用 np 创建图像,并在窗口显示;
注意指定数据格式为 np.uint8,8位无符号整型 【这条注意 别整幺蛾子,真想玩的话看看 参考资料】
img = np.zeros((128, 128, 3), np.uint8) # 注意指定数据格式为 np.uint8,8位无符号整型 cv.imshow('t', img) # 第一个参数是 nameWindow,代表显示图像的窗口,可提前创建,也可直接引用 cv.waitKey(0) # 避免图像闪退
创建窗口
cv.namedWindow(winname='t2') # 新建窗口,类似于 plt.figure,可有可无 cv.imshow('t2', img) cv.waitKey(1)
操作已有图像
主要了解 读取、显示、存储图像的基本操作
imread - imshow - imwrite
imread 读取图像,需要注意几点
1. 返回 ndarray 格式;
2. 返回图像的 BGR 格式; 【刚好是 RGB 反过来,好记】
img = cv2.imread('image/noise.png') ### 读取图像,返回 ndarray 格式 print(type(img)) # <class 'numpy.ndarray'> window = cv2.namedWindow('test') ### 创建一个命名窗口,用于显示图片,可省略 cv2.imshow('t', img) ### 不在 命名窗口中显示图片,会新开一个窗口 cv2.imshow('test', img) ### 在命名窗口中显示图片 cv2.waitKey(0) ### 等待,如果没有这句,窗口会一闪而过,0代表无限等待,可用具体数字,表示等待时长 # cv2.destroyWindows('t') ### 释放指定窗口 # cv2.destroyAllWindows() ### 释放所有窗口 cv2.imwrite('image/save.png', img) ### 写入
imread
def imread(filename, flags=None)
flags 说明
cv.IMREAD_COLOR 1: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
cv.IMREAD_GRAYSCALE 0:以灰度模式加载图像
cv.IMREAD_UNCHANGED -1:加载图像,包括alpha通道
LoadImage - ShowImage - SaveImage
这套 API 已废弃
img = cv2.cv.LoadImage('image/noise.png') print(type(img)) cv2.cv.ShowImage('t', img) cv2.waitKey(0) cv2.cv.SaveImage('image/save2.png', img)
waitKey 用法
该函数功能是 不断刷新图像,也可以理解为 等待 关闭时间
def waitKey(delay=None): """ @param delay Delay in milliseconds. 0 is the special value that means "forever". """ pass
delay 表示 刷新频率,单位是 ms,
若 取值 1,代表 1ms 刷新一次,也就是说 1ms 后 关闭;
若 取值 10000,代表 10000ms 刷新一次,也就是说 10000ms 后关闭;
若 取值 0,比较特殊,代表 永不关闭
其实更确切的说法是:在 while 循环中,表示 不断刷新图像;不在 while 循环中,表示 等待关闭时间
img = np.zeros((128, 128, 3), np.uint8) n = 0 while n < 100: print(n) cv.imshow('t3', img) cv.waitKey(1) # 在 while 循环里,每 1ms 刷新一次 n += 1 cv.imshow('t4', img) cv.waitKey(1) # 不在 while 循环里,1ms 闪退
ESC 退出
等待用户触发事件, 等待时间为 delay ms,如果在这个时间段内, 用户按下ESC (ASCII码为27), 执行if体
img = np.zeros((128, 128, 3), np.uint8) while 1: cv.imshow('t5', img) if cv.waitKey(100) == 27: # 若 100ms 内 按下 esc 键,关闭图像 break
参考资料:
https://zhidao.baidu.com/question/532862991.html uint8和uint16 是什么数据类型
https://www.pythonheidong.com/blog/article/291577/cde89f1cb8c3e00bce3e/ 为什么在Opencv python包装器中数据类型必须为'uint8'?
https://blog.csdn.net/weixin_44572622/article/details/97494468 waitKey()在opencv中的用法