OpenCV读取、保存视频

1.从相机中读取视频

①用cv.VideoCapture()创建一个对象来绑定所要选择的摄像头。

  • 参数为0、-1:选择第一个摄像头(一般是电脑上自带的摄像头)
  • 参数为1:选择第二个摄像头

②用isOpened()检查所创建的VideoCapture对象是否被初始化,若为True,则已经初始化。若为False,则需要使用open()打开。

③用read()进行逐帧捕获,这个函数会返回两个值,第一个值是布尔类型,若为True,则读帧正确。第二个值即为读取的帧。

④最后将帧使用cv.imshow()进行显示即可。

⑤进行完所有的操作,要对摄像头使用release()进行释放。

⑥在读取视频时可以用get(propld)访问视频的一些属性,其中的一些值可以使用set(propld, value)进行修改。具体的propld如下:

序号NameDescription
VideoCapture.get(0)CV_CAP_PROP_POS_MSEC视频文件的当前位置(播放)以毫秒为单位
VideoCapture.get(1)CV_CAP_PROP_POS_FRAMES基于以0开始的被捕获或解码的帧索引
VideoCapture.get(2)CV_CAP_PROP_POS_AVI_RATIO视频文件的相对位置(播放):0=电影开始,1=影片的结尾
VideoCapture.get(3)CV_CAP_PROP_FRAME_WIDTH在视频流的帧的宽度
VideoCapture.get(4)CV_CAP_PROP_FRAME_HEIGHT在视频流的帧的高度
VideoCapture.get(5)CV_CAP_PROP_FPS帧速率/帧数/fps
VideoCapture.get(6)CV_CAP_PROP_FOURCC编解码的4字-字符代码
VideoCapture.get(7)CV_CAP_PROP_FRAME_COUNT视频文件中的帧数
VideoCapture.get(8)CV_CAP_PROP_FORMAT返回对象的格式
VideoCapture.get(9)CV_CAP_PROP_MODE返回后端特定的值,该值指示当前捕获模式
VideoCapture.get(10)CV_CAP_PROP_BRIGHTNESS图像的亮度(仅适用于照相机)
VideoCapture.get(11)CV_CAP_PROP_CONTRAST图像的对比度(仅适用于照相机)
VideoCapture.get(12)CV_CAP_PROP_SATURATION图像的饱和度(仅适用于照相机)
VideoCapture.get(13)CV_CAP_PROP_HUE色调图像(仅适用于照相机)
VideoCapture.get(14)CV_CAP_PROP_GAIN图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
VideoCapture.get(15)CV_CAP_PROP_EXPOSURE曝光(仅适用于照相机)
VideoCapture.get(16)CV_CAP_PROP_CONVERT_RGB指示是否应将图像转换为RGB布尔标志
VideoCapture.get(17)CV_CAP_PROP_WHITE_BALANCE× 暂时不支持
VideoCapture.get(18)CV_CAP_PROP_RECTIFICATION立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
VideoCapture.get(19)CAP_PROP_MONOCHROME
VideoCapture.get(20)CAP_PROP_SHARPNESS
VideoCapture.get(21)CAP_PROP_AUTO_EXPOSUREDC1394:由相机完成的曝光控制,用户可以使用此功能调整参考水平。
VideoCapture.get(22)CAP_PROP_GAMMA
VideoCapture.get(23)CAP_PROP_TEMPERATURE
VideoCapture.get(24)CAP_PROP_TRIGGER
VideoCapture.get(25)CAP_PROP_TRIGGER_DELAY
VideoCapture.get(26)CAP_PROP_WHITE_BALANCE_RED_V
VideoCapture.get(27)CAP_PROP_ZOOM
VideoCapture.get(28)CAP_PROP_FOCUS
VideoCapture.get(29)CAP_PROP_GUID
VideoCapture.get(30)CAP_PROP_ISO_SPEED
VideoCapture.get(31)CAP_PROP_BACKLIGHT
VideoCapture.get(32)CAP_PROP_PAN
VideoCapture.get(33)CAP_PROP_TILT
VideoCapture.get(34)CAP_PROP_ROLL
VideoCapture.get(35)CAP_PROP_IRIS
VideoCapture.get(36)CAP_PROP_SETTINGS弹出视频/摄像机过滤器对话框(注意:当前仅DSHOW后端支持。属性值将被忽略)
VideoCapture.get(37)CAP_PROP_BUFFERSIZE
VideoCapture.get(38)CAP_PROP_AUTOFOCUS
VideoCapture.get(39)CAP_PROP_SAR_NUM样本长宽比:num / den(数字)
VideoCapture.get(40)CAP_PROP_SAR_DEN样品长宽比:num / den(den)
VideoCapture.get(41)CAP_PROP_BACKEND当前后端(枚举VideoCaptureAPI)。只读属性。
VideoCapture.get(42)CAP_PROP_CHANNEL视频输入或频道号(仅适用于支持的摄像机)
VideoCapture.get(43)CAP_PROP_AUTO_WB启用/禁用自动白平衡
VideoCapture.get(44)CAP_PROP_WB_TEMPERATURE白平衡色温
VideoCapture.get(45)CAP_PROP_CODEC_PIXEL_FORMAT(只读)编解码器的像素格式。4个字符的代码-请参见VideoWriter :: fourcc。AV_PIX_FMT_ *的子集;如果未知,则为 -1

代码示例:

import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.read():
    print("无法绑定摄像头")
    exit()
while True:
    ret, frame = cap.read()
    if not ret:
        print("截取帧失败")
        break
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    cv.imshow('prac', gray)
    if cv.waitKey(1) == ord('q'):
        break
print(cap.get(3))
r = cap.set(3, 320)
print(r)
cap.release()
cv.destroyAllWindows()

2.从文件中读取视频

从文件中读取视频和上述过程一样,唯一不同的是从指定路径中获取VideoCapture对象。

代码示例:

import cv2 as cv
cap = cv.VideoCapture('C:\\Users\\dell\\Desktop\\prac files\\迪迦变身.avi')
while cap.isOpened():
    ret, frame = cap.read()
    if ret == False:
        print("视频读取失败")
        break
    cv.imshow('prac', frame)
    if cv.waitKey(25) == ord('q'):
        break
cap.release()
cv.destroyAllWindows()

3.保存视频

①用cv.VideoWriter()创建一个对象来接收视频帧。

  • 参数一:输出视频名称
  • 参数二:压缩帧格式,一般是
    CV_FOURCC(‘P’,‘I’,‘M’,‘1’) MPEG-1 codec
    CV_FOURCC(‘M’,‘J’,‘P’,‘G’) motion-jpeg codec (does not work well)
    CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) MPEG-4.2 codec
    CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) MPEG-4.3 codec
    CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) MPEG-4 codec
    CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) H263 codec
    CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) H263I codec
    CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) FLV1 codec
  • 参数三:保存的视频文件帧率
  • 参数四:视频文件宽高
  • 参数五:设置视频文件为彩色或灰度(默认为彩色)

②将之前接收到的视频帧使用flip()进行翻转处理(这一步是为了区别接收前的原视频,不加也可)。flip()有两个参数,分别是要接收的视频帧和对帧的处理方式,0为垂直翻转,1为水平翻转,-1为中心翻转。

③这里要使用cv.resize()对切割下来的每一帧进行分辨率的调整,使得每一帧的分辨率和cv.VideoWriter()的分辨率保持一致。

④用write()将接收到的视频帧进行写入,函数参数即为视频帧。

⑤用imshow()进行视频播放。

⑥进行完所有的操作,要对所有对象用release()进行释放。

代码示例:

import cv2 as cv
cap = cv.VideoCapture('C:\\Users\\dell\\Desktop\\prac files\\迪迦变身.avi')
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('迪迦反转.avi', fourcc, 20.0, (1280, 720))
while cap.isOpened():
    ret, frame = cap.read()
    if ret == False:
        break
    frame = cv.flip(frame, 0)
    frame = cv.resize(frame,(1280, 720))
    out.write(frame)
    cv.imshow('prac', frame)
    if cv.waitKey(25) == ord('q'):
        break
cap.release()
out.release()
cv.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值