Repository 32bit  Forum
Repository 64bit  Wiki

Webcam Monitoring con la "Konica Webcam USB": differenze tra le versioni

Da Slacky.eu.
(Predisposizione del sistema (kernel))
(Esecuzione di '''motion''')
 
(27 revisioni intermedie di 2 utenti non mostrate)
Riga 1: Riga 1:
  +
[[category:Multimediale]]
  +
== Introduzione ==
== Introduzione ==
Usare dispositivi come le ''webcam'' con GNU/Linux, oggi, è davvero molto facile. Solo qualche anno fa, la cosa era particolarmente ostica e creava spesso problemi, per poi ottenere dei risultati non del tutto soddisfacenti.<br />
Usare dispositivi come le ''webcam'' con GNU/Linux, oggi, è davvero molto facile. Solo qualche anno fa, la cosa era particolarmente ostica e creava spesso problemi, per poi ottenere dei risultati non del tutto soddisfacenti.<br />
L'obbiettivo che mi sono posto era quello di poter utilizzare una banale webcam "''USB''" (''Universal Serial Bus''), peraltro obsoleta, per poter effettuare una prova di videosorveglianza di un locale; si tratta della "''Inetl Pro Share''". Ovviamente si è trattato di una prova, l'obiettivo era sperimentale ed avrebbe dovuto essere integrato da videocamere professionali e chede di acquisizione se il test fosse andato a buon fine.<br />
+
L'obbiettivo che mi sono posto era quello di poter utilizzare una banale webcam "''USB''" (''Universal Serial Bus''), peraltro obsoleta, per poter effettuare una prova di videosorveglianza di un locale; si tratta della "''Intel Pro Share''". Ovviamente si è trattato di una prova, l'obiettivo era sperimentale ed avrebbe dovuto essere integrato da videocamere professionali e chede di acquisizione se il test fosse andato a buon fine.<br />
In realtà, mi interessava anche provare la videoconferenza sotto GNU/Linux quindi ho messo insieme queste necessità ed ho finito per scrivere questo breve ''How-To''. Sicuramente, documenti migliori di questo, ce ne sono già molti ma non ne ho trovato uno che facesse al caso mio quindi, ho deciso di scriverlo mettendo insieme il percorso seguito.
In realtà, mi interessava anche provare la videoconferenza sotto GNU/Linux quindi ho messo insieme queste necessità ed ho finito per scrivere questo breve ''How-To''. Sicuramente, documenti migliori di questo, ce ne sono già molti ma non ne ho trovato uno che facesse al caso mio quindi, ho deciso di scriverlo mettendo insieme il percorso seguito.
Riga 10: Riga 12:
Essendo una webcam USB (ormai lo sono la maggior parte) è necessario il supporto USB nel kernel ed è sufficiente usare il kernel standard della Slackware 9.1 che supporta giàtutti i moduli necessari. Coloro che avessero effettuato una ricompilazione, devono assicurarsi di aver incluso questi moduli :
Essendo una webcam USB (ormai lo sono la maggior parte) è necessario il supporto USB nel kernel ed è sufficiente usare il kernel standard della Slackware 9.1 che supporta giàtutti i moduli necessari. Coloro che avessero effettuato una ricompilazione, devono assicurarsi di aver incluso questi moduli :
#lsmod
#lsmod
  +
[''INVIO'']
  +
...ed otterremo il seguente output:
Module Size Used by Not tainted
Module Size Used by Not tainted
konicawc 7828 0
konicawc 7828 0
Riga 32: Riga 36:
Il modulo usato per la mia webcam è il '''USB_KONICAWC (Konica Webcam)''' visto che nel kernel vi è il supporto per il suo chip specifico (''Intel YC76 webcam'').
Il modulo usato per la mia webcam è il '''USB_KONICAWC (Konica Webcam)''' visto che nel kernel vi è il supporto per il suo chip specifico (''Intel YC76 webcam'').
Per maggiori informazioni, possiamo dare un'occhiata al seguente link: [http://www.si.org/konica ''konica''].
Per maggiori informazioni, possiamo dare un'occhiata al seguente link: [http://www.si.org/konica ''konica''].
  +
Per quel che riguarda il supporto del '''V4L''' (''Video 4 Linux''), occorre compilare il modulo nella sezione "''Video4Linux''"; anche in questo caso, i moduli necessari, sono presenti nel kernel precompilato standard :
  +
''Sezione Video4Linux''
  +
#Multimedia devices
  +
#
  +
CONFIG_VIDEO_DEV=m
  +
Riepilogando, i moduli essenziali da caricare sono :
  +
modprobe usbcore
  +
modprobe usb-ohci
  +
modprobe videodev
  +
modprobe konicawc
  +
Una volta riavviato il sistema, dovremmo predisporre l''''hotplug''' che consente di utilizzare un dispositivo USB "al volo". Grazie ad esso, il nostro computer, può rilevare automaticamente la periferica (webcam) appena connessa. Nel caso in cui l'hotplug non sia stato attivato all'atto dell'installazione, possiamo sempre renderlo eseguibile col comando :
  +
#chmod 0755 /etc/rc.d/rc.hotplug
  +
A questo punto, una volta collegata la webcam, dovremmo poterla vedere nell'output del seguente comando :
  +
#lsusb
  +
[''INVIO'']
  +
... e vedremo :
  +
Unknown line at line 1809
  +
Duplicate HUT Usage Spec at line 2650
  +
Bus 002 Device 001: ID 0000:0000 Virtual Hub
  +
'''Bus 002 Device 003: ID 04c8:0720 Konica Corp. Digital Color Camera'''
  +
Bus 001 Device 001: ID 0000:0000 Virtual Hub
  +
A questo punto avremo un device '''/dev/video0''' che è quello che verrà utilizzato dai nostri programmi per l'acquisizione delle immagini.
  +
Per poter ottenere informazioni sui device USB, verificate di aver installato '''usbutils'''; questo, per poter utilizzare i tool di diagnostica ''lsusb'' e ''usbmodules''. Ad esempio, nel mio sistema :
  +
usbmodules --device /proc/bus/usb/002/002
  +
konicawc
  +
  +
== Panoramica sui softwares utilizzati ==
  +
  +
Per prima cosa proviamo a predisporre il sistema per la videoconferenza, dovrebbe essere semplice. Installiamo a questo punto il miglior pacchetto di videoconferenza sotto GNU/Linux ''Gnomemeeting''.
  +
  +
=== Gnomemeeting: installazione ed utilizzo ===
  +
  +
Possiamo scaricare il pacchetto in diversi formati da questo [http://www.gnomemeeting.org/index.php?rub=5&path=slackware/9.1 link] insieme anche agli altri necessari ossia :
  +
gnomemeeting-1.0.tgz
  +
libdv-0.101.tgz
  +
libraw1394-0.9.0.tgz
  +
openh323-1.0.tgz
  +
Se abbiamo tutti i pacchetti nella medesima directory, possiamo installarli con un solo comando :
  +
#installpkg *.tgz
  +
[''INVIO'']
  +
Ovviamente, sono necessarie le librerie di ''GNOME'' e, non avendole installate, ho fatto :
  +
#mount /dev/hdb /mnt/cdrom
  +
[''INVIO'']
  +
...dopodichè :
  +
#cd /mnt/cdrom/slackware/gnome
  +
[''INVIO'']
  +
...e rifaremo :
  +
#installpkg *.tgz
  +
[''INVIO'']
  +
Il device video, come detto prima, è ''/dev/video0''; controlliamo che abbia tutti i permessi settati correttamente, altrimenti cambiamoli con :
  +
#chmod o+rw /dev/video0
  +
[''INVIO'']
  +
...e :
  +
#chmod +x /dev/video0
  +
[''INVIO'']
  +
A questo punto, possiamo anche eseguire ''Gnomemeeting'' nel nostro ambiente grafico.
  +
Questo programma, è stato appositamente pensato per la videoconferenza e per questa funzionalità mi sembra davvero ben progettato; molto semplice sia da configurare che da gestire.<br />
  +
In realtà, il nostro obiettivo era un altro, ovvero usare la webcam per acquisizione immagini (videosorveglianza); vedremo questo nei successivi paragrafi.
  +
Risorse :
  +
[http://www.gnomemeeting.org]
  +
[http://www.slackware-italia.com/articoli.php?IDART=25]
  +
  +
== Videosorveglianza e cattura d'immagini e filmati ==
  +
  +
Usare ''Gnomemeeting'' è semplice un po' come il software da cui ha preso spunto (o forse solo una parte del nome), ovvero "''Netmeeting''".
  +
Supporta connessioni ''TCP'' o su protocollo modem ''H323'' e possiede un comodo wizard per l'identificazione dell'hardware. Devo dire che questa è la parte che meno mi interessava; ero più orientato ad utilizzare la webcam per effettuare la cattura delle immagini.<br />
  +
Ho provato con "'''Vjgrabbj'''", per il quale è disponibile un bellissimo ''How-To'' molto chiaro. Nel mio caso, però, non sono riuscito a compilarlo e ciò mi ha fatto orientare su di un altro software, ossia "'''Camstream'''". Per coloro che volessero comunque provare ''Vjgrabbj'', può trovare maggiori informazioni nel seguente link :<br />
  +
[http://vgrabbj.gecius.de]<br />
  +
Il programma in questione, richiede i seguenti pacchetti :
  +
* Libjpeg
  +
* Libpng
  +
* Zlib
  +
* Ftplib (opzionale)
  +
* Freetype (opzionale)
  +
Per quanto riguarda invece la documentazione del progetto, potete guardare [http://www.sottosuolo.org/guide/html1/Linux_WebcamInternet.html qui].
  +
  +
=== Camstream: installazione ed utilizzo ===
  +
  +
E' basato sulle librerie "''QT''" ma, se avete "''KDE''" installato come nel mio caso, dovreste già averr tutto ciò che serve.<br />
  +
Per coloro che non le avessero installate, sono comunque reperibili presso :<br /> [http://www.trolltech.com/ http://www.trolltech.com/]<br />
  +
Gli obiettivi del progetto, come annunciato anche sul sito, sono ambiziosi:
  +
* Webcamming: permette di salvare e fare upload di immagini ad intervalli regolari
  +
* Video conferencing
  +
* Webcam broadcast (including server): consente di fungere da webcam server
  +
* Registrazione di filmati (AVI, Quicktime) attraverso la webcam e loro riproduzione
  +
* Uso della webcam come videocamera di sorveglianza
  +
Per ora si può utilizzare solo la prima funzionalità, che sembra essere comunque davvero ben supportata.<br />
  +
Il software si installa e si utilizza semplicemente :
  +
wget [http://www.smcc.demon.nl/camstream/download/camstream-0.26.3.tar.gz http://www.smcc.demon.nl/camstream/download/camstream-0.26.3.tar.gz]
  +
[''INVIO'']
  +
...dopodichè :
  +
#./configure
  +
#make && make install
  +
Prima di utilizzare il programma, è bene notare come sia stato associato a "Camstream" un altro programma: "''Caminfo''". Quest'ultimo è utile per l'analisi del device e del nostro hardware; praticamente, viene effettuata una sorta di "interrogazione" della telecamera. Nel nostro caso, avremo:
  +
#./caminfo
  +
[''INVIO'']
  +
...che ci mostrerà :
  +
CVideoDevice::ResetImagesRGB()
  +
CVideoDevice::ResetImagesYUV()
  +
CVideoDevice::ResetImagesRGB()
  +
CVideoDevice::ResetImagesYUV()
  +
CVideoDevice::ResetImagesRGB()
  +
CVideoDevice::ResetImagesYUV()
  +
Detected 1 Video4Linux devices.
  +
Device node :/dev/video0
  +
Name of device :"Konica Webcam"
  +
Minimum size :160x120
  +
Current size :0x0
  +
Video inputs :1
  +
Input 0
  +
Name :"Camera"
  +
Type :Camera
  +
Audio :no
  +
Tuners :no
  +
Audio inputs :no
  +
Per eseguire il software, bisogna digitare dalla bash il comando :
  +
  +
#camstream
  +
[''INVIO'']
  +
A questo punto, dovrebbe aprirsi una finestra; dalla tab "''File''", scegliere "''OpenViewer''".<br />
  +
Se non si sono incontrati problemi, il device dovrebbe essere quello della nostra telecamera (identificato prima col comando "''lsusb''") in quanto l'unico del sistema:
  +
#lsusb
  +
[''INVIO'']
  +
...che mostra:
  +
Bus 002 Device 002: ID 04c8:0720 Konica Corp. Digital Color Camera
  +
Fatto ciò, basterà impostare le dimensioni iniziali per l'immagine che verrà acquisita e cliccare su "''OK''". Potremo finalmente vedere ed acquisire in formato statico (''snapshot'') ciò che la webcam riprende.<br />
  +
Questo software consente di visualizzare le immagini ed effettuare il ''grabbing'' utilizzando la ''toolbar''. Inoltre, è possibile creare degli snapshot in vari formati ad inttervalli di tempo prestabiliti. E' possibile inoltre, avere in sovraimpressione il ''timestamp''.<br />
  +
Inoltre, prevede la creazione di immagini in sequenza o con il nome composto dalla data. In alternativa a ciò, si può optare per l'aggiornamento di un unico file, come nel caso dell'utilizzo di una webcam su Internet che, ad intervalli regolari di tempo, aggiorna l'immagine.<br />
  +
La configurazione è semplice :<br />
  +
* con il primo bottone a sinistra, possiamo modificare i controlli della webcam, come:
  +
** Dimensione (risoluzione)
  +
** Framerate
  +
** Saturazione
  +
** Contrasto
  +
** Luminosità
  +
** Gamma
  +
* Il secondo bottone, ci permette di programmare il comportamento della videocamera ed è il più importante:
  +
* Il terzo ci permette di visualizzare l'ultimo snapshot a fianco della ripresa in tempo reale
  +
* I 2 bottoni successivi, ci consentono di prelevare degli snapshot direttamente o ad intervalli di tempo prefissati (secondi e minuti)
  +
* L'ultimo dei bottoni, abilita o disabilita l'audio; per gestire quest'ultimo,''Camstream'', utilizza i driver "''ALSA''" .<br />
  +
In conclusione, posso dire di aver trovato questo programma davvero ben fatto; di semplice installazione ed utilizzo rispetto ad altri programmi, non ha richiesto nulla di particolare.<br />
  +
Ho provato ad impostare il salvataggio su di una directory esportata con "''Samba''", sia visualizzando le immagini dalla rete direttamente col previewer del file manager, sia utilizzando programmi in ambiente Microsoft Windows&copy; (con ''Moviemaker'') per effettuare montaggi di immagini in sequenza ed ottenere dei brevi filmati.
  +
  +
== Motion: Installazione e configurazione ==
  +
  +
Un'alternativa, sicuramente più completa e professionale, è rappresentata da "''Motion''" che consente di archiviare le immagini solo nel caso in cui la telecamera percepisca dell'attività; in questo modo, possiamo risparmiare notevoli risorse e spazio disco.<br />
  +
''Motion'' utilizza il "''V4L''" (''Video 4 Linux'') per la cattura delle immagini.<br />
  +
Non è un programma nato per visualizzare su schermo le immagini in tempo reale, ma piuttosto per poterle acquisire, salvare e poterle elaborare in un secondo momento.
  +
  +
=== Installazione ===
  +
  +
Per poter procedere all'installzione, si ha bisogno dei seguenti pacchetti :
  +
* [http://heanet.dl.sourceforge.net/sourceforge/ffmpeg/ffmpeg-0.4.8.tar.gz "''ffmpeg''"]
  +
* [http://aleron.dl.sourceforge.net/sourceforge/mjpeg/mjpegtools-1.6.2.tar.gz "''mjpegtools]
  +
La sua installazione può essere fatta con il supporto di "''libavcodec''" che cio consentirà di creare filmati ''mpeg'' riepilogativi delle sequenza registrate.<br />
  +
Il programma può essere prelevato da :<br />
  +
[http://keihanna.dl.sourceforge.net/sourceforge/motion/motion-3.0.7-1.tar.gz http://keihanna.dl.sourceforge.net/sourceforge/motion/motion-3.0.7-1.tar.gz].<br />
  +
...ed installato con le seguenti opzioni :
  +
#./configure --with-libavcodec=/usr/src/ffmpeg-0.4.8/libavcodec && make && make install && ldconfig
  +
[''INVIO'']
  +
L'esecuzione richiede un po' di pazienza e di verifiche in modo da ottenere la configurazione necessaria visto che possiede molte opzioni. Il file da controllare è "''motion.conf''" che di default, viene salvato in "''/usr/local/etc/''".<br />
  +
Il programma, costruisce una struttura a directory molto pratica da consultare in cui le immagini salvate vengono divise per anno/mese/giorno/ora/minuto. In questo modo, sfruttando il preview del filemanager, potremmo visualizzare le immagini ottenute soltanto quando è stato registrato movimento nello spazio d'inquadratura della webcam.
  +
  +
=== Costruzione di filmati con ''motion'' ===
  +
  +
I filmati, si possono creare utilizzando l'"''mpeg_encoder''" oppure usando ''libavcodec''. Per chi volesse utilizzare ''mpeg_encoder'', lo può reperire da [ftp://mm-ftp.cs.berkeley.edu/pub/multimedia/mpeg/encode/mpeg_encode-1.5b-src.tar.gz qui].<br />
  +
Per installarlo, io ho fatto così :
  +
#mkdir /root/mpeg
  +
[''INVIO'']
  +
  +
#cd /root/mpeg
  +
[''INVIO'']
  +
  +
#tar -xvzf mpeg_encode-1.5b-src.tar.gz
  +
[''INVIO'']
  +
  +
#make && make install
  +
[''INVIO'']
  +
  +
#jpeg/configure
  +
[''INVIO'']
  +
  +
#make && make install
  +
[''INVIO'']
  +
Se invece si decidesse di utilizzare ''libavcodec'', basta configurare i parametri necessari nel file ''motion.conf''così :
  +
  +
'''ffmpeg_cap_news yes''' # ''specifica di utilizzare ffmpegs libavcodec per<br /> creare filmati mpeg in tempo reale
  +
  +
'''ffmpeg_timelaps on''' # ''specifica l'utilizzo di ffmpeg libavcodec per codificare timelaps movie
  +
  +
'''ffmpeg_bps 400000''' # ''Bitrate del filmato mpeg prodotto da ffmpeg''
  +
  +
'''jpg_cleanup no''' # ''se settato a "no" dopo aver creato il filmato, rimuove<br />le immagini "jpeg"
  +
A questo punto, si può eseguire ''motion'' e visualizzare i filmati creati.
  +
  +
== Dettagli sulla configurazione (''motion.conf'') ==
  +
  +
Come detto, ''motion'', richiede almeno una configurazione minima anche se potrebbe andare bene, per gli utilizzi standard, il file "''motion.conf''" installato di default.<br />
  +
Se opportunamente modificato, questo programma, fa davvero molte cose; vediamo alcune delle opzioni :
  +
# Capture device options:
  +
videodevice /dev/video0
  +
''(Imposta il device di default per l'acquisizione delle immagini).''
  +
framerate 100
  +
''(E' il numero massimo di frames che può salvare al secondo).''
  +
width 320
  +
''(La larghezza di ogni singolo frame).''
  +
height 240
  +
''(L'altezza di ogni singolo frame).''
  +
#Motion detection settings:
  +
#Threshold for declaring motion (number of changed pixel in an image) - (Default 1500)
  +
threshols 500
  +
''(Con questo valore specifichiamo quanti pixel devono essere modificati perchè '''''motion''''' identifichi il movimento; abbassando questo valore, aumenteremo la sensibilità delle telecamere ed aumenteremo il numero di frames registrati).''
  +
#noise_level sets the noise threshold for the motion detection (Default: 32)
  +
noise_level 16)
  +
''(Permette di impostare il livello di disturbo necessario alle webcam per registrare i movimenti).''
  +
#This option enable '''''motion''''' to adjust its noise level for very dark frames
  +
#Default: no
  +
night_compensate yes
  +
''(Consente di imposter la "compensazione notturna" per il livello di disturbo).''
  +
#Only capture one frame per second when no detecting motion
  +
#Default: no
  +
low_cpu yes
  +
''(Se impostato a "yes" riduce il lavoro del sistema e della cpu che salva un solo frame quando non viene rilevato alcun movimento).''
  +
#Activate the light switch filter
  +
#Default: off
  +
lightswitch yes
  +
''(Consente di impostare un filtro che impedisce a '''''motion''''' di considerare movimenti le variazioni di luminosità percepite dalle webcam).''
  +
#Warnings and logging:
  +
daemon no
  +
''(Abilita l'esecuzione in background "daemon mode").''
  +
mail root@localhost
  +
''(Invia una notifica via mail ad ogni movimento registrato).''
  +
execute command
  +
''(Esegue un comando ad ogni movimento rilevato).''
  +
onsave onsavescript.sh
  +
''(Esegue un comando ad ogni creazione di immagine come, ad esempio, un suono).''
  +
onmpeg echo
  +
''(Esegue un comando ad ogni filmato prodotto come, ad esempio, un suono).''
  +
#Image output
  +
locate
  +
''(Se impostata a "yes" disegna un riquadro attorno alla parte di immagine modificata).''
  +
snapshot 60
  +
''(Crea un'immagine di snapshot ogni tot secondi comunque anche in assenza di movimento).''
  +
output_normal yes
  +
''(Crea le immagini salvate da '''''motion''''' relative ai singoli movimenti rilevati; è indispensabile attivarlo per avere le singole slide dei movimenti).''
  +
output_motion yes
  +
''(Crea anche le immagini solo dell'oggetto in movimento - immagini a fondo verde con in bianco solo i pixel modificati).''
  +
realmotion
  +
''(Questa opzione modifica il metodo di funzionamento della direttiva "'''output_motion'''"; normalmente mostra solo i pixel di cui sono stati identificati dei cambiamenti dell'ultima immagine relativamente all'ultimo frame, se invece si imposta a "'''real_motion on'''" le immagini conterranno tutti i pixel modificati nell'immagine).''
  +
snapshot_overwrite no
  +
''(Sovrascrive lo stesso snapshot senza crearne uno nuovo).''
  +
quality 100
  +
''(Imposta la qualità delle immagini salvate, "'''100'''" è il massimo).''
  +
target_dir snapshot
  +
''(E' il path assoluto dove verranno salvate le immagini ed i filmati).''
  +
ffmpeg_cap_new yes
  +
''(Consente a '''''motion''''' di utilizzare '''libavcodec''' per codificare filmati mpeg in tempo reale).''
  +
ffmpeg_cap_motion on
  +
''(Usa '''ffmpeg''' per creare i filmati delle immagini di '''''motion''''').''
  +
ffmpeg_timelaps on
  +
''(Usa '''ffmpeg''' per codificare il timelaps per i filmati).''
  +
ffmpeg_bps 40000
  +
''(Bitrate per i filmati creati).''
  +
max_mpeg_time 60 # 1 minuto
  +
''(Lunghezza massima in secondi dei filmati creati da '''mpeg''').''
  +
jpg_cleanup no
  +
''(Elimina i ".jpg" in caso di creazione del filmato).''
  +
#User defined text in image parameters
  +
drawtext_user Ufficio
  +
''(Aggiunge la scritta "''Ufficio''" su ogni snapshot).''
  +
drawtext_changes on
  +
''(Segna il numero di pixel modificati).''
  +
drawtext_shots on
  +
''(Imposta il "''timestamp''" per gli snapshot).''
  +
<br />
  +
Nel caso si volessero usare due telecamere, occorre impostare un file esterno per la seconda webcam chiamato ''thread2.conf''. Nel file "''motion.conf''" specificheremo la direttiva "''thread /usr/local/etc/thread2.conf''".<br />
  +
Questo file, dovrà contenere almeno le direttive :
  +
#/etc/thread2.conf
  +
#Videodevice to be used for capturing
  +
videodevice /dev/video1
  +
#Target directory for pictures
  +
target_dir /home/paolo/webcam2
  +
drawtext_user Camera_Porta
  +
  +
=== Esecuzione di '''motion''' ===
  +
Motion può essere eseguito normalmente da riga di comando lanciando semplicemente :
  +
#motion
  +
[''INVIO'']
  +
In questo modo, potremo effettuare il debug verificando il comportamento del programma. Nel caso in cui si voglia eseguirlo in modalità ''daemon mode'', occorre specificarlo nel file ''motion.conf'' con l'opzione ''daemon'' impostata su ''on''. In questo modo, dovremmo visualizzare le acquisizioni se occupiamo il campo visivo della webcam.
  +
#motion
  +
[''INVIO'']
  +
Visualizzeremo :
  +
thread0 device: /dev/video0 input: 1
  +
waiting for threads to finish, pid: 6351
  +
New threshold: 1500
  +
1465
  +
New threshold: 1500
  +
11856
  +
File of type video/mpeg saved to: /htdir/htdocs/webcam/2004/04/14/172711.mpg
  +
type: 15 15
  +
File of type image/jpg saved to: /htdir/htdocs/webcam/2004/04/14/172711.jpg
  +
4214
  +
New threshold: 1500
  +
6
  +
New threshold: 1500
  +
1051
  +
Ovviemente, molti dei parametri specificati nel file di configurazione "''motion.conf''", di default installato in ''/usr/local/etc'', possono essere specificati da linea di comando :
  +
#motion -h
  +
[''INVIO'']
  +
  +
motion Version 3.1.10, Copyright 2000 Jeroen Vreeken
  +
usage: motion [option]
  +
Overall settings:
  +
-C Output changes count for every frame, usable for tuning
  +
-D daemonize
  +
-a seconds time between two automated snapshots, default: 0

Versione attuale delle 16:06, 25 apr 2007


Indice

[modifica] Introduzione

Usare dispositivi come le webcam con GNU/Linux, oggi, è davvero molto facile. Solo qualche anno fa, la cosa era particolarmente ostica e creava spesso problemi, per poi ottenere dei risultati non del tutto soddisfacenti.
L'obbiettivo che mi sono posto era quello di poter utilizzare una banale webcam "USB" (Universal Serial Bus), peraltro obsoleta, per poter effettuare una prova di videosorveglianza di un locale; si tratta della "Intel Pro Share". Ovviamente si è trattato di una prova, l'obiettivo era sperimentale ed avrebbe dovuto essere integrato da videocamere professionali e chede di acquisizione se il test fosse andato a buon fine.
In realtà, mi interessava anche provare la videoconferenza sotto GNU/Linux quindi ho messo insieme queste necessità ed ho finito per scrivere questo breve How-To. Sicuramente, documenti migliori di questo, ce ne sono già molti ma non ne ho trovato uno che facesse al caso mio quindi, ho deciso di scriverlo mettendo insieme il percorso seguito.

[modifica] Predisposizione del sistema (kernel)

La distribuzione scelta è la "Slackware 9.1" con "KDE 3.2" perchè ho dovuto,per forza di cosa, lavorare in grafica.
Essendo una webcam USB (ormai lo sono la maggior parte) è necessario il supporto USB nel kernel ed è sufficiente usare il kernel standard della Slackware 9.1 che supporta giàtutti i moduli necessari. Coloro che avessero effettuato una ricompilazione, devono assicurarsi di aver incluso questi moduli :

#lsmod
[INVIO]

...ed otterremo il seguente output:

Module      Size      Used by      Not tainted
konicawc    7828      0
usbvideo   25304      0            [konicawc]
videodev    6080      1            [usbvideo]
usb-ohci   18920      0            [unused]
usbcore    63712      1            [konicawc usbvideo usb-ohci]

Il .config del kernel per la parte USB è il seguente :

# USB support
#
CONFIG_USB=m
CONFIG_USB_DEBUG is not set
CONFIG_USBDEVICEFS=y
CONFIG_USB_EHCI_HCD=m
CONFIG_USB_UHCI=m
CONFIG_USB_UHCI_ALT=m
CONFIG_USB_OHCI=m
CONFIG_USB_AUDIO=m
# CONFIG_USB_STORAGE_DEBUG is not set
CONFIG_USB_HIDDEV=y
CONFIG_USB_KONICAWC=m

Il modulo usato per la mia webcam è il USB_KONICAWC (Konica Webcam) visto che nel kernel vi è il supporto per il suo chip specifico (Intel YC76 webcam). Per maggiori informazioni, possiamo dare un'occhiata al seguente link: konica. Per quel che riguarda il supporto del V4L (Video 4 Linux), occorre compilare il modulo nella sezione "Video4Linux"; anche in questo caso, i moduli necessari, sono presenti nel kernel precompilato standard :

Sezione Video4Linux
#Multimedia devices
#
CONFIG_VIDEO_DEV=m

Riepilogando, i moduli essenziali da caricare sono :

modprobe usbcore
modprobe usb-ohci
modprobe videodev
modprobe konicawc

Una volta riavviato il sistema, dovremmo predisporre l'hotplug che consente di utilizzare un dispositivo USB "al volo". Grazie ad esso, il nostro computer, può rilevare automaticamente la periferica (webcam) appena connessa. Nel caso in cui l'hotplug non sia stato attivato all'atto dell'installazione, possiamo sempre renderlo eseguibile col comando :

#chmod 0755 /etc/rc.d/rc.hotplug

A questo punto, una volta collegata la webcam, dovremmo poterla vedere nell'output del seguente comando :

#lsusb
[INVIO]

... e vedremo :

Unknown line at line 1809
Duplicate HUT Usage Spec at line 2650
Bus 002 Device 001: ID 0000:0000 Virtual Hub
Bus 002 Device 003: ID 04c8:0720 Konica Corp. Digital Color Camera
Bus 001 Device 001: ID 0000:0000 Virtual Hub

A questo punto avremo un device /dev/video0 che è quello che verrà utilizzato dai nostri programmi per l'acquisizione delle immagini. Per poter ottenere informazioni sui device USB, verificate di aver installato usbutils; questo, per poter utilizzare i tool di diagnostica lsusb e usbmodules. Ad esempio, nel mio sistema :

usbmodules --device /proc/bus/usb/002/002
konicawc

[modifica] Panoramica sui softwares utilizzati

Per prima cosa proviamo a predisporre il sistema per la videoconferenza, dovrebbe essere semplice. Installiamo a questo punto il miglior pacchetto di videoconferenza sotto GNU/Linux Gnomemeeting.

[modifica] Gnomemeeting: installazione ed utilizzo

Possiamo scaricare il pacchetto in diversi formati da questo link insieme anche agli altri necessari ossia :

gnomemeeting-1.0.tgz
libdv-0.101.tgz
libraw1394-0.9.0.tgz
openh323-1.0.tgz

Se abbiamo tutti i pacchetti nella medesima directory, possiamo installarli con un solo comando :

#installpkg *.tgz
[INVIO]

Ovviamente, sono necessarie le librerie di GNOME e, non avendole installate, ho fatto :

#mount /dev/hdb /mnt/cdrom
[INVIO]

...dopodichè :

#cd /mnt/cdrom/slackware/gnome
[INVIO]

...e rifaremo :

#installpkg *.tgz
[INVIO]

Il device video, come detto prima, è /dev/video0; controlliamo che abbia tutti i permessi settati correttamente, altrimenti cambiamoli con :

#chmod o+rw /dev/video0
[INVIO]

...e :

#chmod +x /dev/video0
[INVIO]

A questo punto, possiamo anche eseguire Gnomemeeting nel nostro ambiente grafico. Questo programma, è stato appositamente pensato per la videoconferenza e per questa funzionalità mi sembra davvero ben progettato; molto semplice sia da configurare che da gestire.
In realtà, il nostro obiettivo era un altro, ovvero usare la webcam per acquisizione immagini (videosorveglianza); vedremo questo nei successivi paragrafi. Risorse : [1] [2]

[modifica] Videosorveglianza e cattura d'immagini e filmati

Usare Gnomemeeting è semplice un po' come il software da cui ha preso spunto (o forse solo una parte del nome), ovvero "Netmeeting". Supporta connessioni TCP o su protocollo modem H323 e possiede un comodo wizard per l'identificazione dell'hardware. Devo dire che questa è la parte che meno mi interessava; ero più orientato ad utilizzare la webcam per effettuare la cattura delle immagini.
Ho provato con "Vjgrabbj", per il quale è disponibile un bellissimo How-To molto chiaro. Nel mio caso, però, non sono riuscito a compilarlo e ciò mi ha fatto orientare su di un altro software, ossia "Camstream". Per coloro che volessero comunque provare Vjgrabbj, può trovare maggiori informazioni nel seguente link :
[3]
Il programma in questione, richiede i seguenti pacchetti :

  • Libjpeg
  • Libpng
  • Zlib
  • Ftplib (opzionale)
  • Freetype (opzionale)

Per quanto riguarda invece la documentazione del progetto, potete guardare qui.

[modifica] Camstream: installazione ed utilizzo

E' basato sulle librerie "QT" ma, se avete "KDE" installato come nel mio caso, dovreste già averr tutto ciò che serve.
Per coloro che non le avessero installate, sono comunque reperibili presso :
http://www.trolltech.com/
Gli obiettivi del progetto, come annunciato anche sul sito, sono ambiziosi:

  • Webcamming: permette di salvare e fare upload di immagini ad intervalli regolari
  • Video conferencing
  • Webcam broadcast (including server): consente di fungere da webcam server
  • Registrazione di filmati (AVI, Quicktime) attraverso la webcam e loro riproduzione
  • Uso della webcam come videocamera di sorveglianza

Per ora si può utilizzare solo la prima funzionalità, che sembra essere comunque davvero ben supportata.
Il software si installa e si utilizza semplicemente :

wget http://www.smcc.demon.nl/camstream/download/camstream-0.26.3.tar.gz
[INVIO]

...dopodichè :

#./configure
#make && make install

Prima di utilizzare il programma, è bene notare come sia stato associato a "Camstream" un altro programma: "Caminfo". Quest'ultimo è utile per l'analisi del device e del nostro hardware; praticamente, viene effettuata una sorta di "interrogazione" della telecamera. Nel nostro caso, avremo:

#./caminfo
[INVIO]

...che ci mostrerà :

CVideoDevice::ResetImagesRGB()
CVideoDevice::ResetImagesYUV()
CVideoDevice::ResetImagesRGB()
CVideoDevice::ResetImagesYUV()
CVideoDevice::ResetImagesRGB()
CVideoDevice::ResetImagesYUV()
Detected 1 Video4Linux devices.
Device node     :/dev/video0
Name of device     :"Konica Webcam"
Minimum size     :160x120
Current size     :0x0
Video inputs     :1
Input 0
Name     :"Camera"
Type     :Camera
Audio     :no
Tuners     :no
Audio inputs     :no

Per eseguire il software, bisogna digitare dalla bash il comando :

#camstream
[INVIO]

A questo punto, dovrebbe aprirsi una finestra; dalla tab "File", scegliere "OpenViewer".
Se non si sono incontrati problemi, il device dovrebbe essere quello della nostra telecamera (identificato prima col comando "lsusb") in quanto l'unico del sistema:

#lsusb
[INVIO]

...che mostra:

Bus 002 Device 002: ID 04c8:0720 Konica Corp. Digital Color Camera

Fatto ciò, basterà impostare le dimensioni iniziali per l'immagine che verrà acquisita e cliccare su "OK". Potremo finalmente vedere ed acquisire in formato statico (snapshot) ciò che la webcam riprende.
Questo software consente di visualizzare le immagini ed effettuare il grabbing utilizzando la toolbar. Inoltre, è possibile creare degli snapshot in vari formati ad inttervalli di tempo prestabiliti. E' possibile inoltre, avere in sovraimpressione il timestamp.
Inoltre, prevede la creazione di immagini in sequenza o con il nome composto dalla data. In alternativa a ciò, si può optare per l'aggiornamento di un unico file, come nel caso dell'utilizzo di una webcam su Internet che, ad intervalli regolari di tempo, aggiorna l'immagine.
La configurazione è semplice :

  • con il primo bottone a sinistra, possiamo modificare i controlli della webcam, come:
    • Dimensione (risoluzione)
    • Framerate
    • Saturazione
    • Contrasto
    • Luminosità
    • Gamma
  • Il secondo bottone, ci permette di programmare il comportamento della videocamera ed è il più importante:
  • Il terzo ci permette di visualizzare l'ultimo snapshot a fianco della ripresa in tempo reale
  • I 2 bottoni successivi, ci consentono di prelevare degli snapshot direttamente o ad intervalli di tempo prefissati (secondi e minuti)
  • L'ultimo dei bottoni, abilita o disabilita l'audio; per gestire quest'ultimo,Camstream, utilizza i driver "ALSA" .

In conclusione, posso dire di aver trovato questo programma davvero ben fatto; di semplice installazione ed utilizzo rispetto ad altri programmi, non ha richiesto nulla di particolare.
Ho provato ad impostare il salvataggio su di una directory esportata con "Samba", sia visualizzando le immagini dalla rete direttamente col previewer del file manager, sia utilizzando programmi in ambiente Microsoft Windows© (con Moviemaker) per effettuare montaggi di immagini in sequenza ed ottenere dei brevi filmati.

[modifica] Motion: Installazione e configurazione

Un'alternativa, sicuramente più completa e professionale, è rappresentata da "Motion" che consente di archiviare le immagini solo nel caso in cui la telecamera percepisca dell'attività; in questo modo, possiamo risparmiare notevoli risorse e spazio disco.
Motion utilizza il "V4L" (Video 4 Linux) per la cattura delle immagini.
Non è un programma nato per visualizzare su schermo le immagini in tempo reale, ma piuttosto per poterle acquisire, salvare e poterle elaborare in un secondo momento.

[modifica] Installazione

Per poter procedere all'installzione, si ha bisogno dei seguenti pacchetti :

La sua installazione può essere fatta con il supporto di "libavcodec" che cio consentirà di creare filmati mpeg riepilogativi delle sequenza registrate.
Il programma può essere prelevato da :
http://keihanna.dl.sourceforge.net/sourceforge/motion/motion-3.0.7-1.tar.gz.
...ed installato con le seguenti opzioni :

#./configure --with-libavcodec=/usr/src/ffmpeg-0.4.8/libavcodec && make && make install && ldconfig
[INVIO]

L'esecuzione richiede un po' di pazienza e di verifiche in modo da ottenere la configurazione necessaria visto che possiede molte opzioni. Il file da controllare è "motion.conf" che di default, viene salvato in "/usr/local/etc/".
Il programma, costruisce una struttura a directory molto pratica da consultare in cui le immagini salvate vengono divise per anno/mese/giorno/ora/minuto. In questo modo, sfruttando il preview del filemanager, potremmo visualizzare le immagini ottenute soltanto quando è stato registrato movimento nello spazio d'inquadratura della webcam.

[modifica] Costruzione di filmati con motion

I filmati, si possono creare utilizzando l'"mpeg_encoder" oppure usando libavcodec. Per chi volesse utilizzare mpeg_encoder, lo può reperire da qui.
Per installarlo, io ho fatto così :

#mkdir /root/mpeg
[INVIO]
#cd /root/mpeg
[INVIO]
#tar -xvzf mpeg_encode-1.5b-src.tar.gz
[INVIO]
#make && make install
[INVIO]
#jpeg/configure
[INVIO]
#make && make install
[INVIO]

Se invece si decidesse di utilizzare libavcodec, basta configurare i parametri necessari nel file motion.confcosì :

ffmpeg_cap_news yes # specifica di utilizzare ffmpegs libavcodec per
creare filmati mpeg in tempo reale
ffmpeg_timelaps on # specifica l'utilizzo di ffmpeg libavcodec per codificare timelaps movie
ffmpeg_bps 400000 # Bitrate del filmato mpeg prodotto da ffmpeg
jpg_cleanup no # se settato a "no" dopo aver creato il filmato, rimuove
le immagini "jpeg"

A questo punto, si può eseguire motion e visualizzare i filmati creati.

[modifica] Dettagli sulla configurazione (motion.conf)

Come detto, motion, richiede almeno una configurazione minima anche se potrebbe andare bene, per gli utilizzi standard, il file "motion.conf" installato di default.
Se opportunamente modificato, questo programma, fa davvero molte cose; vediamo alcune delle opzioni :

# Capture device options:
videodevice /dev/video0

(Imposta il device di default per l'acquisizione delle immagini).

framerate 100

(E' il numero massimo di frames che può salvare al secondo).

width 320

(La larghezza di ogni singolo frame).

height 240

(L'altezza di ogni singolo frame).

#Motion detection settings:
#Threshold for declaring motion (number of changed pixel in an image) - (Default 1500) 
threshols 500

(Con questo valore specifichiamo quanti pixel devono essere modificati perchè motion identifichi il movimento; abbassando questo valore, aumenteremo la sensibilità delle telecamere ed aumenteremo il numero di frames registrati).

#noise_level sets the noise threshold for the motion detection (Default: 32)
noise_level 16)

(Permette di impostare il livello di disturbo necessario alle webcam per registrare i movimenti).

#This option enable motion to adjust its noise level for very dark frames
#Default: no
night_compensate yes

(Consente di imposter la "compensazione notturna" per il livello di disturbo).

#Only capture one frame per second when no detecting motion
#Default: no
low_cpu yes

(Se impostato a "yes" riduce il lavoro del sistema e della cpu che salva un solo frame quando non viene rilevato alcun movimento).

#Activate the light switch filter
#Default: off
lightswitch yes

(Consente di impostare un filtro che impedisce a motion di considerare movimenti le variazioni di luminosità percepite dalle webcam).

#Warnings and logging:
daemon no

(Abilita l'esecuzione in background "daemon mode").

mail root@localhost

(Invia una notifica via mail ad ogni movimento registrato).

execute command

(Esegue un comando ad ogni movimento rilevato).

onsave onsavescript.sh

(Esegue un comando ad ogni creazione di immagine come, ad esempio, un suono).

onmpeg echo

(Esegue un comando ad ogni filmato prodotto come, ad esempio, un suono).

#Image output
locate

(Se impostata a "yes" disegna un riquadro attorno alla parte di immagine modificata).

snapshot 60

(Crea un'immagine di snapshot ogni tot secondi comunque anche in assenza di movimento).

output_normal yes

(Crea le immagini salvate da motion relative ai singoli movimenti rilevati; è indispensabile attivarlo per avere le singole slide dei movimenti).

output_motion yes

(Crea anche le immagini solo dell'oggetto in movimento - immagini a fondo verde con in bianco solo i pixel modificati).

realmotion

(Questa opzione modifica il metodo di funzionamento della direttiva "output_motion"; normalmente mostra solo i pixel di cui sono stati identificati dei cambiamenti dell'ultima immagine relativamente all'ultimo frame, se invece si imposta a "real_motion on" le immagini conterranno tutti i pixel modificati nell'immagine).

snapshot_overwrite no

(Sovrascrive lo stesso snapshot senza crearne uno nuovo).

quality 100

(Imposta la qualità delle immagini salvate, "100" è il massimo).

target_dir snapshot

(E' il path assoluto dove verranno salvate le immagini ed i filmati).

ffmpeg_cap_new yes

(Consente a motion di utilizzare libavcodec per codificare filmati mpeg in tempo reale).

ffmpeg_cap_motion on

(Usa ffmpeg per creare i filmati delle immagini di motion).

ffmpeg_timelaps on

(Usa ffmpeg per codificare il timelaps per i filmati).

ffmpeg_bps 40000

(Bitrate per i filmati creati).

max_mpeg_time 60 # 1 minuto

(Lunghezza massima in secondi dei filmati creati da mpeg).

jpg_cleanup no

(Elimina i ".jpg" in caso di creazione del filmato).

#User defined text in image parameters
drawtext_user Ufficio

(Aggiunge la scritta "Ufficio" su ogni snapshot).

drawtext_changes on

(Segna il numero di pixel modificati).

drawtext_shots on

(Imposta il "timestamp" per gli snapshot).
Nel caso si volessero usare due telecamere, occorre impostare un file esterno per la seconda webcam chiamato thread2.conf. Nel file "motion.conf" specificheremo la direttiva "thread /usr/local/etc/thread2.conf".
Questo file, dovrà contenere almeno le direttive :

#/etc/thread2.conf
#Videodevice to be used for capturing
videodevice /dev/video1
#Target directory for pictures
target_dir /home/paolo/webcam2
drawtext_user Camera_Porta

[modifica] Esecuzione di motion

Motion può essere eseguito normalmente da riga di comando lanciando semplicemente :

#motion
[INVIO]

In questo modo, potremo effettuare il debug verificando il comportamento del programma. Nel caso in cui si voglia eseguirlo in modalità daemon mode, occorre specificarlo nel file motion.conf con l'opzione daemon impostata su on. In questo modo, dovremmo visualizzare le acquisizioni se occupiamo il campo visivo della webcam.

#motion
[INVIO]

Visualizzeremo :

thread0 device: /dev/video0 input: 1
waiting for threads to finish, pid: 6351
New threshold: 1500
1465
New threshold: 1500
11856
File of type video/mpeg saved to: /htdir/htdocs/webcam/2004/04/14/172711.mpg
type: 15 15
File of type image/jpg saved to: /htdir/htdocs/webcam/2004/04/14/172711.jpg
4214
New threshold: 1500
6
New threshold: 1500
1051

Ovviemente, molti dei parametri specificati nel file di configurazione "motion.conf", di default installato in /usr/local/etc, possono essere specificati da linea di comando :

#motion -h
[INVIO]
motion Version 3.1.10, Copyright 2000 Jeroen Vreeken
usage: motion [option]
Overall settings:
-C Output changes count for every frame, usable for tuning
-D daemonize
-a seconds time between two automated snapshots, default: 0
Strumenti personali
Namespace

Varianti