GNU/Linux >> Tutoriales Linux >  >> Linux

Canalizar imágenes OpenCV sin procesar a FFmpeg

Llego un poco tarde, pero mi poderoso VidGear La biblioteca de Python automatiza el proceso de canalización de marcos OpenCV en FFmpeg en cualquier plataforma . Aquí hay un ejemplo básico de python:

# import libraries
from vidgear.gears import WriteGear
import cv2

output_params = {"-vcodec":"libx264", "-crf": 0, "-preset": "fast"} #define (Codec,CRF,preset) FFmpeg tweak parameters for writer

stream = cv2.VideoCapture(0) #Open live webcam video stream on first index(i.e. 0) device

writer = WriteGear(output_filename = 'Output.mp4', compression_mode = True, logging = True, **output_params) #Define writer with output filename 'Output.mp4' 

# infinite loop
while True:
    
    (grabbed, frame) = stream.read()
    # read frames

    # check if frame empty
    if not is grabbed:
        #if True break the infinite loop
        break
    

    # {do something with frame here}
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # write a modified frame to writer
    writer.write(gray) 
       
    # Show output window
    cv2.imshow("Output Frame", frame)

    key = cv2.waitKey(1) & 0xFF
    # check for 'q' key-press
    if key == ord("q"):
        #if 'q' key-pressed break out
        break

cv2.destroyAllWindows()
# close output window

stream.release()
# safely close video stream
writer.close()
# safely close writer

Fuente:https://abhitronix.github.io/vidgear/latest/gears/writegear/compression/usage/#using-compression-mode-with-opencv

Puede consultar VidGear Docs para obtener aplicaciones y funciones más avanzadas.

¡Espero que eso ayude!


Tomó un montón de manipulación, pero lo descubrí usando el demuxer FFmpeg rawvideo:

python capture.py | ffmpeg -f rawvideo -pixel_format bgr24 -video_size 640x480 -framerate 30 -i - foo.avi

Dado que no hay un encabezado en el video sin procesar que especifique los parámetros de video asumidos, el usuario debe especificarlos para poder decodificar los datos correctamente:

  • -framerate Establezca la velocidad de fotogramas del video de entrada. El valor predeterminado es 25.
  • -pixel_format Configure el formato de píxel de video de entrada. El valor predeterminado es yuv420p.
  • -video_size Establezca el tamaño del video de entrada. No existe un valor predeterminado, por lo que este valor debe especificarse explícitamente.

Y aquí hay algo extra para los usuarios avanzados. Lo mismo pero usando VLC para transmitir la salida en vivo a la web, formato Flash:

python capture.py | cvlc --demux=rawvideo --rawvid-fps=30 --rawvid-width=320 --rawvid-height=240  --rawvid-chroma=RV24 - --sout "#transcode{vcodec=h264,vb=200,fps=30,width=320,height=240}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=:8081/stream.flv}"

Editar:Cree una transmisión webm usando ffmpeg y ffserver

python capture.py | ffmpeg -f rawvideo -pixel_format rgb24 -video_size 640x480 -framerate 25 -i - http://localhost:8090/feed1.ffm

Linux
  1. ¿Alguna forma de usar Xargs a través de una tubería?

  2. ¿Redirigir y canalizar la salida?

  3. Limitaciones de la imagen del servidor en la nube

  4. Preguntas frecuentes sobre imágenes programadas

  5. ¿Qué es el modo de teclado sin procesar?

Cómo instalar FFmpeg en Linux

PiShrink:reduce el tamaño de las imágenes de Raspberry Pi

Tubería B a D? – A &&B || C | ¿D?

Cómo instalar OpenCV en Ubuntu 20.04

Configurar y compilar OpenCV para una instalación personalizada de FFMPEG

ffmpeg x11 agarrar una sola ventana