opencv-python(二):视频操作

0. 目标

  • 读取、显示和保存视频文件
  • 从摄像头获取并显示视频

1. 摄像头捕获视频

  • cv2.VideoCapture(mode):mode可以是视频文件,也可以是摄像头设备
  • 数字:代表设备索引号,通常单个摄像头,则0就是该摄像头
  • 视频文件路径:视频文件
cap=VideoCapture(0) #使用我的笔记本内置摄像头,创建了cap这样一个对象
  • cap.isOpend():摄像头是否正确打开,返回值为布尔值类型

  • cap.open():打开摄像头

  • cap.read():返回两个量,第一个表示帧读取是否正确(True/False),第二个表示读取到的帧图像

import cv2

cap=cv2.VideoCapture(0) #使用我的内置摄像头创建视频对象cap

if not cap.isOpened(): # 如果摄像头没打开,则打开摄像头
    cap.open()

ret,frame=cap.read() #获取帧图像
if ret:  # 如果帧图像获取正确,则打印帧图像
    cv2.imshow("image",frame)
    cv2.waitKey(0)
    cv2.destroyWindow("image")
  • cap.get(propId):获取视频的一些参数信息,propId代表你像了解哪些信息:
propId内容
0视频文件的当前位置(播放)以毫秒为单位
1基于以0开始的被捕获或解码的帧索引
2视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
3在视频流的帧的宽度
4在视频流的帧的高度
5帧速率
6编解码的4字-字符代码
7视频文件中的帧数
8返回对象的格式
9返回后端特定的值,该值指示当前捕获模式
10图像的亮度(仅适用于照相机)
11图像的对比度(仅适用于照相机)
12图像的饱和度(仅适用于照相机)
13色调图像(仅适用于照相机)
14图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
15曝光(仅适用于照相机)
16指示是否应将图像转换为RGB布尔标志
17× 暂时不支持
18立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
  • cap.set(propId,value):如果你想修改上方的这些值,可以通过传入propId和value来进行修改
  • cap=VideoCapture():上方已经讲过,这里讲述传入视频文件;当我们传入视频文件时,其实可以通过waitKey来控制视频的播放速度
cap=cv2.VideoCapture("lx.mp4")  # 读取视频

while True:
    ret,frame=cap.read() 
    if ret:
        cv2.imshow("",frame)
        cv2.waitKey(250)  #等待250ms后,执行下一步(从而放慢了视频的播放速度)

2. 写入视频文件

  • videowrite=cv2.VideoWrite(file,fourcc,fps,shape,isColor):创建一个视频写入对象:

  • file:定义一个文件名

  • fourcc:指定编码模式(但是以数值形式传入,故要用下方这个函数)

  • fps:帧率

  • shape:帧图像的大小,用一个元组指定(整形)

  • isColor:是否以彩色保存,布尔值

  • cv2.VideoWriter_fourcc(c1,c2,c3,c4):将编码模式转为数值型

参数编码类型文件后缀名
cv2.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’)该参数是YUV编码类型.avi
cv2.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’)该参数是MPEG-1编码类型.avi
cv2.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’)该参数是MPEG-4编码类型.avi
cv2.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’)该参数是Ogg Vorbis.ogv
cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’)该参数是Flash视频.flv
# 创建一个视频写入对象:结束时保存为cam.avi,编码模式I420,帧率为25,视频帧尺寸为256*256
videowrite = cv2.VideoWriter("cam.avi", cv2.VideoWriter_fourcc('I', '4', '2', '0'), 25, (256,256))
  • videowrite.write(frame):将frame图像写入视频写入对象中(要释放后才正式保存)
# 将摄像头视频保存为cam.avi
import cv2

cap = cv2.VideoCapture(0) # 使用内置摄像头并创建视频对象

weight=int(cap.get(3)) # 获取摄像头宽和高
high=int(cap.get(4))

# 创建视频写入对象
videowrite = cv2.VideoWriter("cam.avi", cv2.VideoWriter_fourcc('I', '4', '2', '0'), 100, (weight,high))

if not cap.isOpened(): 
    cap.open()

while True:
    ret, frame = cap.read()
    if ret:
        videowrite.write(frame) #将当前帧写入videowrite对象中
        cv2.imshow("", frame)
        k = cv2.waitKey(25) # 等待25ms
        if k == 27:  # 如果按ESC则推迟
            break
            
videowrite.release() #释放视频写入对象,才正式保存cam.avi
cap.release()  # 释放视频对象

cv2.destroyAllWindows()

可能的bug

  1. 保存后视频文件打开没视频,文件大小很小:建议检查创建视频写入对象时帧图像的大小是否和摄像头大小一样
  2. pycharm中出现警告:~SourceReaderCB terminating async callback,放一篇建议博客
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值