OpenCV学习笔记1-图像与视频的加载与显示
文章目录
- 1 创建和显示窗口
-
- 1.1创建命名窗口
- 1.2改变窗口大小
- 1.3显示窗口
- 1.4 等待
- 1.5销毁窗口
- 2 加载显示图片
- 3 保存图片
- 4 视频采集-摄像头/视频
-
- 4.1捕获摄像头
- 4.2读取视频
- 5 视频录制
1 创建和显示窗口
1.1创建命名窗口
- cv2.namedWindow(winname[, flags]) 创建命名窗口
- winname 窗口名称,自己随意取
- frags 窗口的标识
- (默认)frags = 1:cv2.WINDOW_AUTOSIZE
窗口大小自动适应图片大小,并且不可手动更改 - frags = 0:cv2.WINDOW_NORMAL
用户可以改变这个窗口大小
- (默认)frags = 1:cv2.WINDOW_AUTOSIZE
1.2改变窗口大小
- cv2.resizeWindow(winname, width, height) 改变窗口大小
- winname 窗口名
- width 窗口宽度
- height 窗口高度
1.3显示窗口
- cv2.imshow(winname, mat) 显示窗口
- winname 窗口名称(一般来说,名字和namedWindow/resizeWindow一致)
- mat 传入的图像(ndarray)
- 为0 ,黑图
- others 其他图像
1.4 等待
- cv2.waitKey([, delay]) 等待用户输入
- delay <= 0:一直等待按键,一般为0
- delay取正整数:等待按键的时间,单位是毫秒,超过时间没有按的话窗口会自动关闭
- 返回值:等待期间有按键,则返回对应按键的ASCII码;等待期间无按键,返回-1
1.5销毁窗口
-
cv2.destroyAllwindows() 摧毁所有窗口
-
cv2.destroyWindow(winname) 摧毁指定窗口
- winname 窗口名
# opencv名字叫做opencv但是导包的时候, 叫做cv2import cv2# python函数编码规范, 单词首字母小写, 单词与单词之间用下滑线连接.wait_key# 创建窗口# cv2.WINDOW_AUTOSIZE不允许修改窗口大小# cv2.namedWindow('window', cv2.WINDOW_AUTOSIZE)# cv2.namedWindow('window', 1)# WINDOW_NORMAL可以让窗口大小变得可以调节cv2.namedWindow('window', cv2.WINDOW_NORMAL)# cv2.namedWindow('window', 0)# 更改窗口的大小cv2.resizeWindow('window', 800, 600)# 展示名字为window的窗口cv2.imshow('window', 0)# 等待按键# waitKey会返回按键的ascii的值# 0表示接受任意按键. 如果给其他的整数, 表示等待按键的时间. 单位是毫秒. # 可以利用waitkey来销毁窗口, 不用每次都重启python.key = cv2.waitKey(0)# key是int型, 最少都是16位, 但是ascii码是8位. if key & 0xFF == ord('q'): # if key ==ord('q'): ->计算ascii码 print('准备销毁窗口') cv2.destroyAllWindows()
2 加载显示图片
-
cv2.imread(filename[, flags]):
- filename 路径+图片名.格式 ,例如:./cat.jpeg
- flags 标志位,表示读取数据的格式
- flags = 1(默认),读取彩色图像(cv2.IMREAD_COLOR)
- flags = -1,读取灰度图像(cv2.IMREAD_GRAYSCALE)
- flags = 0,读取原始图像(cv2.IMREAD_UNCHANGED)
-
使用imread可以读取图片, 默认读取的是彩色图片.比如:
# 导入opencv包import cv2import matplotlib.pyplot as pltimport numpy as np# 读取图片img = cv2.imread('./cat.jpeg')
-
原图长这样:
使用matplotlib显示
plt.imshow(img)
, 长这样:
-
发现这个猫的样子没变, 但是颜色不太对, 这是因为OpenCV读取的图片颜色通道是按照BGR(蓝绿红)排列的, 一般图片通道都是按照RGB来排列的.为了正常的显示猫的图片, 我们要用OpenCV的图像显示方法:
cv2.imshow('cat', img)cv2.waitKey(0)cv2.destroyAllWindows()
我们可以把显示图片的方法封装成一个函数方便我们显示图片:
def cv_show(name, img): cv2.imshow(name, img) while True: key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows() break
3 保存图片
-
cv2.imwrite(filename, img[, params]): 使用imwrite保存图片.
- filename 路径+图片名.格式 ,例如:./cat_save.png
- img 想要保存的图像(mat类型的图像数据,ndarray)
- params 特定格式保存的参数编码,有默认值,一般不写
import cv2# 创建窗口,并调整大小cv2.namedWindow('img', cv2.WINDOW_NORMAL)cv2.resizeWindow('img', 640, 480)# 读取图片img = cv2.imread('./cat.jpeg')# 利用while循环优化退出逻辑while True: cv2.imshow('img', img) key = cv2.waitKey(0) if key == ord('q'): break elif key == ord('s'): cv2.imwrite('./cat_save.png', img) else: print(key) cv2.destroyAllWindows()
4 视频采集-摄像头/视频
4.1捕获摄像头
- 视频是由图片组成的, 视频的每一帧就是一幅图片, 一般是30帧, 表示一秒显示30张图片.
- cv2.VideoCapture(self, /, *args, kwargs)
-
self:可以捕获摄像头, 用数字来表示不同的设备
- 0:调用电脑自带摄像头
- 1:电脑有自带摄像头,然后外接了一个USB摄像头,想使用USB摄像头
-
如果是视频文件, 可以直接指定路径即可.
-
# 打开视频文件cap = cv2.VideoCapture('./1.mp4')# 打开摄像头cap = cv2.VideoCapture(0)
-
isOpened( ):检查是否正确打开
if cap.isOpened(): # 若打开成功 # 读取视频的一帧.返回标记和这一帧数据. True表示读到了数据, False表示没读到数据. ret, frame = cap.read()else: ret = False
-
循环读取视频每一帧数据
while True: # 可以读到内容ret返回True ret, frame = cap.read() # 读到最后frame就是空 if frame is None: break if ret == True: cv2.imshow('result', gray) # 0xFF == 27表示按esc退出键会退出 if cv2.waitKey(33) & 0xFF == 27: breakcap.release()cv2.destroyAllWindows()
-
read([, image])
- 参数不写。返回两个值(标记和帧数据), 第一个为状态值, 读到帧为True, 第二个值为视频帧
-
release( ) 释放资源
-
循环读取摄像头的每一帧数据
# 打开摄像头import cv2# 创建窗口,并调整大小cv2.namedWindow('video', cv2.WINDOW_NORMAL)cv2.resizeWindow('video', 640, 480)# 如果打开失败, 不会报错. # cap = cv2.VideoCapture(1)cap = cv2.VideoCapture(0)# 循环读取摄像头的每一帧# while True:while cap.isOpened(): # 若打开成功 # 读一帧数据, 返回标记和这一帧数据. True表示读到了数据, False表示没读到数据. ret, frame = cap.read() # 可以根据ret做个判断 if not ret: # 没读到数据, 直接退出 break # 显示数据 cv2.imshow('video', frame) # 按键退出 key = cv2.waitKey(10) # 这里给的参数不要写0,不然只会给一帧的数据然后一直保持静止 if key & 0xFF == ord('q'): break # 别忘了释放资源cap.release()cv2.destroyAllWindows()
4.2读取视频
-
循环读取视频每一帧数据
# 打开视频import cv2cv2.namedWindow('video', cv2.WINDOW_NORMAL)cv2.resizeWindow('video', 640, 480)# 如果打开失败, 不会报错. # cap = cv2.VideoCapture(1)# 打开视频, 输入视频的地址cap = cv2.VideoCapture('./1.mp4')# 循环读取摄像头的每一帧# while True:while cap.isOpened(): # 读一帧数据, 返回标记和这一帧数据. True表示读到了数据, False表示没读到数据. ret, frame = cap.read() # 可以根据ret做个判断 if not ret: # 没读到数据, 直接退出 break # 显示数据 cv2.imshow('video', frame) # 假如一个视频是30帧, 那么每张图之间要间隔多少毫秒 # 只能是整数 key = cv2.waitKey(1000 // 30) if key & 0xFF == ord('q'): break # 别忘了释放资源cap.release()cv2.destroyAllWindows()
5 视频录制
-
cv2.VideoWrite_fourcc( ) 用来设置需要保存视频的格式
- *‘mp4v’:mp4格式的视频
- *‘XVID’:avi格式的视频
-
cv2.VideoWriter( self, /, *args, kwargs) :
- 参数一为输出文件,要加后缀
- 参数二为多媒体文件格式(VideoWriter_fourcc)
- 参数三为帧率
- 参数四为分辨率,这个大小弄错了也不行,可打开自己电脑摄像头查看参数大小
-
write( ) 编码并写入缓存(每一帧数据)
-
release( ) 缓存内容写入磁盘, 并释放资源
完整视频录制代码:
import cv2cap = cv2.VideoCapture(0)# mp4格式的视频,解包操作,等用于'm','p','4','v'fourcc = cv2.VideoWriter_fourcc(*'mp4v')# avi格式的视频# fourcc = cv2.VideoWriter_fourcc(*'XVID')# 创建videowriter# 名称,传入录好的视频,视频帧数,视频分辨率# (640,480) 表示摄像头拍视频,这个大小弄错了也不行,主要是分辨率vw = cv2.VideoWriter('ywl_vedio.mp4', fourcc, 30, (640, 480))# vw = cv2.VideoWriter('ywl_vedio.avi', fourcc, 30, (640, 480))while cap.isOpened(): ret, frame = cap.read() if not ret: break # 写每一帧数据 vw.write(frame) cv2.imshow('frame', frame) if cv2.waitKey(30) == ord('q'): break # 别忘了releasecap.release()vw.release()cv2.destroyAllWindows()
智科专业小白,写博文不容易,如果喜欢的话可以点个赞哦!