[opencv+procesamiento de imagen] (Características de Gui en OpenCV) Cámara 1-1: capturar video de cámara, leer cuadros de video, grabar video

La dirección total de la biblioteca de códigos de esta columna La ruta del código https://github.com/xiawei20161308104/xv_opencv_tutorials
de esta sección

  1. xv_opencv_tutorials/VideoRelated/get_started_with_videos.py
  2. xv_opencv_tutorials/VideoRelated/get_and_set_video.py
  3. xv_opencv_tutorials/VideoRelated/save_video.py

Consulte el sitio web oficialhttps://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html

0. Las nuevas funciones de opencv involucradas en esta sección

  • Desde el dispositivo, puede ser una cámara o un video local, la función de obtener video cv.VideoCapture()❗️Esta función es crear un objeto VideoCaptureo VideoWriter, la lectura y escritura real es llamar a leer y escribir a través del objeto creado. El video puede estar en diferentes formatos, como AVI, MP4, MOV, etc. Estos formatos definen el método de codificación, la resolución, la velocidad de fotogramas y otros parámetros del archivo de video.
  • función de escritura de vídeocv.VideoWriter()
  • leer vídeocv.VideoCapture.read()
  • escribir vídeocv.VideoWriter.write(frame)
  • Abrir, determinar si abririsOpened () open()
  • Obtener parámetros, cambiar parámetroscv.VideoCapture.get(propId) cv.VideoCapture.set(propId, value)
  • lanzamiento de vídeocv.VideoCapture.release()

1. ¿Qué es un vídeo?

1️⃣ Qué es un marco, cuál es la velocidad del marco y qué lo afecta

El componente básico de un video es un cuadro , una serie de imágenes fijas que se reproducen de manera continua a una determinada velocidad para formar una imagen dinámica, como 30 cuadros por segundo. La cantidad de fotogramas por segundo de un video se denomina velocidad de fotogramas (Frame Rate), generalmente expresada en "fps" (Frames Per Second). Por ejemplo, 30 fps significa que el video contiene 30 cuadros por segundo . La velocidad de fotogramas determina la suavidad y el realismo del vídeo. Las velocidades de cuadro más altas pueden hacer que los videos parezcan más fluidos porque actualizan las imágenes más rápidamente. Por ejemplo, un video de 60 fps se verá mejor que uno de 30 fps. Además, las velocidades de cuadro más altas también reducen el desenfoque y la vibración en los videos porque capturan mejor el movimiento. Pero una velocidad de fotogramas más alta dará como resultado archivos más grandes y códecs más complejos porque es necesario procesar más fotogramas.

En general, elegir la velocidad de fotogramas correcta puede mejorar su experiencia de visualización de videos y garantizar las mejores imágenes posibles. Por lo general, las películas y los programas de televisión tienen una velocidad de fotogramas de 24 fps o 30 fps, mientras que los juegos y las animaciones suelen tener una velocidad de fotogramas de 60 fps, y ahora son comunes los 120 fps por lo general.

2️⃣Qué es un cuadro, qué es una resolución de video y con qué se relaciona la resolución

Cada cuadro está formado por píxeles, la unidad más pequeña de una imagen que puede contener información de color y brillo. La resolución de video se refiere a la cantidad de píxeles por cuadro en un video , generalmente expresado en píxeles horizontales y verticales. Por ejemplo, un video con una resolución de 1920x1080 significa que cada fotograma tiene 1920 píxeles horizontales y 1080 píxeles verticales. La resolución depende de los dispositivos de captura y reproducción.
Resolución de la cámara: La resolución de la cámara determina el número de píxeles en cada cuadro del video. Las cámaras de alta resolución capturan más píxeles, lo que da como resultado un video de mayor resolución.
Resolución del dispositivo de reproducción: La resolución del dispositivo de reproducción determina la resolución final del video. Si la resolución del video es más alta que la del dispositivo de reproducción, el video se reducirá para adaptarse al dispositivo de reproducción, lo que puede resultar en imágenes distorsionadas y borrosas.

2. Obtenga video de la cámara

1️⃣Pasos

  1. Cree un objeto primero VideoCapture, y su parámetro es el índice del dispositivo o el nombre del archivo de video. El índice del dispositivo solo se usa para especificar el número de la cámara. Por lo general, escriba 0 para representar la cámara predeterminada de la computadora portátil. Si tiene una cámara externa, debe pasar 1 para seleccionar las segundas cámaras, y así sucesivamente.
  2. Después de eso, puedes crear 逐帧获取una imagen.
  3. Lo último 释放资源es crear el objeto VideoCapture.

2️⃣ código

dirección de código git

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()

3️⃣Efecto

inserte la descripción de la imagen aquí

4️⃣ Algunas funciones sobrecargadas relacionadas

  1. VideoCaptureEl parámetro puede elegir la ruta del archivo, por ejemplo:cv2.VideoCapture('test_video.mp4')
  2. isOpened()Determine si está abierto, cv.VideoCapture.opense usa para abrir una transmisión de video, por ejemplo: cv.VideoCapture.open('test_video.mp4')si el dispositivo o el video están abiertos, regresarátrue

3. Obtenga los parámetros del dispositivo de video a través de opencv y configure nuevos parámetros

1️⃣ Obtener parámetros del dispositivo

cv.VideoCapture.get( propId )Para obtener los parámetros del dispositivo, propld completa las opciones de parámetros proporcionadas por cv2, y el sitio web oficial proporciona 70 tipos de parámetros que se pueden consultar. El valor de retorno es el valor del parámetro modificado. Si el parámetro de consulta no existe o no es compatible, no se informará ningún error y se devolverá 0.
Éstos son sólo algunos de los más comunes. También hay algunos dispositivos que necesitan soportar el brillo, la saturación, etc.

2️⃣Cambiar parámetros del dispositivo

cv.VideoCapture.set( propId, value )Cambiar los parámetros del dispositivo de propId a value puede no ser válido incluso si devuelve verdadero. Si es válido depende del hardware del dispositivo, el controlador y el backend de la API.

valor del parámetro propld valor devuelto
cv.CAP_PROP_POS_MSEC Devuelve la posición actual del archivo de video en milisegundos.
cv.CAP_PROP_FRAME_WIDTH Devuelve el ancho de los fotogramas en la transmisión de video.
cv.CAP_PROP_FRAME_HEIGHT Devuelve la altura de un cuadro en la transmisión de video.
cv.CAP_PROP_FPS Devuelve la velocidad de fotogramas del vídeo.
cv.CAP_PROP_FRAME_COUNT Devuelve el número de fotogramas del archivo de vídeo.
cv.CAP_PROP_POS_MSEC Consulta la posición actual del archivo de video en milisegundos.

3️⃣ código

dirección de almacén de git

import cv2 as cv

# 创建VideoCapture对象,用创建的对象去做之后的操作
cap2 = cv.VideoCapture(0)

while True:
    # 获取设备参数,cv.CAP_PROP_FRAME_WIDTH,CAP_PROP_FRAME_HEIGHT是cv2提供的参数选项
    width, height = cap2.get(cv.CAP_PROP_FRAME_WIDTH), cap2.get(cv.CAP_PROP_FRAME_HEIGHT)
    # 我这里是1280.0 720.0
    print(width, height)

    # 以原分辨率的两倍来捕获
    cap2.set(cv.CAP_PROP_FRAME_WIDTH, width * 2)
    cap2.set(cv.CAP_PROP_FRAME_HEIGHT, height * 2)
    _, frame2 = cap2.read()

    gray_double = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY)
    # 展示
    cv.imshow('doubel read', gray_double)
    # q退出获取视频流
    if cv.waitKey(1) == ord('q'):
        break
# 释放资源
cap2.release()
cv.destroyAllWindows()

  • Efecto:

inserte la descripción de la imagen aquí
Obviamente, la longitud se ha duplicado y el ancho no ha cambiado, porque si realmente funciona depende del hardware.

4. Grabar video y guardar

1️⃣ pasos

  1. Defina el método de codificación y cree un objeto VideoWriter. Hay cinco parámetros. VideoWriter (const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true) son:
    • El nombre del archivo de salida, como 'output.avi'
    • Método de codificación Código FourCC
    • Velocidad de fotogramas FPS
    • El tamaño de la resolución para guardar
    • La última es la bandera isColor. Si es "Verdadero", el codificador espera marcos de color; de lo contrario, se utilizan marcos en escala de grises.
  2. Definir una captura de video
  3. Ejecute la función de escritura para escribir el contenido capturado por VideoCapture en la ubicación especificada de acuerdo con el método establecido

2️⃣ Código

dirección de almacén de git

import numpy as np
import cv2 as cv

cap = cv.VideoCapture(0)
# 定义编码方式创建VideoWriter对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('../imgs/output_video.avi', fourcc, 20.0, (640, 480))

# 当cap打开状态执行
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break

    # 写入文件
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()

3️⃣ Efecto

inserte la descripción de la imagen aquí

4️⃣ Método de codificación de video complementario

视频编码Es el proceso de convertir señales de video en señales digitales para su almacenamiento y transmisión en dispositivos de medios digitales.
Los métodos de codificación comunes son

H.264 : H.264 es un estándar de codificación de video ampliamente utilizado, también conocido como AVC (Advanced Video Coding). Es compatible con la compresión de video de alta calidad y puede proporcionar video de alta definición y transmisión de medios.
H.265 : H.265, también conocido como HEVC (Codificación de video de alta eficiencia), es un nuevo estándar de codificación de video que proporciona una relación de compresión más alta y una mejor calidad de imagen que H.264.
MPEG-2 : MPEG-2 es un estándar de codificación de video ampliamente utilizado para video de alta definición, como televisión digital, DVD y Blu-ray Disc.
MPEG-4 : MPEG-4 es un estándar de codificación que admite contenido de video, audio y multimedia, y también se usa para transmisión y video web.
VP9 : VP9 es un estándar de codificación de video desarrollado por Google que ofrece una mejor eficiencia de compresión y calidad de imagen que H.264 y admite video 4K y 8K.
AV1 : AV1 es un estándar de codificación de video abierto de próxima generación desarrollado por Alliance for Open Media, cuyo objetivo es proporcionar una mayor eficiencia de compresión y una mejor calidad de imagen.

FourCCes un código de cuatro caracteres que se usa para identificar los códecs de video, generalmente consta de cuatro letras mayúsculas, y se usa para identificar los decodificadores y codificadores de video. Por ejemplo, el código FourCC del formato de video MPEG-4 es "MP4V", y el código FourCC del formato de video H.264 es "H264". En el software de edición y procesamiento de video del código FourCC 好处是, se puede seleccionar el códec correcto para garantizar que el archivo de video se pueda reproducir y editar correctamente, e interactuar entre diferentes plataformas y aplicaciones.

Supongo que te gusta

Origin blog.csdn.net/cvxiayixiao/article/details/130519349
Recomendado
Clasificación