Tiene razón, el formato de píxeles predeterminado de OpenCV es BGR.
El formato equivalente en el lado ffmpeg sería BGR24, por lo que no necesita convertirlo a YUV420p si no lo desea.
This post muestra cómo utilizar una aplicación de Python para capturar fotogramas de la cámara web y escribir los marcos en stdout. El objetivo es invocar esta aplicación en la línea de cmd y canalizar el resultado directamente a la aplicación ffmpeg, que almacena los marcos en el disco. ¡Muy inteligente!
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 a ejecutar en la cáscara 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 el marco tasa que sale de la cámara
- -un dice "no codificar audio"
He probado esta solución en mi Mac OS X con OpenCV 2.4.2.
EDIT:
En caso de que no haya tratado de registro de la cámara y utilizar OpenCV para escribir el vídeo a 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)
He probado esto con Python 2.7 en Mac OS X y OpenCV 2.4.2.
Gracias por su respuesta. No tuve tiempo de verificar la solución, pero parece interesante. Intenté usar el bgr24 pix_fmt pero no funciona con el códec libx264. No estoy seguro de si realmente necesito usar libx264. Necesito una solución multiplataforma (Windows, Mac, Linux) y, como consecuencia, es posible que se necesite libx264. Necesito verificar – luc
En Windows libx264 es el códec predeterminado y causa que la imagen tenga colores incorrectos porque no es compatible con bgr24 pix_fmt – luc
Lamento preguntar, pero ¿por qué no usa OpenCV para crear el archivo de video? – karlphillip