D01 - 视频处理

使用 opencv 从摄像头连续读取图像

OpenCV 读写视频?

  • VideoCapture 类用于读取视频文件、视频流或从摄像机捕获视频,VideoWriter 类用于视频文件的写入和保存
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #capRead = cv2.VideoCapture('.../Cars.mp4')   # 从文件读取
    capRead = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 从摄像头读取,0 为设备索引号
    #capRead = cv2.VideoCapture('.../Image_sequence/Cars%04d.jpg') # 从图片序列中读取
    # 设置写入视频图像的高,宽,帧速率和总帧数
    width = int(capRead.get(cv.CAP_PROP_FRAME_WIDTH)) # 960
    height = int(capRead.get(cv.CAP_PROP_FRAME_HEIGHT)) # 540
    fps = round(capRead.get(cv.CAP_PROP_FPS)) # 30
    frameCount = int(capRead.get(cv.CAP_PROP_FRAME_COUNT)) # 1826
    print(height, width, fps, frameCount)
    # 创建写入视频对象
    # fourcc = cv.VideoWriter_fourcc('X', 'V', 'I', 'D') # 编码器设置 XVID
    fourcc = cv.VideoWriter_fourcc(*'XVID') # 'X','V','I','D' 简写为 *'XVID'
    vedioWrite = "../images/nasa.avi" # 写入视频文件的路径
    capWrite = cv.VideoWriter(vedioWrite, fourcc, fps, (width, height))
    # 读取视频文件,抽帧写入视频文件
    frameNum = 0 # 视频帧数初值
    timef = 30 # 设置抽帧间隔
    while capRead.isOpened(): # 检查视频捕获是否成功
    ret, frame = capRead.read() # 读取下一帧视频图像
    if ret is True:
    frameNum += 1 # 读取视频的帧数
    cv.imshow(vedioRead, frame) # 播放视频图像
    if (frameNum % timef == 0): # 判断抽帧条件
    capWrite.write(frame) # 将当前帧写入视频文件
    if cv.waitKey(1) & 0xFF == ord('q'): # 按 'q' 退出
    break
    else:
    print("Can't receive frame at frameNum {}".format(frameNum))
    break

多帧图像(动图)的读取与保存?

  • 多帧图像是将多幅图像或帧数据保存在单个文件中,也称为多页图像或图像序列,主要用于对时间或场景上相关图像集合进行操作的场合。例如,时间序列图像是动态图像(动图),可以形成简单的动画效果;计算机 X 线断层扫描图像 (CT)是空间序列图像。常用的多帧图像格式有 GIF、PNG、TIFF
  • 函数 cv. Imreadmulti () 用于从指定的多帧图像文件中读取多幅图像
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 读取多帧图像文件1
    imgMulti = cv.imreadmulti("../images/imgList.tiff") # 读取多帧图像文件
    print("len(imgList): ", len(imgList)) # imgList 是列表
    # 读取多帧图像文件2
    img1 = cv.imread("../images/FVid1.png") # 读取彩色图像 FVid1.png
    img2 = cv.imread("../images/FVid2.png") # 读取彩色图像 FVid2.png
    img3 = cv.imread("../images/FVid3.png") # 读取彩色图像 FVid3.png
    img4 = cv.imread("../images/FVid4.png") # 读取彩色图像 FVid4.png
    imgList = [img1, img2, img3, img4] # 生成多帧图像列表
    # 保存为多帧图像文件
    saveFile = "../images/imgList.tiff" # 保存文件的路径
    ret = cv.imwritemulti(saveFile, imgList)

OpenCV 同时读取两个摄像头的视频流?

  • Cv 2. VideoCapture 初始化时,指定摄像头即可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 使用不同摄像头初始化两个cv2.VideoCapture对象
    cap0 = cv2.VideoCapture(0)
    cap1 = cv2.VideoCapture(1)
    ret = cap0.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
    ret = cap0.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
    ret = cap1.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
    ret = cap1.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
    while cap0.isOpened() and cap1.isOpened():
    ret0, frame0 = cap0.read()
    ret1, frame1 = cap1.read()
    if ret0:
    cv2.imshow('frame0', frame0)
    cv2.setWindowTitle('frame0','On Top')
    if ret1:
    cv2.imshow('frame1', frame1)
    cv2.moveWindow('frame1', x=320, y=40)
    key = cv2.waitKey(delay=2)
    if key == ord("q"):
    break

参考: