根据opencv4.1官方文档学习记录

import numpy as np
import cv2 as cv

#  打开摄捕捉视频 函数参可以为设备的索引,也可以是视频文件名字
# 设备索引就是指定哪个摄像头的数字。
# 正常情况下,一个摄像头会被连接。
# 所以我简单地传0(或-1)。也可以通过传递1来选择第二个相机,
# 以此类推。在此之后,可以逐帧捕获。但是在最后,不要忘记释放俘虏。
cap = cv.VideoCapture(0)

# 检测是否捕捉成功 是返回 1
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    # cap.read()功能逐帧捕获
    # cap.read()返回布尔值(True/ False)。
    # 如果正确读取了帧,它将为True。因此,可以通过检查此返回值来检查视频的结尾。
    # 返回两个参数  第一个是布尔值代表是否读取到帧  第二个是一帧图像
    ret, frame = cap.read()
    # 如果正确读取帧,ret为True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # 我们在框架上的操作到这里
    # 赋予颜色,第一个参数是帧的名字  第二个参数是要显示的颜色
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    rgb = cv.cvtColor(frame, cv.COLOR_RGB2RGBA)
    # 显示结果帧e
    cv.imshow('frame', gray)
    cv.imshow('frame1', rgb)
    if cv.waitKey(500) == ord('q'):
        break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()

# cap.get() 和 cap.set()
# .get()一个参数,传入你想要获取的值 。 .set()两个参数,想要修改的参数名和值
# 你还可以使用cap.get(propId)方法访问该视频的某些功能,其中propId是0到18之间的一个数字。
# 每个数字表示视频的属性(如果适用于该视频),并且可以显示完整的详细信息在这里看到:cv::VideoCapture::get()。
# 其中一些值可以使用cap.set(propId,value)进行修改。value是你想要的新值。
#
# 例如,我可以通过cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)检查框架的宽度和高度。
# 默认情况下,它的分辨率为640x480。但我想将其修改为320x240。
# ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320) and ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240).


cap = cv.VideoCapture('output.avi')
while cap.isOpened():
    ret, frame = cap.read()
    # 如果正确读取帧,ret为True
    # 若为结尾则直接退出
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    cv.imshow('frame', gray)
    # cv.waitKey()是等待键入的时间,视频播放是按帧播放,所以等待时间会影响视频播放速度
    # 过小则视频播放很快 过大则视频播放很慢  为0则只显示一帧
    if cv.waitKey(25) == ord('q'):
        break
cap.release()
cv.destroyAllWindows()


cap = cv.VideoCapture(0)
# 定义编解码器并创建VideoWriter对象
fourcc = cv.VideoWriter_fourcc(*'MJPG')

# 定义保存图像的相关参数 文件路径 编解码器 帧率 图像大小
out = cv.VideoWriter('output.mp4', fourcc, 20.0, (640,  480))
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # 垂直翻转框架
    # <0 沿着Y轴翻转  =0 沿着X轴翻转   >0 沿着原点翻转
    frame = cv.flip(frame, 1)
    # 写翻转的框架
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# 完成工作后释放所有内容
cap.release()
out.release()
cv.destroyAllWindows()