OpenCV-Python学习(二):视频入门

目标:

  • 1.读取视频
  • 2.显示视频
  • 3.保存视频

读取、显示和保存视频

示例:

import cv2

# 1.创建VideoCapture对象-->用于读取视频
# 1)读取摄像头
# cap = cv2.VideoCapture(0)
# 2)视频流地址:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
cap = cv2.VideoCapture("http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8")
# 3)视频文件路径:D:/迅雷下载/诛仙.mkv
# cap = cv2.VideoCapture("D:/迅雷下载/诛仙.mkv")

if not cap.isOpened():  # 判断cap是否成功捕获
    print("Cannot open camera")
    exit()

# 2.定义解码器并创造VideoWrite对象-->用于保存视频
fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 定义解码器
# 创建视频流写入对象VideoWriter,VideoWriter_fourcc为视频编解码器,30为帧播放速率
# (1920, 1080)为视频帧大小,要与下面frame的大小一致(否则会导致保存的视频无法播放)
out = cv2.VideoWriter('D:/迅雷下载/output.avi', fourcc, 30, (1920, 1080))

while True:
    # 3.读取视频
    ret, frame = cap.read()  # ret表示是否成功获取帧,视频读到结尾,ret就为False。frame是每一帧的图像。

    if not ret:  # 如果未成功读取帧,就退出循环
        print("Can't receive frame (stream end?). Exiting ...")
        break

    # 4.显示视频图片
    cv2.namedWindow("frame", cv2.WINDOW_NORMAL)  # 创建一个窗口,可调整大小
    cv2.imshow("frame", frame)  # 展示视频图片

    # 5.保存视频图片
    # frame = cv2.flip(frame, 0)  # 沿x轴方向翻转图片并保存
    out.write(frame)  #保存视频图片
    print(frame.shape)  # (1080, 1920, 3)

    # 按'q'键退出循环
    if cv2.waitKey(41) & 0xFF == ord('q'):
        break

cap.release()  # 释放VideoCapture对象
out.release()  # 释放VideoWriter对象
cv2.destroyAllWindows()  # 销毁所有窗口

函数分析:

  • cv2.VideoCapture() 创建VideoCapture对象-->用于读取视频
    它的参数可以是设备索引或视频文件的名称。
    参数是0,表示打开笔记本的前置摄像头。
    参数是1,表示打开笔记本的后置摄像头。
    参数是视频文件路径则采集相应视频。

  • cap.isOpened() 检查cap是否已初始化

  • VideoWriter_fourcc(c1, c2, c3, c4) 定义解码器
    FourCC:http://en.wikipedia.org/wiki/FourCC 是用于指定视频编解码器的4字节代码。可用代码列表可在fourcc.org中:http://www.fourcc.org/codecs.php 找到。它取决于平台。遵循编解码器对我来说效果很好。

    • 在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG会生成大尺寸的视频。X264会生成非常小的尺寸的视频)
    • 在Windows中:DIVX(尚待测试和添加)
    • 在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。

    FourCC代码作为MJPG的cv.VideoWriter_fourcc('M','J','P','G')or cv.VideoWriter_fourcc(*'MJPG')传递。

  • cv2.VideoWriter() 创建一个VideoWriter对象-->用于保存视频
    第一个参数表示保存的视频文件名
    第二个参数为视频解码器
    第三个参数为帧播放速度
    第四个参数为视频帧大小

  • ret, frame = cap.read() 按帧读取视频,一帧就是一张图片。
    ret是bool类型,表示是否成功获取帧。如果视频读到结尾,那么ret就为False。
    frame 是每一帧的图像,是一个三维矩阵numpy.ndarray。

  • cap.release() 释放VideoCapture对象

  • out.release() 释放VideoWriter对象

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容