计算机视觉OpenCv学习系列:第九部分、视频读写

本文介绍视频标准与格式,包括标清SD、高清HD及超高清UHD,并详细讲解视频读写函数,通过具体代码示例演示如何利用OpenCV进行视频文件的读取与保存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一节、视频读写处理

1.视频标准与格式


视频标准与格式:

  • SD(Standard Definition)标清480P
  • HD(High Definition)高清720P/1080P
  • UHD(Ultra High Definition)超高清4K/2160P

分辨率表示

  • SD-640x480, 704x480, 720x480, 848x480等
  • HD-960x720,1280x720,1440x1080,1920x1080
  • UHD-4K,2160P

图片压缩的时候清晰度选取越高,所占内存也越大。

在这里插入图片描述

2.视频读写与函数


在这里插入图片描述

  • filename表示视频文件
  • Index表示USB摄像头或者web camera的索引,index = 0表示电脑自带的摄像头
  • apiPreference = CAP_ANY意思自动决定第三方视频库如: cv.CAP_FFMPEG, cv.CAP_DSHOW,OpenCV并没有自己集成视频的编码与解码,所以需要自己指定使用哪个第三方库来完成视频读写。多数情况不设这个参数,让电脑自行选择。
# VideoCaput的get方法
1.cv.CAP_PROP_FRAME_WIDT  # 每一帧的宽
2.cv.CAP_PROP_FRAME_HEIGHT  # 每一帧的高度
3.cv.CAP_PROP_FPS  # 每一秒多少张图(帧数)
# 帧越高计算机处理能力越强,一秒钟30帧观感比较好,当一秒超过3帧的时候我们就认为他是连续播放图片(视频)
4.cv.CAP_PROP_FOURCC  # 获取视频编码格式(MP4,AVI等等)
5.cv.CAP_PROP_FRAME_COUNT  # 视频流总帧数

cv.VideoWriter( 
filename, 保存文件名称
fourcc, 编码方式
fps,  帧率
frameSize 视频帧大小,与实现大小相符(取决于接收方电脑1s能跑多少帧)
[, isColor]	) ->	<VideoWriter object>

当视频无法保存时可能是fps帧率=0,或者设定的framesize大小与电脑实际运行返回的framesize大小不一致。

3.代码练习与测试


注意:摄像头的权限控制与释放,当我们使用完摄像头之后要释放资源。

  • cap.release()
  • writer.release()
# 视频读写处理
def video_demo():
    # 读取视频文件
    cap = cv.VideoCapture(r"F:\python\opencv-4.x\samples\data\vtest.avi")
    # 获取视频帧率fps
    fps = cap.get(cv.CAP_PROP_FPS)
    # 获取每帧的宽度
    frame_w = cap.get(cv.CAP_PROP_FRAME_WIDTH)
    # 获取每帧的高度
    frame_h = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
    print("fps:", fps, "frame_w", frame_w, "frame_h", frame_h)
    # 编码方式
    # 指定编码方式为vp09
    # fourcc = cv.VideoWriter_fourcc(*'vp09')
    # 计算机自动获取编码格式
    fourcc = cap.get(cv.CAP_PROP_FOURCC)
    # 注意将编码格式fourcc转换成int类型
    # 定义写入一个视频
    writer_mp4 = cv.VideoWriter('output.mp4', int(fourcc), fps, (int(frame_w), int(frame_h)))
    # 循环读取图片完成视频
    while True:
        # 摄像头读取,ret为是否成功打开摄像头,true,false。 frame为视频的每一帧图像
        ret, frame = cap.read()
        if ret is not True:
            break
        cv.imshow("frame", frame)
        # 间隔1ms播放下一帧
        c = cv.waitKey(1)
        if c == 27:
            break
        # 写入视频帧,注意初始的帧数要和实际返回帧数一致
        writer_mp4.write(frame)

    # 释放资源
    cap.release()
    writer_mp4.release()

    cv.waitKey(0)
    cv.destroyAllWindows()
    # 视频文件执行之后会有警告但是不影响使用

结果示例:

在这里插入图片描述

# 调用摄像头读写
def video_face_demo():
    # 程序执行开始时间
    a = time.time()
    print(a)
    # 读取视频文件
    cap = cv.VideoCapture(0)
    # # 更改分辨率大小和fps大小
    # cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
    # cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 960)
    # cap.set(cv2.CAP_PROP_FPS, 70)
    # resize = (int(cap.get(cv.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))
    # print(resize)

    # 获取视频帧率fps
    fps = cap.get(cv.CAP_PROP_FPS)
    # 获取每帧的宽度
    frame_w = cap.get(cv.CAP_PROP_FRAME_WIDTH)
    # 获取每帧的高度
    frame_h = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
    print("fps:", fps, "frame_w", frame_w, "frame_h", frame_h)
    # 记录调用时长
    print(time.time() - a)
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
    while True:
        # 获取每一帧的帧率
        fps = cap.get(cv.CAP_PROP_FPS)
        print(fps)
        # 摄像头读取,ret为是否成功打开摄像头,true,false。 frame为视频的每一帧图像
        ret, frame = cap.read()
        # 摄像头是和人对立的,将图像垂直翻转
        frame = cv2.flip(frame, 1)
        cv.imshow("video", frame)
        # 10ms显示一张图片
        c = cv.waitKey(10)
        if c == 27:
            break

    # 释放资源
    cap.release()
    cv.waitKey(0)
    cv.destroyAllWindows()
    # 视频文件执行之后会有警告但是不影响使用

学习参考

本系列所有OpenCv相关的代码示例和内容均来自博主学习的网站:opencv_course

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Liuyc-Code boy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值