目录
我这里默认大家已经完成了python+opencv的安装,很简单。个人推荐安装完python环境后,用pip安装opencv,网上教程有很多。
一、图像视频的加载和显示
1.创建和显示窗口
nameWindows() 创建命名窗口
imshow() 显示窗口
destroyAllwindows() 摧毁窗口
resizeWindow() 改变窗口大小
waitKey() 等待用户输入
基础代码展示:
import cv2 as cv
#创建窗口
#cv.WINDOW_AUTOSIZE是自动大小,不允许修改窗口大小
#cv.namedWindow('window',cv.WINDOW_AUTOSIZE)
cv.namedWindow('window',cv.WINDOW_NORMAL)
#更改窗口的大小
cv.resizeWindow('window',800,600)
#展示名字为window的窗口
cv.imshow('window',0)
#waitKey(0)代表按任意键消失
cv.waitKey(0)
#销毁所有的窗口
cv.destroyAllWindows()
2.加载显示图片
imread(path, flag):使用imread可以读取图片,默认读取的是彩色图片.比如:
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
#读取图片
img=cv.imread('OIP-C.jpg')
print(img)
cv.imshow('img',img)
cv.waitKey(0)
这里说明一点,可以使用matplotlib的库,plt.imshow() 显示的颜色与正常颜色不一样,这是因为OpenCV读取的图片颜色通道是按照BGR(蓝绿红)排列的,一般图片通道都是按照RGB来排列的。
3.保存图片
imwrite(path, img,(paras)):使用imwrite保存图片。
cv2.imwrite() 将 OpenCV 图像保存到指定的文件。
cv2.imwrite() 基于保存文件的扩展名选择保存图像的格式。
cv2.imwrite() 只能保存 BGR 3通道图像,或 8 位单通道图像、或 PNG/JPEG/TIFF 16位无符号单通道图像。
参数说明:
path:要保存的文件的路径和名称,包括文件扩展名
img:要保存的 OpenCV 图像,nparray 多维数组
paras:不同编码格式的参数,可选项:
cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高;
cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大。
4.视频采集
- 视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧,表示一秒显示30张图片。 cv2.VideoCapture可以捕获摄像头,用数字来表示不同的设备,比如0,1。
- 如果是视频文件,可以直接指定路径即可。
对于自己电脑摄像头的读取:
#视频其实本质上就是由一幅一幅的图片组成的
import cv2
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)
#打开摄像头
capture = cv2.VideoCapture(0)
#循环读取视频每一帧数据
while True: #另外:capture.Opened() 返回的是True,false
# 可以读到视频每一帧数据
ret, frame = capture.read()
frame = cv2.flip(frame,1) #镜像操作
cv2.imshow('video', frame)
key = cv2.waitKey(50)
#print(key)
if key & 0xFF == ord('q'): #判断是哪一个键按下
break
#别忘了释放资源
cv2.destroyAllWindows()
5.视频的录制
- VideoWriter:参数一为输出文件,参数二为多媒体文件格式,参数三为帧率,参数四为分辨率。
- write编码并写入缓存。
- release缓存内容写入磁盘,并释放资源。
import cv2
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)
cap=cv2.VideoCapture(0)
#视频格式cv2.VideoWriter_fourcc(*'XVID')或cv2.VideoWriter_fourcc('X','V','I','D')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
#四个参数,1.文件名称,2.格式设置,3.帧数,4.录得大小
vw = cv2.VideoWriter('output.avi',fourcc, 30.0, (640,480))
while cap.isOpened(): #判断能否读取帧数,ture或者false
ret,frame=cap.read()
if not ret:
print('can not open')
break
else:
frame = cv2.flip(frame, 1)
vw.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('1'):
break
cap.release()
vw.release()
cv2.destroyAllWindows()
另外说明录视频还有其他的格式:XVID,MP4V,,等。
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鼠标左右滚动
上面表述的鼠标事件就是回调函数中的event值,一下会展示。
上代码:
#opencv 控制鼠标
import cv2
import numpy as np
#函数名可以随便取,但是参数必须是5个
#event 表示鼠标事件,x,y是鼠标的坐标
#flags鼠标的组合按键
def mouse_callback(event,x,y,flags,userdata):
print(event,x,y,flags,userdata)
if event==1: #按下鼠标左键event值变成1
print('按了一下鼠标左键,伴随着左键释放,event=4')
if event==2: #按下鼠标右键event值变成2
print('按了一下鼠标右键,伴随着右键释放,event=5')
#其他的一样可以进行测试,这里不测试了
#创建窗口
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,480)
#设置鼠标回调函数,123字符串不用管
cv2.setMouseCallback('mouse',mouse_callback,'123')
#生成会黑的图片
img=np.zeros((480,640,3),np.uint8)
while True:
cv2.imshow('mouse',img)
key=cv2.waitKey(1)
if key==ord('q'):
break
cv2.destoryALLWindows()
7.TrackBar控件
TrackBar控件可以控制RGB,还有其他的:
- createTrackbar(trackbarname, winname, value, count, onChange)创建TrackBar控件, value为trackbar的默认值, count为bar的最大值,最小为0。
- getTrackbarPos(trackbarname, winname)获取TrackBar当前值。
创建trackbar
import cv2
import numpy as np
#创建窗口
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,480)
#定义回调函数
def callback(value):
#print(value)
pass
#创建三个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.getTrackbatPos('R','trackbar')
g = cv2.getTrackbatPos('G', 'trackbar')
b = cv2.getTrackbatPos('B', 'trackbar')
#用获取到的三个值修改背景图片颜色
img[:]=[b,g,r]
cv2.imshow('trackbar',img)
key=cv2.waitKey(0)
if key==ord('q'):
break
cv2.destroyALLWindows()