OpenCV 学习笔记(四)——简单的视频操作

简单的视频操作

一. 学习目标

  • 学会读取视频,播放视频以及保存视频
  • 学会读取摄像头并进行显示
  • 学习函数:cv.VideoCapture(), cv.VideoWriter()

二. 读取摄像头图像

  • 想要从摄像头获取图像,我们首先需要创建一个 VideoCapture 对象,它的参数可以是设备索引或视频文件的路径。设备索引是指定那个摄像机的编号。相机捕获完成之后,我们需要使用 release() 释放设备。
  • 下面是一个简单的从摄像头读取图像的代码:
    import numpy as np
    import cv2 as cv
    
    cap = cv.VideoCapture(0)    # 创建 VideoCapture 对象,设置从摄像头获取图像
    if not cap.isOpened():       # 相机打开失败
        print("相机打开失败")
        exit()                  # 退出程序
    
    while True:
        # 一帧一帧的捕获,如果正确读取帧,ret 返回 True
        ret, frame = cap.read()
    
        if not ret:       # 读取帧出错
            print("不能接收帧,退出中 ...")
            break
    
        # 显示图像,循环显示,相当于播放视频
        cv.imshow("frame", frame)
        if cv.waitKey(1) == ord('q'):       # 按下 Q 键退出
            break
    cap.release()       # 在结尾的时候,一定要释放设备
    cv.destroyAllWindows()      # 摧毁所有创建的窗口
    
  • cap.isOpened() 判断相机是否初始化成功。如果初始化成功,返回 True 。
  • cap.read() 用来获取是否从摄像头获取图像。如果成功获取,返回布尔值 True ,以及读取的图像。

三. 播放视频文件

  • 它的步骤与从摄像头读取大体相同,只是将摄像机索引更换为视频路径。
  • 在播放视频的时候,应选取适当的 cv.waitKey() 参数。如果参数过小,视频播放速度将会变得很快;参数过大,视频播放速度会变慢。正常情况下,我们一般设置为 25 。
  • 下面是一个简单播放视频文件的代码:
    import numpy as np
    import cv2 as cv
    
    # 创建 VideoCapture 类
    cap = cv.VideoCapture("./test_video/vtest.avi")  
    
    while cap.isOpened():       # 视频播放完毕,退出循环
        ret, frame = cap.read()     # 读取视频数据
    
        if not ret:                 # 读取数据出错
            print("视频解析失败,退出中 ...")
            break
    
        cv.imshow("frame", frame)    # 显示图片
        if cv.waitKey(25) == ord('q'):   # 控制播放速度,按 Q 键退出
            break
    cap.release()       # 关闭视频
    cv.destroyAllWindows()  # 摧毁所有创建的窗口
    
  • 注意
    确保安装了正确版本的 ffmpeg 或 gstreamer 。有时,使用 Video Capture 失败,主要是由于 ffmpeg / gstreamer 安装错误。

四. 保存视频

  • 如果我们想要保存图片,非常简单,仅仅使用 cv.imread() 就可以了。但想要保存视频,就不是那么一件容易的事了。
  • 在保存视频的时候,我们需要创建一个 VideoWriter 对象。在创建 VideoWriter 对象时,我们需要传递的参数有:输出文件名,指定的 FourCC 编码,fps(frams per seconde 每秒的帧数),帧大小以及 isColor flag 。如果 isColor 为 Ture ,编码器使用彩色框。
  • FourCC 是一个 4 字节的代码,用于指定视频编解码器。在 http://fourcc.org 网站上,你可以找到可用的代码列表。它取决于平台。在保存视频的时候,遵循编解码器,将会起到很好的效果很好。
    • 在 Fedora 上:DIVX, XVID, MJPG, X264, WMV1, WMV2
    • 在 Windows 上:DIVX
    • 在 OSX 上:MJPG (.mp4), DIVX (.avi), X264 (.mkv)
  • 对于 MJPG ,FourCC 代码以 cv.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) 或 cv.VideoWriter_fourcc(*‘MJPG’) 的形式传递。
  • 接下来,我们就是用一段简单的代码,来演示如何保存视频文件
    import numpy as np
    import cv2 as cv
    
    cap = cv.VideoCapture(0)        # 打开相机
    
    fourcc = cv.VideoWriter_fourcc(*'DIVX')     # 定义编码对象
    # 创建 VideoWriter 对象
    out = cv.VideoWriter("output.avi", fourcc, 20.0 ,(640, 480))
    
    while cap.isOpened():
        ret, frame = cap.read() # 读取帧
    
        if not ret:         # 帧的读取结果有误
            print("不能接受数据帧。退出中 ...")
            exit
    
        out.write(frame)        # 写入帧
    
        cv.imshow("frame", frame)   # 显示图像
    
        if cv.waitKey(1) == ord('q'):   # 按 Q 退出
            break
    
    # 工作完成后,释放所有内容
    cap.release()
    out.release()
    
    cv.destroyAllWindows()  # 摧毁窗口
    

五. 结语

  • 如果其中有不对的地方或是需要改进的地方,请指正。
  • 联系方式 email:lwl595ll@163.com 。
  • 本文到这就结束了,谢谢大家观看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值