学习目标:
- 了解OpenCV的运行机制
- 可以使用OpenCV处理一些图像常见问题
- 学会物体识别,文字识别等问题的处理思路
图像与视频的加载显示
导入OpenCV的包cv2
import cv2
窗口操作
cv2.imshow('window',0) # imshow(winname, mat) :'mat’表示展示的内容,0表示什么都不展示
cv2.namedWindow('window',cv2.WINDOW_NORMAL)
cv2.resizeWindow('window',800,600)
cv2.imshow('window',0)
key = cv2.waitKey(0)
if key == ord('q'):
print("准备销毁窗口")
cv2.destroyAllWindows()
计算按键的ASCII 值
ord('q')
读取图片
cv2.imread('./cat.jpeg')
用其他插件来读取(以matplotlib 为例)
先将图片存入我们的文件夹下,命名为cat.jpeg
import matplotlib.pyplot as plt
cat = cv2.imread('./cat.jpeg')
cat
plt.imshow(cat)
注意:单独调用imshow() 时可以不用创建窗口,opencv会自动生成
用OpenCV 自带的方式去展示图片
cv2.imshow('cat',cat)
key = cv2.waitKey(0)
if key == ord('q'):
print("准备销毁窗口")
cv2.destroyAllWindows()
函数的封装
如果我们需要频繁地显示图片,那么我们可以把显示图片的方法封装成一个函数方便我们显示图片
把这个函数放在一个文件里,需要使用的话就直接导入文件即可
将函数保存为.py 文件(命名为utils.py ),放在我们的文件夹中
def cv_show(name,img):
import cv2
cv2.imshow(name,img)
key = cv2.waitKey(0)
if key == ord('q') or key == ord('Q'):
cv2.destroyAllWindows()
想要调用函数时,我们导入文件即可
from utils import cv_show
注意:导入后必须先执行文件!
%run utils.py
使用函数
cv_show('cat',cat)
保存图片
imwrite(path,img) :使用imwrite保存图片
import cv2
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',640,480)
img = cv2.imread('./cat.jpeg')
while True:
cv2.imshow('img',img)
key = cv2.waitKey(0)
if key == ord('q'):
break
elif key == ord('s'):
cv2.imwrite('./123.png',img)
else:
print(key)
cv2.destroyAllWindows()
读取摄像头与视频数据
打开摄像头
- 视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧,表示1s显示30张图片
cv2.VideoCapture() 可以捕获摄像头,用数字来表示不同的设备,比如0,1- 如果是视频文件,可以直接指定路径即可
import cv2
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)
cap = cv2.VideoCapture(0)
while True:
flag,frame = cap.read()
if not flag:
print("没读到数据!退出......")
break
else:
cv2.imshow('video',frame)
key = cv2.waitKey(1)
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
打开视频
打开视频的操作和打开摄像头是一样的:只需要修改cap = cv2.VideoCapture(0) 为cap = cv2.VideoCapture(‘./1.mp4’) # 括号内为路径 即可
放出的视频会有加速的效果:是因为我们的代码中key = cv2.waitKey(1) 每隔1ms就执行下一张图片
那么我们为了完整播放这个视频,提出了一个问题:假如一个视频是30帧,那么每张图之间要间隔多少毫秒呢
key = cv2.waitKey(1000 // 30)
视频录制
opencv打开一个视频或一个摄像头,我们把捕获到的每一帧存储在一个视频中
VideoWrite :参数一为输出文件,参数二为多媒体文件格式,参数三为帧率,参数四为分辨率write :编码并写入缓存release :缓存内容写入磁盘,并释放资源
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
vw = cv2.VideoWriter('output.mp4',fourcc,30,(640,480))
while cap.isOpened() :
ret,frame = cap.read()
if not ret:
print('can not recive frame ,Exiting...')
break
else :
vw.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) == ord('q') or cv2.waitKey(1) == ord('Q'):
break
cap.release()
vw.release()
cv2.destroyAllWindows()
控制鼠标
OpenCV允许我们对窗口上的鼠标动作做出响应
setMouseCallback(winname,callback,userdata) :winname 是窗口的名字,callback 是回调函数,userdata 是给回调函数的参数callback(event,x,y,flags,userdata) :回调函数必须包含这5个参数:event 是事件(鼠标移动,按下左键、右键…);xy 代表鼠标位于窗口的(x,y)坐标位置;flags 主要用于组合键;userdata 就是上面的setMouseCallback 的userdata
鼠标事件 Event Event:
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
鼠标的拖拽事件&键盘鼠标联合事件 flags flags:
EVENT_FLAG_LBUTTON 1
EVENT_FLAG_RBUTTON 2
EVENT_FLAG_MBUTTON 4
EVENT_FLAG_CTRLKEY 8
EVENT_FLAG_SHIFTKEY 16
EVENT_FLAG_ALTKEY 32
import cv2
import numpy as np
def mouse_callback(event,x,y,flags,userdata):
print(event,x,y,flags,userdata)
if event == 2:
cv2.destroyAllWindows()
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,360)
cat = cv2.imread('./cat.jpeg')
cv2.setMouseCallback('mouse',mouse_callback,'123')
img = np.zeros((360,640,3),np.uint8)
while True:
cv2.imshow('mouse',cat)
key = cv2.waitKey(1)
if key == ord('q') or key == ord('Q'):
break
cv2.destroyAllWindows()
TrackBar控件
TrackBar是一个可拖动的控件,可以用于控制RGB
现在我们创建一个调整RGB的TrackBar,用调整的值来生成一张图片,通过拖到TrackBar来随时改变这个图片的颜色
cv2.createTrackbar(trackbarName, windowName, value, count, onChange) 创建trackbar控件:value 为trackbar的默认值(开始时游标的位置),cout 为bar的最大值和最小值(是两个值),onChange 为回调函数,每次修改这个值就会跳入该函数cv2.getTrackbarPos(trackbarName, windowName) :获取当前TrackBar的值
import cv2
import numpy as np
cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar',640,480)
def callback(value):
print(value)
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:
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 == ord('q') or key == ord('Q'):
break
cv2.destroyAllWindows()
结果:
|