2009-10-28 43 views
9

Me gustaría saber cómo puedo grabar un video en MATLAB con mi cámara web.¿Cómo grabo video desde una cámara web en MATLAB?

+0

No me resulta claro si está intentando usar una cámara web para grabar su sesión de MATLAB (probablemente no, pero veo personas que lo están haciendo). [Todos mis videos] (http://blogs.mathworks.com/videos) son capturas de pantalla hechas y editadas con Camtasia. – MatlabDoug

Respuesta

5

Si ya sabe cómo capture a single image from a webcam, entonces, sólo debería ser una cuestión de unir las imágenes en una película. Puede convertir un archivo de imagen en un cuadro de película usando IM2FRAME, luego puede usar AVIFILE para crear un archivo de video a partir de los cuadros. Así es como el código podría ser:

aviObject = avifile('myVideo.avi'); % Create a new AVI file 
for iFrame = 1:100     % Capture 100 frames 
    % ... 
    % You would capture a single image I from your webcam here 
    % ... 
    F = im2frame(I);     % Convert I to a movie frame 
    aviObject = addframe(aviObject,F); % Add the frame to the AVI file 
end 
aviObject = close(aviObject);   % Close the AVI file 

acabo de utilizar un bucle for como un ejemplo sencillo, pero es posible que desee utilizar un MATLAB Timer Object si por el contrario quiere capturar imágenes y agregarlos al archivo AVI en el tiempo regulares intervalos.

11

primera construcción de una interfaz de entrada de vídeo

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

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

imaqhwinfo 

A continuación se hace la primera cámara web en un objeto

a=imaqhwinfo('winvideo',1) 

Encuentra la lista de formatos de vídeo compatibles con

a.SupportedFormats 

A continuación, querrá determinar su velocidad de fotogramas (más sobre esto here):

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 se almacenan los fotogramas de la secuencia de video. Por ejemplo, si lo configuramos en 5, entonces solo se conserva 1 en 5 fotogramas, los otros 4 fotogramas se descartarán. El uso de la tasa de fotogramas, determinar la frecuencia con la que desea obtener marcos

set(vid,'FrameGrabInterval',10); 

Para determinar el número de fotogramas para adquirir en total, calcular el número total de tramas que se adquirieron a frecuencia de imagen del dispositivo, y luego dividir por el FrameGrabInterval.

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

que ahora está listo para grabar y reproducir con vídeo utilizando el comando getdata (peekdata es también útil), sin embargo ...

Si se adquirió un gran número de cuadros, es más práctico para registrar las imágenes en el disco en lugar de en la memoria. Usando la Caja de herramientas de adquisición de imágenes, 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 con el comando avifile. Debemos especificar el nombre de archivo a usar y la velocidad de cuadro en la que debe reproducirse el archivo AVI. Luego, establezca 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 la Caja de herramientas de adquisición de imágenes 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 se haya completado la captura, recuperar el objeto de archivo AVI, y utilice la función de cierre para liberar los recursos asociados a ella.

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

Cuando haya terminado con el objeto de entrada de vídeo, se debe utilizar la función de eliminación de liberar los recursos de hardware asociados a ella, y sacarlo del espacio de trabajo utilizando la función de cancelación.

delete(vid); 
clear vid; 

Una porción grande, pero no todos, de lo anterior se extrajo de here.

Al presionar start(vid), puede notar que hay un poco de retraso antes de que los marcos comiencen a ser adquiridos. Esto es malo si estás tratando de sincronizar el video con algo. En este caso, tendrá que 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 los factores desencadenantes y la sincronización es here.

0

Hace poco escribí una publicación de blog sobre cómo grabar audio y video sincronizados en MATLAB enviando líneas de comando al programa ffmpeg. Puede encontrar más información acerca de here, pero a continuación se muestra una muestra con algunas configuraciones que tenían 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'); 
Cuestiones relacionadas