Mi piacerebbe sapere come posso registrare un video in MATLAB con la mia webcam.Come posso registrare video da una webcam in MATLAB?
risposta
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.
Qui si possono vedere grandi video come catturare ed elaborare le immagini da webcam, quindi la registrazione non dovrebbe essere difficile:
http://blogs.mathworks.com/videos/2008/01/18/cool-feature-video-processing-demos/
Nella mia vita del college ho fatto questo progetto chiamato come
Audio/video Recorder & player application based on MATLAB
In questo ho fatto registrazione audio e registrazione e riproduzione video in programmazione MATLAB. è possibile scaricare il codice sorgente da here
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.
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');
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