OpenCv: Capture vídeo da câmera, leia quadros de vídeo e gravação de vídeo

Índice

1. Envolvendo funções OpenCv

2. O que é um quadro e o que representa o tamanho de um quadro?

3. A câmera adquire dados de vídeo

4. Grave e salve o vídeo


1. Envolvendo funções OpenCv

Do dispositivo, pode ser uma câmera ou um vídeo local, a função cv.VideoCapture() para obter o vídeo. O objetivo desta função é criar um objeto VideoCapture ou VideoWriter, e a leitura e escrita real é chamar read e write através do objeto criado. O vídeo pode estar em diferentes formatos, como AVI, MP4, MOV, etc. Esses formatos definem o método de codificação, resolução, taxa de quadros e outros parâmetros do arquivo de vídeo.

  • Função de gravação de vídeo cv.VideoWriter()
  • Ler vídeo/abrir câmera cv.VideoCapture()
  • Escrever vídeo cv.VideoWriter()
  • Open, determine se deve abrir isOpened () open()
  • Obter parâmetros, alterar parâmetros cv.VideoCapture.get(propId) cv.VideoCapture.set(propId, valor)
  • Lançar vídeo cv.VideoCapture.release()
     

2. O que é um quadro e o que representa o tamanho de um quadro?

 O componente básico de um vídeo é um quadro, uma série de imagens estáticas que são reproduzidas de maneira contínua a uma determinada taxa para formar uma imagem dinâmica, como 30 quadros por segundo. O número de quadros por segundo de um vídeo é chamado de taxa de quadros (Frame Rate), geralmente expressa em "fps" (Frames Per Second). Por exemplo, 30 fps significa que o vídeo contém 30 quadros de imagens por segundo. A taxa de quadros determina a suavidade e o realismo do vídeo. Taxas de quadros mais altas podem fazer com que os vídeos pareçam mais suaves porque atualizam as imagens mais rapidamente. Por exemplo, um vídeo de 60 fps parecerá mais suave do que um vídeo de 30 fps. Além disso, as taxas de quadros mais altas também reduzem o desfoque e a trepidação nos vídeos porque capturam melhor o movimento. Mas uma taxa de quadros mais alta resultará em arquivos maiores e codecs mais complexos porque mais quadros precisam ser processados. 30 quadros significa exibir 30 fotos em um segundo

3. A câmera adquire dados de vídeo

código:

import cv2 as cv

# 创建VideoCapture对象,用创建的对象去做之后的操作
cap = cv.VideoCapture(0)
# 检测有无摄像头正常使用
# 这是一个必要的验证,当cap为空的时候,后续调用会报错。
if not cap.isOpened():
    print("Cannot open camera")
    exit()

# 获取视频流是一个连续的循环过程,一直在获取,不是说获取到一帧就可以了
while True:
    # 通过创建的VideoCapture对象逐帧获取视频,会返回两个参数,ret返回true和false代表是否正常获取到帧,以及视频是否结束
    # frame代表获取到的帧
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("不能正常读取视频帧")
        break
    # 将获取到的视频帧,也就是一幅幅图像,转为灰度图
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 展示
    cv.imshow('frame', gray)
    # q退出获取视频流
    if cv.waitKey(1) == ord('q'):
        break
# 释放资源
cap.release()
cv.destroyAllWindows()

4. Grave e salve o vídeo

código mostra como abaixo:

import cv2


# 视频的本质上就是由一幅一幅的图片组成
# 24帧 60帧(表示一秒显示60张图片)


# 创建一个窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)

# 打开摄像头
cap = cv2.VideoCapture(0)
# 打开视频
# cap = cv2.VideoCapture('1.mp4')
# 保存视频
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
vw = cv2.VideoWriter('123.mp4',fourcc,30,(640,480))



# 循环读取摄像头的每一帧
while True:
    # 读一帧数据,返回标记,True表示读到了数据,False表示没读到数据
    ret,frame = cap.read()

    #可以根据ret做个判断
    if not ret:
        #没读到数据,直接退出
        break
    vw.write(frame)
#     显示数据
    cv2.imshow('video',frame)

    key = cv2.waitKey(1000 // 30)
    if key & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
vw.release()
cv2.destroyAllWindows()


おすすめ

転載: blog.csdn.net/weixin_64443786/article/details/131721735