Saltar al contenido

Hacer un video con opencv y ffmpeg. ¿Cómo encontrar el formato de color correcto?

Solución:

Tiene razón, el formato de píxeles predeterminado de OpenCV es BGR.

El formato equivalente en el lado de ffmpeg sería BGR24, por lo que no es necesario convertirlo a YUV420p si no lo desea.

Esta publicación muestra cómo usar una aplicación de Python para capturar fotogramas de la cámara web y escribir los fotogramas en stdout. El propósito es invocar esta aplicación en la línea cmd y canalizar el resultado directamente a la aplicación ffmpeg, que almacena los fotogramas en el disco. ¡Muy inteligente en verdad!

capture.py:

import cv, sys

cap = cv.CaptureFromCAM(0)
if not cap:
    sys.stdout.write("failed CaptureFromCAM")

while True :
    if not cv.GrabFrame(cap) : 
        break

    frame = cv.RetrieveFrame(cap)
    sys.stdout.write( frame.tostring() )

Y el comando que se ejecutará en el shell es:

python capture.py | ffmpeg -f rawvideo -pix_fmt bgr24 -s 640x480 -r 30 -i - -an -f avi -r 30 foo.avi

Dónde:

  • -r da la velocidad de fotogramas que sale de la cámara
  • -an dice “no codificar audio”

Probé esta solución en mi Mac OS X con OpenCV 2.4.2.

EDITAR:

En caso de que no lo hayas intentado grabar desde la cámara y usar OpenCV para escribir el video en un archivo mp4 en el disco, aquí vamos:

import cv, sys

cap = cv.CaptureFromCAM(0)   # 0 is for /dev/video0
if not cap:
    sys.stdout.write("!!! Failed CaptureFromCAM")
    sys.exit(1)

frame = cv.RetrieveFrame(cap)
if not frame: 
    sys.stdout.write("!!! Failed to retrieve first frame")
    sys.exit(1)

# Unfortunately, the following instruction returns 0
#fps = cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FPS)
fps = 25.0      # so we need to hardcode the FPS
print "Recording at: ", fps, " fps"  

frame_size = cv.GetSize(frame)
print "Video size: ", frame_size  

writer = cv.CreateVideoWriter("out.mp4", cv.CV_FOURCC('F', 'M', 'P', '4'), fps, frame_size, True)
if not writer:
    sys.stdout.write("!!! Error in creating video writer")
    sys.exit(1)


while True :
    if not cv.GrabFrame(cap) : 
        break
    frame = cv.RetrieveFrame(cap)
    cv.WriteFrame(writer, frame)

cv.ReleaseVideoWriter(writer)
cv.ReleaseCapture(cap)

Probé esto con Python 2.7 en Mac OS X y OpenCV 2.4.2.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *