Domanda

Vorrei sapere come posso registrare un video in MATLAB con la mia webcam.

È stato utile?

Soluzione

NOTA: Questo è ora aggiornato per l'uso con le versioni più recenti di MATLAB, poiché alcune delle funzionalità precedenti sono state sostituite e rimosse.

Se sai già come catturare una singola immagine da una webcam , allora dovrebbe essere solo una questione di cuciture le immagini insieme in un film. Puoi usare un VideoWriter per per aprire un filmato e quindi aggiungere immagini sequenziali usando writeVideo . Ad esempio:

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

Ho appena usato un ciclo for come semplice esempio, ma potresti voler usare un timer se invece desideri acquisire immagini e aggiungerle al file AVI a intervalli di tempo regolari.

Altri suggerimenti

Prima costruisci un'interfaccia di input video

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

Dovrai regolare l'ultimo bit per la tua webcam. Per trovare un elenco di dispositivi webcam (e altro oltre) utilizzare:

imaqhwinfo

Quanto segue trasforma la prima webcam in un oggetto

a=imaqhwinfo('winvideo',1)

Trova l'elenco dei formati video supportati con

a.SupportedFormats

Dovrai quindi determinare la frequenza dei fotogrammi (ulteriori informazioni su questo qui ):

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 con i frame vengono archiviati dal flusso video. Ad esempio, se lo impostiamo su 5, viene mantenuto solo 1 fotogramma su 5: gli altri 4 fotogrammi verranno scartati. Utilizzando il framerate, determina la frequenza con cui vuoi ottenere i frame

set(vid,'FrameGrabInterval',10);

Per determinare il numero di frame da acquisire in totale, calcola il numero totale di frame che verrebbero acquisiti al frame rate del dispositivo, quindi dividi per FrameGrabInterval.

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

Ora sei pronto per registrare e riprodurre video con il comando getdata (anche peekdata è utile), tuttavia ...

Se verrà acquisito un numero elevato di frame, è più pratico registrare le immagini su disco anziché in memoria. Utilizzando la casella degli strumenti di acquisizione delle immagini, è possibile registrare le immagini direttamente in un file AVI. Lo configuriamo usando la proprietà LoggingMode.

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

Crea un oggetto file AVI al quale accedere, usando il comando avifile. È necessario specificare il nome file da utilizzare e la frequenza dei fotogrammi su cui riprodurre il file AVI. Quindi, imposta la proprietà DiskLogger dell'oggetto di input video sul file AVI.

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

Avvia l'acquisizione time-lapse e attendi il completamento dell'acquisizione. Si noti che Image Acquisition Toolbox non collega MATLAB® durante l'acquisizione. Puoi avviare l'acquisizione e continuare a lavorare in MATLAB.

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

Una volta completata l'acquisizione, recuperare l'oggetto file AVI e utilizzare la funzione di chiusura per rilasciare le risorse ad esso associate.

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

Al termine dell'oggetto di input video, è necessario utilizzare la funzione di eliminazione per liberare le risorse hardware ad esso associate e rimuoverlo dallo spazio di lavoro utilizzando la funzione di cancellazione.

delete(vid);
clear vid;

Gran parte di quanto sopra è stato tratto da qui .

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

Ulteriori informazioni sui trigger e la sincronizzazione sono qui .

Qui puoi vedere fantastici video su come catturare ed elaborare le immagini dalla webcam, quindi la registrazione non dovrebbe essere difficile:

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

Nella mia vita universitaria ho realizzato questo progetto come

Registratore audio / video e amp; applicazione del giocatore basata su MATLAB

In quanto ho fatto la registrazione audio e la registrazione e riproduzione video nella programmazione matlab. puoi scaricare il codice sorgente da qui

Di recente ho scritto un post sul blog su come registrare audio e video sincronizzati in MATLAB inviando righe di comando al programma ffmpeg. Puoi scoprire di più qui , ma di seguito è riportato un esempio che utilizza alcune impostazioni che avevano senso sul 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');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top