1. 创建窗口
进行图像操作时,我们要用窗口来显示对图像所进行的操作。用窗口来观察操作前后的效果。
namedWindow()
创建一个新窗口
cv2.namedWindow(winname,图像格式)
winname:创建的窗口名字
图像格式:WINDOW_NORMAL :可以改变窗口大小。WINDOW_AUTOSIZE:自动适应窗口大小,不能自己改变窗口大小。
resizeWindow()
修改窗口大小
cv2.resizeWindow(winname,width,height)
winname:修改的窗口名字
width:宽
height:高
destroyAllWindow()
销毁所有窗口无参数。
cv2.destroyAllWindow()
销毁指定窗口,参数为窗口名。
cv2.destroyWindow(winname)
2.显示图像
在窗口创建好之后,我们就可以通过窗口,把图像显示出来。
imread()
读取指定路径的图像
cv2.imread(path,flag=cv2.IMREAD_COLOR)
path:读取文件的路径
flag:读取图像的方式。cv2.IMREAD_COLOR(加载彩色图像,默认标志 ) 、cv2.IMREAD_GRAYSCALE(灰度模式加载图像)、cv2.IMREAD_UNCHANGED:加载图像,包括alpha通道。
这三种标志可分别用1、0、-1代替。
返回值为mat
imshow()
在窗口中显示图像
cv2.imshow(winname,mat)
指定winname窗口,显示mat对象。
imwrite()
将图像保存起来
cv2.imwrie(path,mat)
path:保存图像的路径
mat:将要保存图像的信息。
waitKey()
窗口显示时间(让窗口等一下,我要输入数据)
cv2.waitKey(time)
time:窗口等待的时间,单位ms,time=0,那么一直等待输入数据。
返回值 用户从键盘输入的ASCII码值。
flip()
将图像进行垂直,水平翻折
cv2.flip(mat,-1/0/1)
mat:就是进行翻折的图片帧
-1:x+y轴翻折、0:x轴翻折、1:y轴翻折
返回值 是翻折之后的图片
代码演示
import cv2 ''' 前面代码统一演示示例: ''' #创建窗口 cv2.namedWindow('flower',cv2.WINDOW_NORMAL) #修改窗口大小 cv2.resizeWindow('flower', 640, 480) # 彩色方式读取图片文件,用img来接收 img = cv2.imread('./image/girl.png',1) # 显示图像 cv2.imshow('flower',img) # 保存图像 cv2.imwrite('./image/flower1.png', img) # 一直显示,等待用户输入数据 cv2.waitKey(0) # 销毁窗口 cv2.destroyWindow('flower')
3.显示视频
需要用到视频操作的相关接口,OpenCV提供了VideoCapure()对象,用来进行相关操作。
VideoCapure()对象
视频捕获的对象
cap = cv2.VIdeoCapure(path/数字01)
创建好后,cap就是一个视频操作的对象(以后都用cap来表示)
path:读取视频文件需要放视频文件的完整路径
数字0/1:0是默认电脑摄像头。
cap.get()
获得视频帧中的属性
cap.get(propld)
propld:3表示宽度,4表示高度,5表示帧率
返回值由输入的数据决定
cap.isOpened()
用来检查创建的对象,是否已经成功打开
cap.isOpened()
返回值是一个boll值,True表示成功打开,否则打开失败
cap.read()
从捕获的摄像头或者视频帧中读取视频帧。
cap.read()
两个返回值,第一个boll值,代表该帧是否正确读取到,第二个返回值是该帧的数据(mat)
cap.release()
释放cap对象捕获的设备
cap.release()
部分功能代码演示
import cv2 # 创建一个窗口 cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建一个视频对象 cap = cv2.VideoCapture(0) # 检查是否打开 if not cap.isOpened(): print('Video opened failed') exit(-1) # 获取视频帧的宽和高 print(cap.get(3)) print(cap.get(4)) while True: # 读取视频帧 ret, frame = cap.read() if not ret: print('视频帧读取有误!') break # 显示视频帧 cv2.imshow('video', frame) key = cv2.waitKey(10) # 按q退出,按s保存 if (key & 0xff) == ord('q'): print('退出成功') break # 释放资源 cv2.destroyAllWindows() cap.release()
VideoWriter()对象
创建一个保存视频的对象,定义好path、编码格式、帧数、视频帧大小,是否是彩色格式(默认为彩色)
out = cv2.VideoWriter(filename,fourcc,fps,frameSize,[IsColor])
filename:视频的路径和文件名
fourcc:压缩帧的4字符编/解码器的选项
fps:视频的帧数
frameSize:视频帧的大小(width,height)
VideoWriter_fourcc()
用来设置编/解码器。
fourcc = cv2.VideoWriter_fourcc(*‘字符串’)
参数:适合编码的各种缩写,-1为自动匹配合适的编/解码器。
write()
先将视频帧编码,之后再将视频帧写入要保存的路径中
out.write(mat)
mat:保存的视频帧
release()
释放类,并且把缓冲区的数据强制编码,再输出成文件。
out.release()
部分代码展示:
读取视频仅仅需要将创建视频的对象,修改成读取的文件路径即可
import cv2 fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 创建一个窗口 cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建一个输出对象 out = cv2.VideoWriter('./video/out.mp4', fourcc, 20, (640, 480)) # 创建一个视频对象 cap = cv2.VideoCapture(0) # 检查是否打开 if not cap.isOpened(): print('Video opened failed') exit(-1) # 获取视频帧的宽和高 print(cap.get(3)) print(cap.get(4)) while True: # 读取视频帧 ret, frame = cap.read() if not ret: print('视频帧读取有误!') break # 将视频帧反转保存并显示视频帧 frame = cv2.flip(frame, 1) out.write(frame) cv2.imshow('video', frame) key = cv2.waitKey(1000//20) # 按q退出 if (key & 0xff) == ord('q'): print('退出成功') break # 释放资源 cv2.destroyAllWindows() out.release() cap.release()
4.鼠标控制
可以在图像中控制鼠标来进行一些操作。
setMouseCallBack()
设置鼠标回调函数
cv2.setMouseCallBack(winname,callback,uerdata)
winname:在哪个窗口调用这个函数
callback:回调函数,需要用户自己设置,用来完成一些事件。
uerdata:用户自己额外传送的数据。
callback()
自己定义的一个函数
def callback(event,x,y,flags,uerdata)
event:鼠标进行的动作
flags:键盘进行的动作
(x,y):鼠标的横纵坐标
uerdata:调用这个函数的数据。
event:
flags:
部分代码展示:
import cv2 import numpy as np def mouse_back(event, x, y, flags, uerdata): print(event, x, y, flags, uerdata) # 创建窗口,并且调整大小 cv2.namedWindow('mouse',cv2.WINDOW_NORMAL) cv2.resizeWindow('mouse', 640, 480) # 设置鼠标回调 cv2.setMouseCallback('mouse',mouse_back,'1111') #创建一个纯黑的图像,行数,列数,几个通道,图片格式 img = np.zeros((480, 640, 3), np.uint8) while True: cv2.imshow('mouse',img) key = cv2.waitKey(10) if key & 0xFF == ord('q'): print('退出成功') break # 销毁资源 cv2.destroyAllWindows()