2009-10-28 12 views
9

Mi piacerebbe sapere come posso registrare un video in MATLAB con la mia webcam.Come posso registrare video da una webcam in MATLAB?

+0

Non è chiaro per me dalla domanda se si sta tentando di utilizzare una web cam per registrare la sessione MATLAB (probabilmente no, ma vedo persone che lo fanno). [Tutti i miei video] (http://blogs.mathworks.com/videos) sono schermate realizzate e modificate con Camtasia. – MatlabDoug

risposta

5

Se sai già come capture a single image from a webcam, allora dovrebbe essere solo una questione di cucitura delle immagini insieme in un film. È possibile convertire un file di immagine in una cornice di un film utilizzando IM2FRAME, quindi è possibile utilizzare AVIFILE per creare un file video dai frame. Ecco come il codice potrebbe essere:

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 

ho appena usato un ciclo for come un semplice esempio, ma si potrebbe voler utilizzare un MATLAB Timer Object se si desidera invece di catturare immagini e aggiungerli al file AVI a tempo normale intervalli.

11

primo costruire un'interfaccia di ingresso video

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

Avrete bisogno di modificare l'ultimo pezzo per la vostra webcam. Per trovare un elenco di dispositivi webcam (e altre cose oltre) usa:

imaqhwinfo 

Di seguito fa la prima webcam in un oggetto

a=imaqhwinfo('winvideo',1) 

Trovate l'elenco dei formati video supportati con

a.SupportedFormats 

Sarà quindi necessario determinare il frame rate (altro su questo 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 proprietà FrameGrabInterval specifica la frequenza di memorizzazione dei frame dal flusso video. Ad esempio, se lo impostiamo su 5, vengono conservati solo 1 fotogramma su 5, gli altri 4 fotogrammi verranno scartati. Utilizzando il framerate, determinare quante volte si desidera ottenere fotogrammi

set(vid,'FrameGrabInterval',10); 

Per determinare il numero di fotogrammi di acquisire in totale, calcolare il numero totale di fotogrammi che sarebbero state acquistate al frame rate del dispositivo, e poi dividere per il FrameGrabInterval.

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

Si è ora pronti per registrare e riprodurre con il video utilizzando il comando getdata (peekdata è anche utile), però ...

Se verrà acquisito un gran numero di fotogrammi, è più pratico per registrare le immagini su disco anziché su memoria. Utilizzando la casella degli strumenti di acquisizione immagini, è possibile registrare le immagini direttamente in un file AVI. Configuriamo questo usando la proprietà LoggingMode.

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

Creare un oggetto file AVI a cui accedere, utilizzando il comando avifile. Dobbiamo specificare il nome file da usare e la frequenza fotogrammi a cui il file AVI deve essere riprodotto. Quindi, impostare la proprietà DiskLogger dell'oggetto di input video sul file AVI.

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

Avviare l'acquisizione time-lapse e attendere il completamento dell'acquisizione. Si noti che il Toolbox Acquisizione immagini non lega MATLAB® durante l'acquisizione. Puoi iniziare l'acquisizione e continuare a lavorare in MATLAB.

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

Una volta che la cattura è stata completata, recuperare l'oggetto file AVI, e utilizzare la funzione vicino a liberare le risorse ad esso associati.

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

Quando si è fatto con l'oggetto ingresso video, è necessario utilizzare la funzione di cancellazione per liberare le risorse hardware ad esso associati, e rimuoverlo dallo spazio di lavoro utilizzando la funzione di cancellazione.

delete(vid); 
clear vid; 

Una gran parte, ma non tutti, quanto sopra è stato disegnato da here.

Quando si preme start(vid) si potrebbe notare che c'è un po 'di ritardo prima che i frame inizino ad essere acquisiti. Questo è male se stai cercando di sincronizzare il video con qualcosa. In questo caso, ti consigliamo di provare a lavorare con il 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. 

Maggiori informazioni sul trigger e sincronizzazione è here.

0

Recentemente ho scritto un post sul blog su come registrare audio e video sincronizzati in MATLAB inviando le righe di comando al programma ffmpeg. Puoi trovare ulteriori informazioni su here, ma di seguito è riportato un esempio che utilizza alcune impostazioni sensate per il mio computer.

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');