layout relazione
[capturemjpeg.git] / docs / relazione / relazione.tex
blob1eb2e5e238444836dc9f3ea32263c37d9646c920
1 \documentclass[a4paper,11pt]{article}
2 \usepackage{latexsym}
3 \usepackage[italian]{babel}
4 \usepackage[utf8]{inputenc}
5 \usepackage{pdfsync}
6 \usepackage{moreverb}
7 \usepackage{listings}
8 \usepackage{graphicx}
9 \author{Alessio Caiazza, Cosimo Cecchi}
10 \title{\textbf{CaptureMJPEG}\\ a MotionJPEG library for Procesing}
11 \frenchspacing
12 \begin{document}
13 \maketitle
15 \newcommand{\reffigura}[1]{
16 Figura \ref{#1}
19 \begin{abstract}
20 CaptureMJPEG è una libreria per
21 Processing\footnote{http://processing.org} che consente di gestire gli
22 stream motion-jpeg come input video.\\
23 La libreria è in grado di acquisire stream tramite i protocolli
24 \mbox{HTTP/HTTPS} e dispone di alcune classi di aiuto per la
25 generazione di URL per le videocamere di rete AXIS e Sony.
26 \end{abstract}
27 \tableofcontents
30 \section{Introduzione}
31 \label{sec:introduzione}
32 %Cosa è stato fatto, come e con quali obiettivi
33 %Presentazione del progetto e del sito
34 Prima di iniziare lo sviluppo di CaptureMJPEG sono state individuate
35 le linee guida da seguire.
36 La base di utenza principalmente non comporta da programmatori esperti
37 ha portato ad una soluzione che privilegiasse la facilit\`a d'uso
38 rispetto alla complessit\`a e alla ricchezza dell'API offerta,
39 rimanendo così in linea con la filosofia di Processing.\\
40 Un esempio di questa scelta si pu\`o rintracciare nella gestione delle
41 eccezioni, trasparente all'utente grazie alla rappresentazione di esse
42 tramite immagini, quindi utilizzabili senza alcun codice aggiuntivo di
43 correzione dell'errore.\\
44 Per facilitare l'apprendimento, una particolare attenzione \`e stata
45 posta nel rispettare le convenzioni delle librerie del core di
46 Processing, prendendo esempio dal comportamento della classe
47 \texttt{Capture}.\\
48 Lo sviluppo è avvenuto con l'ausilio di strumenti open-source per la
49 gestione delle versioni del codice e per la creazione di un sito del
50 progetto che fosse allo stesso tempo facile da consultare per gli utenti ma
51 anche ricco di funzionalit\`a rivolte agli sviluppatori. Da questa
52 esigenza \`e nata la scelta di Trac come motore per il sito del
53 progetto. Il VCS\footnote{Version Control System} utilizzato per lo
54 sviluppo \`e Mercurial, scelto per la facilit\`a di integrazione con
55 Trac e per la possibilit\`a di effettuare commit e visionare il log
56 del progetto anche offline.
57 Il codice \`e stato sviluppato con Eclipse, sperimentando una
58 programmazione task-focussed, grazie all'utilizzo integrato di
59 Mylyn\footnote{http://www.eclipse.org/mylyn/}.\\
60 La scrittuttura del codice è avvenuta secondo la tecnica del
61 pair~programming\footnote{http://en.wikipedia.org/wiki/Pair\_programming}
62 che prevede due programmatori ad una sola tastiera, mentre uno scrive
63 il codice, l'altro lo revisiona. I due ruoli vengono scambiati
64 frequentemente, minimizzando così gli errori dovuti a stanchezza e
65 distrazione ed il tempo necessario per apprendere le modifiche
66 apportate dall'altro.
69 \section{Manuale}
70 \label{sec:manuale}
71 Guida all'installazione ed utilizzo di CaptureMJPEG
72 \subsection{Installazione}
73 \label{sec:installazione}
74 %scopiazzare dal sito e tradurre in italiano
75 Per prima cosa scaricare l'ultima versione di CaptureMJPG dal sito
76 ufficiale http://capturemjpeg.lilik.it .\\
77 Una volta ottenuto l'archivio decomprimerlo all'interno della
78 sottocartella \texttt{contributed} del proprio sketchbook, su Linux
79 solitamente è \texttt{$\sim$/sketchbook}, su Mac OS X e Windows
80 è la cartella \texttt{Processing} all'interno dei propri documenti.\\
81 Qualora la sottocartella \texttt{contributed} non esistesse è
82 necessario crearla.\\
83 A questo punto riavviare Processing.
84 \subsection{Guida all'utilizzo}
85 \label{sec:guida}
86 %inserire un po' di esempi e spiegare le funzioni utilizzabili
87 La libreria si trova nel package \texttt{it.lilik.capturemjpeg}.\\
88 La classe fondamentale \`e \texttt{CaptureMJPEG}, che dispone dei metodi
89 necessari per la gestione dello stream e per l'integrazione con processing.
90 Per una documentazione completa sulle classi offerte dal package e i relativi
91 metodi disponibili si rimanda alla documentazione JavaDoc sul sito del
92 progetto.\footnote{http://capturemjpeg.lilik.it/doc/}\\
94 Per ottenere un oggetto di tipo \texttt{CaptureMJPEG} \`e necessario invocare
95 il suo costruttore con l'URI della videocamera come parametro. Per questa
96 finalit\`a, la libreria mette a disposizione delle classi per creare facilmente
97 gli URI a partire dalla marca della videocamera, correntemente sono
98 implementate solo quelle per le videocamere Sony e AXIS.\\
99 Una volta ottenuto l'oggetto \texttt{CaptureMJPEG} abbiamo a disposizione due
100 modalit\`a per gestire lo stream proveniente dalla videocamera. La prima,
101 chiamata modalit\`a di callback, prevede la definizione di un metodo
102 all'interno dello sketch, che verr\`a invocato dalla libreria ogni volta che
103 un nuovo fotogramma \`e pronto. La modalit\`a senza callback, invece, prevede
104 che i fotogrammi siano salvati, non appena disponibili, in un buffer circolare
105 interno alla libreria e accessibile tramite il metodo \texttt{getImage ()}.\\
106 Un programmatore che usa la libreria ha la garanzia che il flusso restituito
107 sar\`a sempre costituito da immagini. Infatti gli eventuali errori sono gestiti
108 internamente alla libreria, che provveder\`a a creare delle immagini con una
109 descrizione testuale dell'errore in caso di problemi.
110 \subsubsection{Esempi}
111 \label{sec:utilizzo_esempi}
112 Qui di seguito sono illustrati vari esempi di utilizzo della libreria.\\
114 L'esempio in \reffigura{fig:basic_usage} illustra l'utilizzo di base di CaptureMJPEG.
115 Si noti la funzione di callback \texttt{captureMJPEGEvent}, invocata dalla libreria quando
116 sono disonibili nuovi frame. In questo esempio \`e utilizzato il parser di
117 default per gli URI. Si noti che in questo caso \`e necessario specificare
118 l'URI completo di protocollo.\\
120 Il secondo esempio in \reffigura{fig:vendor_specific} illustra la modalit\`a
121 d'uso dei costruttori di URI specializzati. In questo caso \`e necessario
122 inserire solamente l'host come parametro del costruttore dell'URI.\\
124 Il terzo esempio in \reffigura{fig:buffer_usage} illustra l'utilizzo del buffer
125 interno alla libreria. Si noti l'utilizzo del metodo \texttt{getImage ()} per
126 ottenere il fotogramma successivo dello stream.\\
128 Infine, l'esempio in \reffigura{fig:adaptive_fsize} mostra come sia possibile
129 far s\`i che la dimensione dell'applet si adatti alla dimensione dello stream,
130 attraverso la chiamata al metodo \texttt{setAdaptiveFrameSize ()}.\\
132 \section{Analisi}
133 \label{sec:analisi}
135 \subsection{Comparazione dell'algoritmo blur fra CaptureMJPEG e Capture}
136 \label{sec:comparazione}
138 %Studio della libreria eseguito con il codice di prova
139 L'analisi è stata svolta applicando un filtro \texttt{blur} allo
140 stream ottenuto con CaptureMJPEG e con la videocamera locale
141 utilizzando la libreria Capture\footnote{la libreria Capture è fornita
142 in bundle con Processing.}.\\
143 I sorgenti utilizzati sono quelli in \reffigura{fig:micc_blur} per
144 CaptureMJPEG e in \reffigura{fig:capture_blur} per Capture.
145 Sono stati misurati l'utilizzo di memoria e di CPU al variare delle
146 dimensioni del filmato e del framerate richiesto allo sketch.\\
147 L'analisi ha riportato un utilizzo di memoria minore per la libreria
148 CaptureMJPEG, 30MB contro 40MB per il filmato a risoluzione 320x240 e
149 50MB contro 60MB per il filmato a risoluzione 640x480.\\
151 L'utilizzo di CPU è riportato in \reffigura{fig:blur_isto}.
152 L'algoritmo applicato allo stream di risoluzione 320x240 mostra un
153 utilizzo di CPU più pesante da parte di CaptureMJPEG in media del
154 11.7\% mentre con lo stream a risoluzione 640x480 l'utilizzo è più
155 pesante da parte della libreria Capture, con un distacco fisso del
156 5\%.\\
157 Si deve considerare inoltre il fatto che CaptureMJPEG utilizza
158 connessioni HTTP remote mentre Capture utilizza il bus USB ad alta
159 velocità del sistema locale.\\
161 I test sono stati eseguiti su un iMac con la seguente configurazione:
162 \begin{tabbing}
163 \textbf{sistema operativo} \= Mac OS X 10.4.11 \kill
165 \textbf{processore} \>Intel Core Duo 2GHz (32 bit, dual core)\\
166 \textbf{memoria RAM} \> 1GB a 667MHz \\
167 \textbf{sistema operativo} \> Mac OS X 10.4.11 \\
168 \textbf{processing} \> 0135 beta \\
169 \end{tabbing}
172 \subsection{Impressioni qualitative}
173 \label{sec:impressioni}
174 Dall'osservazione del comportamento della libreria nei test effettuati,
175 si evince che la modalit\`a di callback ha un comportamento ottimale per la
176 realizzazione di sketch con fine di monitoraggio o di visione delle immagini,
177 dato che tutti i frame provenienti dalla videocamera sono resi disponibili
178 al programmatore. Se invece si vuole applicare trasformazioni alle immagini,
179 mantenendo la sincronia con il flusso proveniente dalla videocamera, allora
180 si consiglia l'uso della modalit\`a senza callback, dato che gli eventuali
181 frame non estratti dal buffer durante le operazioni di processing,
182 sono automaticamente scartati dal sistema superata la soglia del
183 buffer interno.
185 \section{Sviluppo}
186 \label{sec:sviluppo}
187 \subsection{Ottenere i sorgenti}
188 \label{sec:sorgenti}
189 Prima di scaricare i sorgenti è necessario installare
190 Mercurial\footnote{Mercurial può essere scaricato dal sito
191 http://www.selenic.com/mercurial/},
192 per la gestione delle versioni ed Ant\footnote{Ant può essere scaricato
193 dal sito http://ant.apache.org},
194 per la gestione della compilazione.
196 Per ottenere i sorgenti eseguire la clonazione del repository
197 mercurial disponibile all'indirizzo
198 \texttt{http://dev.abisso.org/capturemjpeg}
199 dopodiché creare una copia del file \texttt{user\_pref.xml.template}
200 con nome \texttt{user\_pref.xml}.
202 Il file contiene la configurazione di ant per il progetto, tutti i
203 valori di default vanno bene ad eccezione della ``property''
204 \texttt{processing-core} che deve essere corretta con la path completa
205 al file \texttt{core.jar} incluso nella propria installazione di Processing.
206 \begin{verbatim}
207 <property name="processing-core"
208 value="C:\Programmi\processing-0135-expert\lib\core.jar" />
209 \end{verbatim}
211 A questo punto è necessario eseguire il dowload delle librerie incluse
212 in CaptureMJPEG eseguendo il comando:
213 \begin{verbatim}
214 ant download_deps
215 \end{verbatim}
217 Quindi è possibile generare l'intera cartella di installazione con
218 il comando:
219 \begin{verbatim}
220 ant deploy
221 \end{verbatim}
222 \begin{figure}
223 \centering
224 \begin{boxedverbatim}
226 hg clone http://dev.abisso.org/capturemjpeg capturemjpeg
227 cd capturemjpeg
228 cp user_pref.xml.template user_pref.xml
230 \end{boxedverbatim}
232 \vspace{0.3cm}
233 Esempio: ottenere i sorgenti da terminale
234 \end{figure}
236 \subsection{Classi utilizzate}
237 \label{sec:classi}
238 Forniamo ora una descrizione sommaria delle classi sviluppate per la
239 libreria, per una trattazione più approfondita si rimanda alla
240 documentazione JavaDoc disponibile online all'indirizzo
241 http://capturemjpeg.lilik.it/doc/.
242 In \reffigura{fig:class_diagram1} e in \reffigura{fig:class_diagram2}
243 si pu\`o visualizzare il diagramma delle classi della libreria.\\
244 Il metodo con cui vengono acquisite le immagini dalla videocamera \`e basato
245 sull'identificazione all'interno dello stream HTTP dell'elemento che
246 separa le singole immagini, ovvero il \texttt{boundary}.
247 La prima operazione eseguita all'inizializzazione della libreria \`e dunque
248 l'instaurazione di una connessione HTTP al server specificato, tramite le
249 classi \texttt{HTTPClient} di Apache. Una volta ottenuta la connessione,
250 l'operazione seguente \`e l'identificazione del boundary, che pu\`o variare
251 a seconda della marca e del modello della videocamera a cui siamo connessi.
252 Il boundary \`e comunque specificato nell'header della risposta HTTP della
253 videocamera, all'interno del campo \texttt{Content-Type}. Questo compito
254 \`e svolto dalla classe \texttt{CaptureMJPEG}, che implementa quanto illustrato
255 tramite un thread.\\
256 Una volta ottenuto il boundary, le immagini sono estratte dallo stream tramite
257 un meccanismo basato sulla rilevazione dell'identificativo di mime-type
258 proprio delle immagini JPEG. A tal proposito, abbiamo ritenuto
259 oppurtuno implementare una classe, \texttt{MJPEGInputStream}, che ereditasse
260 dalla classe \texttt{java.io.FilteredInputStream} e che ha il suo metodo
261 fondamentale in \texttt{byte[] readImage ()}, che restituisce un array
262 contenente l'immagine in formato JPEG.\\
263 Dopo l'acquisizione di un'immagine, il codice valuta se sia presente o meno
264 una funzione di callback da invocare e in caso negativo, l'immagine
265 ottenuta viene salvata in un buffer circolare, implementato in
266 \texttt{CircularBuffer}.\\
267 La classe \texttt{ErrorImage} si occupa di generare immagini rappresentanti
268 un'eventuale errore nel processo, mentre le classi \texttt{AxisURL} e
269 \texttt{SonyURL} hanno il compito di costruire un URL a partire dai parametri
270 specifici supportati dalle videocamere della relativa marca.
272 \begin{figure}
273 \centering
274 \lstinputlisting[language=Java,numbers=left,frame=shadowbox]{sources/basic_usage.pde}
275 \caption{Esempio di utilizzo base}
276 \label{fig:basic_usage}
277 \end{figure}
278 \begin{figure}
279 \centering
280 \lstinputlisting[language=Java,numbers=left,frame=shadowbox]{sources/vendor_specific.pde}
281 \caption{Utilizzo dei costruttori specializzati}
282 \label{fig:vendor_specific}
283 \end{figure}
284 \begin{figure}
285 \centering
286 \lstinputlisting[language=Java,numbers=left,frame=shadowbox]{sources/buffer_usage.pde}
287 \caption{Esempio dell'utilizzo del buffer}
288 \label{fig:buffer_usage}
289 \end{figure}
290 \begin{figure}
291 \centering
292 \lstinputlisting[language=Java,numbers=left,frame=shadowbox]{sources/adaptive_fsize.pde}
293 \caption{Utilizzo della dimensione adattiva}
294 \label{fig:adaptive_fsize}
295 \end{figure}
296 \begin{figure}
297 \centering
298 \lstinputlisting[language=Java,numbers=left,frame=shadowbox]{sources/micc_blur.pde}
299 \caption{Sorgente di test CaptureMJPEG}
300 \label{fig:micc_blur}
301 \end{figure}
302 \begin{figure}
303 \centering
304 \lstinputlisting[language=Java,numbers=left,frame=shadowbox]{sources/capture_blur.pde}
305 \caption{Sorgente di test Capture}
306 \label{fig:capture_blur}
307 \end{figure}
309 \begin{figure}
310 \centering
311 \includegraphics[scale=2.0]{img/istogrammi.png}
312 \caption{Analisi algoritmo blur}
313 \label{fig:blur_isto}
314 \end{figure}
315 % \begin{figure}
316 % \centering
317 % \includegraphics[scale=0.9]{scilab/isto_blur_640.png}
318 % \caption{Analisi algoritmo blur 640x480}
319 % \label{fig:blur_640}
320 % \end{figure}
321 % \begin{figure}
322 % \centering
323 % \includegraphics[scale=0.9]{scilab/isto_blur_320.png}
324 % \caption{Analisi algoritmo blur 320x240}
325 % \label{fig:blur_320}
326 % \end{figure}
328 \begin{figure}
329 \centering
330 \includegraphics[scale=0.7,angle=90]{img/capturemjpegclass.png}
331 \caption{Diagramma delle classi di CaptureMJPEG}
332 \label{fig:class_diagram1}
333 \end{figure}
334 \begin{figure}
335 \centering
336 \includegraphics[scale=0.9]{img/uribuilders.png}
337 \caption{Diagramma delle classi dei costruttori di URI}
338 \label{fig:class_diagram2}
339 \end{figure}
342 \end{document}