Rev 174 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
174 | giacomo | 1 | Guida all'uso del driver BTTV per S.Ha.R.K |
2 | Giacomo Guidi <giacomo@gandalf.sssup.it> |
||
3 | |||
4 | DIRECTORY DEL DRIVER: shark/drivers/bttv/ |
||
5 | SIMBOLO NEL MAKEFILE PER INSERIRE LA LIBRERIA: __BTTV__ |
||
6 | |||
7 | Il nuovo driver per Frame Grabbers e' preso al 90% dall'analogo |
||
8 | driver linux e supporta buona parte delle schede dotate di BT848 |
||
9 | in commercio. |
||
10 | |||
11 | E' stato integrato anche un supporto al bus I2C necessario |
||
12 | per accedere ai sotto-sistemi interni al Frame Grabber, |
||
13 | come chip audio o sintonizzatori televisivi. |
||
14 | |||
15 | Per utilizzare questo driver si puo' passare dai comandi base |
||
16 | del driver BTTV, definiti dentro bttv-driver.c oppure usare una |
||
17 | veloce interfaccia (fg.c) che ho creato per ridurre al minimo le |
||
18 | operazioni di inizializzazione e uso della periferica. |
||
19 | |||
20 | ------------------------------------------------------------------------------- |
||
21 | Header e funzioni per l'uso semplificato |
||
22 | ------------------------------------------------------------------------------- |
||
23 | |||
24 | //Header delle funzioni per l'uso facilitato del Frame Grabber |
||
25 | #include <drivers/fg.h> |
||
26 | |||
27 | //Header per le strutture e funzioni a basso livello del BTTV |
||
28 | #include <driver/bttv.h> |
||
29 | |||
30 | //Istruzione di inizializzazione semplificata |
||
177 | giacomo | 31 | FG_init(period,wcet,width,height,color); |
174 | giacomo | 32 | |
33 | --- |
||
34 | period: periodo del grabbing, ovvero quanti microsecondi passano |
||
35 | fra ogni campianamento dell'immagine |
||
36 | |||
37 | wcet: durata massima del task di grabbing. Definisce quanto |
||
38 | deve durare al massimo il campionamento + l'elaborazione |
||
39 | dell'immagine. |
||
40 | |||
41 | width: larghezza finestra di campionamento |
||
42 | |||
43 | height: altezza finestra di campionamento |
||
44 | |||
177 | giacomo | 45 | color: puo' essere FG_MONO o FG_RGB24 |
46 | |||
174 | giacomo | 47 | Esempio: |
48 | --- |
||
49 | |||
177 | giacomo | 50 | FG_init(50000,15000,400,300,FG_MONO); |
174 | giacomo | 51 | |
52 | --- |
||
53 | |||
54 | Attenzione al periodo di campionamento, e' buona regola non scendere |
||
55 | sotto i 40000 us ovvero 25 fps. Bisogna tenere presente che il frame |
||
56 | grabber usa massicciamente il bus PCI e il DMA per spostare il flusso |
||
57 | delle immagini. Va sempre settato il massimo periodo possibile che la |
||
58 | vostra applicazione richiede, evitate di sprecare risorse con grabbing |
||
59 | a 25 fps se poi non c'e' il tempo di gestire tutte le immagini raccolte. |
||
60 | |||
61 | Il pricipio base e' che nessuna immagine va sprecata. Per cui se il |
||
62 | processore permette di elaborare solo 1 immagine ogni 120000 us, non |
||
63 | settate il FG a 40000 us per poi usare 1 immagine su 3. |
||
64 | |||
65 | Per cercare di usare bene le risorse di sistema ed evitare una gestione |
||
66 | errara dei buffer del FG ho inserito una funzione virtuale |
||
67 | |||
68 | elaborate_frame_hook <fg.c> |
||
69 | |||
70 | che viene chiamata ad ogni inizio del ciclo di grabbing. Questa funzione |
||
71 | di default e' inizializzata a dummy_elaborate_frame, per cui non fa |
||
72 | niente, ma puo' essere usata dall'utente se e' richiesta una qualche |
||
73 | elaborazione dell'immagine... puo' essere una copia del buffer nella |
||
74 | memoria video per vedere il grabbing in azione o un complicato |
||
75 | algoritmo di tracking. |
||
76 | |||
77 | Se ad esempio creo una funzione tipo |
||
78 | |||
79 | frame_elaborate(void *imageptr) { |
||
80 | |||
81 | //Codice di elaborazione |
||
82 | |||
83 | } |
||
84 | |||
85 | dove lavoro l'immagine presa. Posso chiamare |
||
86 | |||
87 | FG_sethook(frame_elaborate) |
||
88 | |||
89 | per fare in modo che frame_elaborate venga chiamata automaticamente |
||
90 | ad ogni immagine acquisita. Se ad esempio frame elaborate e' troppo |
||
91 | complicata puo' capitare che venga mancata la deadline del task di |
||
92 | grabbing (hard_task). A quel punto o si riducono i calcoli di questa |
||
93 | funzione o si aumenta il periodo di grabbing. |
||
94 | |||
95 | Se non si ottengono deadline miss significa che tutto funziona bene |
||
96 | e sicuramente la funzione elabora sempre l'ultima immagine registrata. |
||
97 | Il grabber infatti usa il sistema del Double Buffer, per cui l'immagine |
||
98 | su cui si lavora e' sempre completa ed integra. |
||
99 | |||
100 | Per passare parametri alla funzione frame_elaborate penso sia piu' |
||
101 | facile ricorrere a variabili globali piuttosto a passaggi di variabili |
||
102 | generiche ridefinite volta per volta. Per cui la funzione di elaborazione |
||
103 | deve essere sempre definita in questo modo: |
||
104 | |||
105 | void nome_funzione(void *imageptr); |
||
106 | |||
177 | giacomo | 107 | Tenete conto che con FG_RGB24 invece di 1 byte per pixel nel buffer |
108 | passate ad una modalita' RGB. |
||
174 | giacomo | 109 | |
177 | giacomo | 110 | Dopo averlo inizializzato chiamate |
174 | giacomo | 111 | |
177 | giacomo | 112 | FG_start_grabbing(); |
113 | |||
114 | per farlo partire. |
||
115 | |||
174 | giacomo | 116 | ------------------------------------------------------------------------------- |
117 | Consigli per il Frame Grabber in generale. |
||
118 | ------------------------------------------------------------------------------- |
||
119 | |||
120 | Giocando con i paramentri di luminosita', contrasto e saturazione si |
||
121 | riesce a rendere l'immagine piu' semplice da elaborare (ad esempio per fare |
||
122 | il tracking di un oggetto in moto) senza ricorre a complicati algoritmi che |
||
123 | andrebbero a pesare sul processore. |
||
124 | |||
125 | Queste funzioni vengono chiamate da bttv_ioctl definita in bttv-driver.c |
||
126 | |||
127 | Prima di inizializzare il FG con la grafica provate a farlo partire in |
||
128 | modalita' testo, cosi' l'output a schermo vi permette di vedere se la |
||
129 | routine di init va a buon fine o se ci sono delle anomalie. |
||
130 | |||
131 | Una volta che sieti sicuri venga riconosciuta la vostra scheda e' buona |
||
132 | regola inizializzare il FG DOPO LA SCHEDA VIDEO. Questo perche' ho |
||
133 | riscontrato alcuni problemi con gli interrupt chiamati dalla VESA se il FG |
||
134 | e' gia' in funzione. |
||
135 | |||
136 | ------------------------------------------------------------------------------- |
||
137 | Programma di esempio: BTTVDEMO |
||
138 | ------------------------------------------------------------------------------- |
||
139 |