本文记录一下近期对OpenCV的学习,可能也对跟我一样的初学者有所帮助,希望大家可以多多交流,共同进步
创建并显示窗口
import cv2
# cv2,WINDOW_AUTOSIZE 窗口大小自动,不可调节
# cv2.WINDOW_NORMAL 窗口大小为设定值,可调
# cv2.WINDOW_FREERATIO 自由比例调节
# cv2.WINDOW_KEEPRATIO 保持比例调节
cv2.namedWindow('new',cv2.WINDOW_NORMAL)
# 修改窗口大小
cv2.resizeWindow('new', 640, 480)
#展示图片
cv2.imshow('new',0)
#waiKey方法表示等待按键,超过时间没有发生按键操作窗口会自动关闭,0表示任何按键,其它整数表示等待按键的时间,单位ms
#返回按键的ASCII值
key = cv2.waitKey(0)
#销毁所有窗口
if key & 0xff == ord('q'):
cv2.destroyAllWindows()
加载图片
- imread(path,flag) 使用imread可以读取图片,默认彩色图片
#导包
import cv2
import numpy as np
#读取图片
img = cv2.imread("./001.png")
#显示图片
#因为OpenCV读取的图片颜色通道是按照BGR读取,而一般图像是按RGB排列
#为正常显示,要调用OpenCV的显示方法
cv2.imshow('1',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
保存图片
- imwrite(path,img): 用来保存图片
import cv2
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',640,480)
img = cv2.imread("./001.png")
#利用while循环优化退出逻辑
while True:
cv2.imshow('img',img)
key = cv2.waitKey(0)
if(key & 0xff == ord('q')):
break
elif(key & 0xff == ord('s')):
cv2.imwrite("./123.png",img)
else:
print(key)
cv2.destroyAllWindows()
视频采集
- 视频的每一帧都是一幅图片,如果是30帧,则表示1s显示30张图片
- cv2.VideoCapture可以捕获摄像头,也可以打开视频文件
- 如果是视频文件,直接指定路径即可
#打开视频文件
vc = cv2.VideoCapture('./1.mp4')
#打开摄像头
vc = cv2.VideoCapture(0)
#检查是否正确打开
if vc.isOpened():
#读取视频的一帧
open,frame = vc.read()
else:
open = False
#循环读取视频每一帧数据
while True:
# 可以正确读到数据,则ret返回True
ret,frame = vc.read()
# 读到最后,frame为空
if frame is None:
break
if ret == True:
cv2.imshow('result',gray)
# 0xff == 27 表示按 ESC 会退出
if cv2.waitKey(33) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()
- cap.read()返回两个值,第一个为状态值,读到帧为True,第二个值为视频帧
- cap.release() 释放摄像头资源
# 循环读取摄像头每一帧数据
# 创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',1280,800)
# 获取视频设备
cap=cv2.VideoCapture(0)
while True:
# 从摄像头读取视频
ret,frame=cap.read()
# 将视频帧放在窗口中显示
cv2.imshow('video',frame)
# 等待键盘事件,如果为q,则退出
key=cv2.waitKey(1)
if key & 0xff == ord('q'):
break
# 释放
cap.release()
cv2.destroyAllWindows()
视频录制
- VideoWriter:
- 第一个参数为输出文件,
- 第二个参数为多媒体文件格式(VideoWriter_fourcc)
- 第三个参数为帧率,第四个参数为分辨率
- write 编码并写入缓存
- release 缓存内容写入磁盘,并释放资源
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('cannot recive frame, Exiting...')
break
vw.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
#释放VideoWriter
vw.release()
cv2.destroyAllWindows()
控制鼠标
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 按下shift键
- EVENT_FLAG_ALTKEY 32 按下alt键
import cv2
import numpy as np
a=0
b=0
def mouse_callback(event,x,y,flags,userdata):
# 多余的操作当作练手了
# 本身不操作鼠标就不会触发回调函数
global a,b
if(x!=a | y!=b):
a=x
b=y
print(event,x,y,flags,userdata)
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,480)
# 设置鼠标回调函数
cv2.setMouseCallback('mouse',mouse_callback,'qw12')
# 显示窗口和背景并生成全黑的图片
# 分辨率反过来,数据类型用 np.uint8
img = np.zeros((480,640,3),np.uint8)
while True:
cv2.imshow('mouse',img)
key = cv2.waitKey(1)
if key & 0xff == ord('q'):
break
cv2.destroyAllWindows()
TrackBar 控件
- createTrackbar(trackbarname,winname,value,count,onChange) 创建TrackBar控件
- value为trackbar的起始值
- count为bar的最大值,最小为0
- getTrackbarPos(trackbarname,winname) 获取TrackBar当前值
# trackbar实现RGB色板
import cv2
import numpy as np
# 创建窗口
cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar',640,480)
# 定义回调函数
def callback(value):
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((480,640,3),np.uint8)
while True:
# 获取当前trackbar的值
r = cv2.getTrackbarPos('R','trackbar')
g = cv2.getTrackbarPos('G','trackbar')
b = cv2.getTrackbarPos('B','trackbar')
# 改变图像颜色
img[:] = [b,g,r]
cv2.imshow('trackbar',img)
key = cv2.waitKey(1)
if key & 0xff == ord('q'):
break
cv2.destroyAllWindows()