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中的用法