目录
1 创建和显示窗口
- namedWindow() 创建命名窗口
- imshow() 显示窗口
- destroyAllwindws() 摧毁窗口
- resizeWindow() 改变窗口大小
- waitKey() 等待用户输入
import cv2
# 创建窗口之前不要调整窗口大小
cv2.namedWindow('window', cv2.WINDOW_NORMAL) # 创建窗口
cv2.resizeWindow('window', 600, 800) # 调整窗口大小
# 显示图像
image = cv2.imread('path_to_image')
cv2.imshow('window', image)
# 等待按键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
确保在调用 cv2.resizeWindow 之前窗口已经创建,并且在窗口存在的情况下调整其大小。
- ord()计算ASCII数值
- import cv2
#创建窗口
# WINDOW_NORMAL 可以让窗口大小变得可调节,默认WINDOW_AUTOSIZE 自动大小
cv2.namedWindow('new',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new',600,800)
# 展示名字为window的窗口
cv2.imshow('window',0) #没有内容只好写0
cv2.resizeWindow('window',600,800)
# 等待按键输入;0表示接收任意按键,如果给其他整数,表示等待按键的时间,单位毫秒;可以利用waitKey()实现关闭窗口
key = cv2.waitKey(0) #key 为键盘输入的ASCII码
if key & 0xFF == ord('q'):
print('准备销毁窗口')
cv2.destroyAllWindows() # 销毁所有窗口
2 加载显示图片
- imread(path,flag):使用imread可以读取图片,默认读取的是彩色图片。
Matplotlib显示的图片和实际不一样,因为opencv读取的颜色通道是按照BGR排列的,一般照片是RGB,为了显示正常要用opencv的显示方法:
如果常用显示图片可以封装成函数,以后可以使用(自己所有的功能都可以封装起来,以后导入就可以直接用,方便积累)
import cv2
# 显示图片
def cv_show(name,img):
cv2.imshow('name',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import monkey
import matplotlib.pyplot as plt
import numpy as np
# 读取图片
img = cv2.imread('2.jpg')
# 显示图片
monkey.cv_show('侯文广',img)
monkey.music_play()
3 保存图片
imwrite(path,img):使用imwrite保存图片
“./123.png” # 当前目录下的图片。
import cv2
cv2.namedWindow('img',cv2.WINDOW_NORMAL) #创建一个窗口
cv2.resizeWindow('img',320,240) #设置窗口尺寸
img = cv2.imread('./2.jpg') # 载入当前目录下的图片
#利用while 循环优化退出逻辑
while True:
cv2.imshow('img',img)
key = cv2.waitKey(0) #接收键盘的输入字母的ASCII码
if(key&0xff==ord('q')):
break
elif(key&0xff==ord('s')):
cv2.imwrite(r'D:/5.png',img)
print('保存成功')
break
else:
print(key)
break
cv2.destroyAllWindows()
4 视频采集
视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧。
cv2.VideoCapture可以捕获摄像头,用数字来表示不同的设备,比如0,1
如果是视频文件直接指定路径即可。
读取视频
import cv2
# 创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,380)
# 打开视频文件
vc = cv2.VideoCapture('./nine.mp4')
# 循环读取摄像头每一帧
while True:
# 读每一帧数据,返回标记和这一帧数据frame,True表示读到了数据,False表示没读到数据
ret,frame = vc.read() # ret表示标记,frame表示图片
# 可以根据ret做个判断
if not ret:
# 没有读到数据
break
# 显示窗口
cv2.imshow('video',frame)
# 退出条件
key = cv2.waitKey(1)
if key == ord('q'):
break
# 别忘了释放资源
vc.release()
cv2.destroyAllWindows()
读取摄像头
import cv2 # 创建窗口 cv2.namedWindow('video',cv2.WINDOW_NORMAL) cv2.resizeWindow('video',640,380) # 打开摄像头 vc1 = cv2.VideoCapture(0) # 循环读取摄像头每一帧 while True: # 读每一帧数据,返回标记和这一帧数据frame,True表示读到了数据,False表示没读到数据 ret,frame = vc1.read() # ret表示标记,frame表示图片 # 可以根据ret做个判断 if not ret: # 没有读到数据 break # 显示窗口 cv2.imshow('video',frame) # 退出条件 key = cv2.waitKey(1000//30) #每帧图片之间的间隔时间ms(30帧,每帧之间隔多久)
if key ==ord('q'):
break
# 别忘了释放资源
vc1.release()
cv2.destroyAllWindows()
5视频录制
- VideoWriter:参数一为输出文件,参数二为多媒体文件格式(VideoWriter.fourcc),参数三为帧率,参数四为分辨率。
- write 编码并写入缓存
- release 缓存内容写入磁盘,并释放资源
- import cv2
cap = cv2.VideoCapture(0) # 打开摄像头
# *mp4v就是解包操作,等同于'm','p','4','v'
fourcc = cv2.VideoWriter.fourcc(*'mp4v')
# (640,480)表示摄像头拍视频,这个大小搞错了不行
# 主要是分辨率
vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print('can not receive framne ,Exiting ....')
break
vw.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
6 控制鼠标
Opencv允许对窗口上的鼠标进行操作
- setMouseCallback(winname,callback,userdata),winname是窗口的名字,callback是回调函数,userdata是给回调函数的参数,
- callback(event,x,y,flags,userdata)回调函数包含这5个参数,event是事件(鼠标移动,左键,右键),x,y是点鼠标的坐标点,flags主要用于组合键,userdata是上面setMouseCallback的userdata
鼠标事件:
- EVENT_MOUSEMOVE 0 鼠标移动
- EVENT_LBUTTONDOWN 1 按下鼠标左键
- EVENT_RBUTTONDOWN 2 按下鼠标右键
- EVENT_MBUTTONDOWN 3 按下鼠标中键
- EVENT_LBUTTONUP 4 左键释放
- EVENT_RBUTTONUP 5 右键释放
- EVENT_MBUTTONUP 6中键释放
- EVENT_LBUTTONDBLCLK 7 左键双击
- EVENT_RBUTTONDBLCLK 8 右键双击
- EVENT_MBUTTONDBLCLK 9 中键双击
- EVENT_MOUSEWHEEL 10鼠标滚轮上下滚动
- EVENT_MOUSEHWHEEL 11鼠标左右滚动
Flags:
- EVENT_FLAG_LBUTTON 1 按下左键
- EVENT_FLAG_RBUTTON 2 按下右键
- EVENT_FLAG_MBUTTON 4 按下中键
- EVENT_FLAG_CRTLKEY 8 按下CTRL键
- EVENT_FLAG_SHIFTKEY 16 按下SHIFTKEY键
- EVENT_FLAG_ALTKEY 32 按下ALT键
- import cv2
import numpy as np
# 函数名可以随便取,但是必须5个参数
def mouse_callback(event,x,y,flags,userdata):
# 内容根据具体作用进行更换(鼠标在窗口操作会触发函数)
print(event,x,y,flags,userdata)
# 根据event或者flags的值来定义函数
# 按下鼠标右键退出
if event == 2:
cv2.destroyAllWindows()
# 创建窗口
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
# 窗口是宽度(列)高度(行)
cv2.resizeWindow('mouse',640,360)
# 设置鼠标回调函数
# userdata是'123'
cv2.setMouseCallback('mouse',mouse_callback,'123')
# 生成全黑图片
# 先行(高)后列(宽)
img = np.zeros((360,640,3),np.uint8)
while True:
cv2.imshow('mouse',img)
key = cv2.waitKey(1000//30)
if key & 0xff == ord('q'):
break
cv2.destroyAllWindows()
7 TrackBar 控件
可以拖动的控件。
表示拖动了多少值。最多三原色控制
- createTrackbar(trackbarname,winname,value,count,onChange)
创建TrackBar控件,value为trackbar的默认值,count为bar的最大值,trackbar的名字,窗口的名字。回调函数(trackbar动了会触发的结果)
- getTrackbarPos(trackbarname,winname)获取TrackBar当前值。
import cv2
import numpy as np
# 创建窗口
cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar',640,360)
# 定义回调函数
# 触发
def callback(value):
if value >= 50:
print(value)
# 创建trackbar
cv2.createTrackbar('R','trackbar',0,255,callback)
cv2.createTrackbar('G','trackbar',0,255,callback)
cv2.createTrackbar('B','trackbar',0,255,callback)
# 创建一个背景图片
img = np.zeros((360,640,3),np.uint8)
while True:
# 获取当前trackBar的值
r = cv2.getTrackbarPos('R','trackbar')
g = cv2.getTrackbarPos('G', 'trackbar')
b = cv2.getTrackbarPos('B', 'trackbar')
# 改变背景图颜色(bgr顺序)
img[:] = [b,g,r]
cv2.imshow('trackbar',img)
key = cv2.waitKey(1000//30)
if key ==ord('q'):
break
cv2.destroyAllWindows()
8.RGB和BGR颜色空间
Opencv默认使用BGR排列顺序
9.HSV和HSL和YUV
Opencv采用最多HSV色彩空间
Hue:色相取值0—360°,从红色开始逆时针方向计算,红色为0°,绿色120°,蓝色240°。
Saturation:饱和度取值0—100%,饱和度高颜色越饱和,光谱色越多。越低越浅色。
Value(brightness):明度,光亮程度,0%黑,100%白
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。HSV色系对用户来说是一种直观的颜色模型,对于颜色,人们直观的会问”什么颜色?深浅如何?明暗如何?“,而HSV色系则直观的表示了这些信息。
每一种颜色都是由色相(Hue,简H),饱和度(Saturation,简S)和色明度(Value,简V)所表示的。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
色调H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,取值范围为0°~360°。若从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
饱和度S:取值范围为0.0~1.0;
亮度V:取值范围为0.0(黑色)~1.0(白色)。
10 颜色空间的转化
- cvtColor(img,colorspace):颜色转化关键API
- import cv2
def callback(value):
# 鼠标不同操作value不同值
print(value)
cv2.namedWindow('color',cv2.WINDOW_NORMAL)
cv2.resizeWindow('color',640,480)
img = cv2.imread('2.jpg')
# 常见颜色空间转换
colorspaces = [cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BGRA,cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV,cv2.COLOR_BGR2YUV]
# trackbar
cv2.createTrackbar('curcolor','color',0,4,callback)
while True:
# 获得trackbar上的值
index = cv2.getTrackbarPos('curcolor','color')
# 颜色空间转化API
cvt_img = cv2.cvtColor(img,colorspaces[index])
cv2.imshow('color',cvt_img)
key = cv2.waitKey(1000//30)
if key & 0XFF == ord('q'):
break
cv2.destroyAllWindows()
11 mat的深浅拷贝
Mat是Opencv在C++语言中用来表示图像数据的一种数据结构,在python中转化为numpy的ndarray。
- MAT 数据结构 由header和data组成。Header中记录了图片的维数,大小,数据类型等数据。
Ndarray的四种常见属性:data(数据存放的地址),size(元素总个数),dtype(数据类型),shape(形状)
- Mat 共享数据
Header 不同,data相同。
Mat的深浅拷贝就是对ndarry的深浅拷贝。
import cv2
import numpy as np
img = cv2.imread('2.jpg')