5. trackBar组件
createTrackbar()
用于创建一个tarckbar,目的是进行调节量
cv2.createTrackbar(trackbarname,winname,value,count,callback,userdata)
trackbarname:轨道名称
winname:将该组件和winname绑定。
value:组件的当前值。
count:组件的最大值,从0开始算。
callback:回调函数
userdata:用户自己传的数据
getTrackbarPos()
用于获取trackbar的位置
cv2.getTrackbarPos(trackbarname,winname)
taackbainame:trackbar的控件名称
winname:控件绑定的窗口
返回值 trackbar的位置
部分代码示例
import cv2 import numpy as np def track_callback(): pass # 创建一个窗口 cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL) cv2.resizeWindow('trackbar', 640, 480) # 创建一个全黑图像 img = np.zeros((480, 640, 3), np.uint8) # 创建三个trackbar cv2.createTrackbar('R', 'trackbar', 0, 255, track_callback) cv2.createTrackbar('G', 'trackbar', 0, 255, track_callback) cv2.createTrackbar('B', 'trackbar', 0, 255, track_callback) while True: # 首先展示图片 cv2.imshow('trackbar', img) # 获取三个trackbar的值 r = cv2.getTrackbarPos('R', 'trackbar') g = cv2.getTrackbarPos('G', 'trackbar') b = cv2.getTrackbarPos('B', 'trackbar') key = cv2.waitKey(10) if key & 0xff == ord('q'): print("退出成功") break img[:] = [b, g, r] # 释放资源 cv2.destroyAllWindows()
7.Numpy基础(为了方便调用,用np表示)
在OpenCV中用到的矩阵都要转换成Numpy数组,Numpy是一个高度优化的数值库,速度很快。
Numpy库创建矩阵
array()
直接创建数组
np.array(mat)
mat:一维数组[1,2,3],二维数组:[[1,2,3],[4,5,6],[7,8,9]]…
返回值是一个数组
zeros()/ones
创建全0/1的数组
np.zeros((row,col,通道数/层数),数据类型)
参数: 第一个三元组,是矩阵的行数、列数、通道数;第二个是数据类型
返回值是一个数组
full()
创建全值数组(矩阵全部为一个数值)
np.full((row,col,通道数/层数),val,数据类型)
参数: 第一个三元组,是矩阵的行数、列数、通道数;第二个是矩阵的数值;第三个是数据类型
返回值是一个数组
identity()/eye()
创建单元数组
np.identy(n)/np.eye(n)
参数:n:创建n*n的单位矩阵
返回值是一个数组
np.eye(row,col ,k)
参数:row行col列数组,从第1行第k个数字,开始写1,可以不是正方形
返回值是一个数组
代码演示
import cv2 import numpy as np # 创建一维,二维数组 a = np.array([1, 2, 3]) b = np.array([[1,2, 3],[4,5,6],[7,8,9]]) print(a) print(b) # 创建全0/1数组 # 这样写会显示8*8的矩阵,如果换成(8,8,3) # 由于print解释不同,会打印成8个8*3的矩阵 c = np.zeros((8, 8),np.uint8) d = np.ones((8, 8),np.uint8) print(c) print(d) # 创建全值矩阵,每个值都为10 e = np.full((5, 5), 10, np.uint8) print(e) # 创建单位矩阵 f = np.identity(5) g = np.eye(2) print(f) print(g) # 不是正方形的单位矩阵 # 从第一行k开始为1 h = np.eye(2, 3, 1) print(h)
Numpy检索与赋值
key:用python访问和修改数组
[y,x] 坐标是反过来的
[y,x,channel] 访问指定通道的值
==[y1:y2,x1:x2]==访问该区间的值
[:,:]与[:]相等访问范围内的所有坐标
[:,10] 访问横坐标是10的所有坐标
代码演示
import cv2 import numpy as np # 创建一个全0的数组 a = np.zeros((480, 640, 3), np.uint8) # 直接展示图像 cv2.imshow('a', a) # 将一个范围修改为绿色 # a[100:200, 100:200] = [0, 255, 0] 和下面的方法相等,都是修改绿色通道 # a[100:200, 100:200, 1] = [255] # 修改横坐标为20的所有坐标 # a[:,20] = [0, 0, 255] # 访问全体 a[:] = [255,255,255] cv2.imshow('a2', a) cv2.waitKey(0)
Mat
mat在python中代表的是数组对象,这个对象主要包含mat属性以及数据。在python中,每个数组都有这些属性。
img.shape :显示高度,长度和通道数
img.size:图像占用多大空间
img.dtype:每个元素的位深
代码演示
# 创建一个全0的数组 a = np.zeros((480, 640, 3), np.uint8) print(a.shape) print(a.size) print(a.dtype)
深浅拷贝
日常直接创建变量的方法是浅拷贝,虽然变量名不同,但是共享同一块数据,改变其中一个变量,另一个变量的数据也跟着改变,这是浅拷贝。如果完全复制一份同样的数据存到另一个变量中,两个变量的改变互不影响,这个就是深拷贝。
img3 = img.copy()
代码演示:
# 深浅拷贝 # 创建一个全0的数组 img1 = np.zeros((480, 640, 3), np.uint8) # img3为深拷贝,img2为浅拷贝 img3 = img1.copy() img2 = img1 img2[100:200,100:200] = [255,0,255] cv2.imshow('img1',img1) cv2.imshow('img2',img2) cv2.imshow('img3',img3) cv2.waitKey(0) cv2.destroyAllWindows()
通道分离与合并
将BGR三个通道拆分与合并
split()
将图片的BGR通道拆开成B,G,R三个通道。
cv2.split(mat)
mat:需要拆分的图像
返回值有三个,用三个变量接收
merge()
将拆分的通道合成一个图像
cv2.merge((ch1,ch2,ch3))
参数:ch1,ch2,ch3分别代表各个通道,并且用元组表示。
返回值是拼好的图像
代码展示
# 创建一个全黑的图像 img = np.zeros((480, 640, 3),np.uint8) # BGR通道分割 r, g, b = cv2.split(img) # 仅仅修改两个通道的颜色 r[100:200, 100:200] = 255 b[100:200, 100:200] = 255 # 再次合并成新图形 img2 = cv2.merge((b, g, r)) cv2.imshow('img', img) cv2.imshow('img2', img2)
8. 图像的基本操作
cvtColor()
用于将图像从一个颜色空间转换为另一个颜色空间。
dst = cv2.cvtColor(src,flag)
src:需要转换的图像
flag:见下表
返回值dst,转换颜色空间后的图像
(flag)标志 | 简记 | 作用 |
cv2.COLOR_BGR2BGRA | 0 | 为RGB图像添加alpha通道 |
cv2.COLOR_BGR2RGB | 4 | 由BGR变成RGB顺序 |
cv2.COLOR_BGR2GRAY | 10 | 将彩色图像变成灰度图像 |
cv2.COLOR_BGR2YUV | 82 | 从RGB颜色空间转成YUV颜色空间 |
cv2.COLOR_BGR2HSV | 40 | 从RGB颜色空间转成HSV颜色空间 |
部分代码展示:
import cv2 def callback(x): pass # 创建窗口 cv2.namedWindow('color',cv2.WINDOW_NORMAL) cv2.resizeWindow('color', 640, 480) # 读取一个图像 img = cv2.imread('./image/girl.png') # 创建一个列表 colorspaces = [cv2.COLOR_BGR2RGB, cv2.COLOR_BGR2BGRA, cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2YUV, cv2.COLOR_BGR2HSV] # 创建一个trackbar cv2.createTrackbar('cvt_color', 'color', 0, len(colorspaces)-1, callback) while True: # 获取trackbar位置 index = cv2.getTrackbarPos('cvt_color', 'color') # 转换图像 cvt_img = cv2.cvtColor(img, colorspaces[index]) cv2.imshow('color', cvt_img) key = cv2.waitKey(10) if key & 0xff == ord('q'): break # 销毁资源 cv2.destroyAllWindows()