Pregunta

Me gustaría saber cómo puedo grabar un video en MATLAB con mi cámara web.

¿Fue útil?

Solución

NOTA: Esto ahora se actualiza para su uso con versiones más recientes de MATLAB, ya que algunas de las funciones más antiguas se han reemplazado y eliminado.

Si ya sabe cómo capturar una sola imagen de una cámara web , entonces solo debería ser cuestión de costura Las imágenes juntas en una película. Puede utilizar un VideoWriter objeto para abra un archivo de película y luego agregue imágenes secuenciales usando el writeVideo método. Por ejemplo:

aviObject = VideoWriter('myVideo.avi');  % Create a new AVI file
for iImage = 1:100                       % Capture 100 frames
  % ...
  % You would capture a single image I from your webcam here
  % ...
  writeVideo(aviObject, I);  % Add the image to the AVI file
end
close(aviObject);  % Close the AVI file

Acabo de usar un bucle for como un ejemplo simple, pero es posible que desee usar un timer si en su lugar desea capturar imágenes y agregarlas al archivo AVI a intervalos de tiempo regulares.

Otros consejos

Primero construya una interfaz de entrada de video

vid = videoinput('winvideo',1,'RGB24_400x300');

Tendrá que ajustar el último bit para su cámara web. Para encontrar una lista de dispositivos de cámara web (y otras cosas además) use:

imaqhwinfo

Lo siguiente convierte la primera cámara web en un objeto

a=imaqhwinfo('winvideo',1)

Encuentre la lista de formatos de video compatibles con

a.SupportedFormats

Entonces querrá determinar su velocidad de fotogramas (más sobre esto aquí ):

set(vid,'FramesPerTrigger',100);
start(vid);
wait(vid,Inf);

% Retrieve the frames and timestamps for each frame.
[frames,time] = getdata(vid, get(vid,'FramesAvailable'));

% Calculate frame rate by averaging difference between each frame's timestamp
framerate = mean(1./diff(time))

La propiedad FrameGrabInterval especifica con qué frecuencia los marcos se almacenan desde la transmisión de video. Por ejemplo, si lo establecemos en 5, entonces solo se mantiene 1 de cada 5 cuadros; los otros 4 cuadros se descartarán. Utilizando la velocidad de fotogramas, determine con qué frecuencia desea obtener fotogramas

set(vid,'FrameGrabInterval',10);

Para determinar cuántos fotogramas adquirir en total, calcule el número total de fotogramas que se adquirirían a la velocidad de fotogramas del dispositivo y luego divídalos por FrameGrabInterval.

capturetime = 30;
interval = get(vid,'FrameGrabInterval');
numframes = floor(capturetime * framerate / interval)

Ahora está listo para grabar y reproducir videos con el comando getdata ( peekdata también es útil), sin embargo ...

Si se adquiere una gran cantidad de cuadros, es más práctico registrar las imágenes en el disco que en la memoria. Usando Image Acquisition Toolbox, puede registrar imágenes directamente en un archivo AVI. Configuramos esto usando la propiedad LoggingMode.

set(vid,'LoggingMode','disk');

Cree un objeto de archivo AVI para iniciar sesión, utilizando el comando avifile. Debemos especificar el nombre de archivo a usar y la velocidad de fotogramas a la que se debe reproducir el archivo AVI. Luego, configure la propiedad DiskLogger del objeto de entrada de video en el archivo AVI.

avi = avifile('timelapsevideo','fps',framerate);
set(vid,'DiskLogger',avi);

Inicie la adquisición de lapso de tiempo y espere a que se complete la adquisición. Tenga en cuenta que Image Acquisition Toolbox no vincula MATLAB® mientras está adquiriendo. Puede comenzar la adquisición y seguir trabajando en MATLAB.

start(vid);
wait(vid,Inf); % Wait for the capture to complete before continuing.

Una vez que se completa la captura, recupere el objeto de archivo AVI y use la función de cierre para liberar los recursos asociados con él.

avi = get(vid,'DiskLogger');
avi = close(avi);

Cuando haya terminado con el objeto de entrada de video, debe usar la función de eliminación para liberar los recursos de hardware asociados con él y eliminarlo del espacio de trabajo con la función de borrar.

delete(vid);
clear vid;

Una gran parte, pero no toda, de lo anterior se extrajo de aquí .

Cuando presiona start (vid) puede notar que hay un poco de retraso antes de que se empiecen a adquirir los marcos. Esto es malo si estás tratando de sincronizar el video con algo. En este caso, querrá intentar trabajar con el trigger :

triggerconfig(vid,'manual');
start(vid); %There'll be a delay here, but nothing is being captured
trigger(vid); %Use this line when you want the capture to start. There should be very little delay.

Más información sobre disparadores y sincronización está aquí .

Aquí puede ver excelentes videos sobre cómo capturar y procesar las imágenes desde la cámara web, por lo que la grabación no debería ser difícil:

http: // blogs. mathworks.com/videos/2008/01/18/cool-feature-video-processing-demos/

En mi vida universitaria hice este proyecto llamado

Audio / video Recorder & amp; aplicación de reproductor basada en MATLAB

En eso hice grabación de audio y grabación de video y reproducción en programación matlab. puede descargar el código fuente desde aquí

Recientemente escribí una publicación de blog sobre cómo grabar audio y video sincronizado en MATLAB enviando líneas de comando al programa ffmpeg. Puede obtener más información aquí , pero a continuación se muestra una muestra con algunas configuraciones que tienen sentido en mi computadora.

dos('ffmpeg -list_devices true -f dshow -i dummy')

dos('ffmpeg -f dshow -list_options true -i video="USB2.0 HD UVC WebCam')

dos('ffmpeg -f dshow -video_size 1280x720 -framerate 30 -audio_buffer_size 80 -i video="USB2.0 HD UVC WebCam":audio="Microphone (Realtek High Definition Audio)" -t 10 -c:v libx264 -preset veryfast -crf 25 test_vid2.mp4');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top