acquisire ed elaborare immagini - prima parte luca capisani

84
Acquisire ed elaborare immagini - Prima parte Luca Capisani

Upload: amadeo-roberto

Post on 01-May-2015

223 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Acquisire ed elaborare immagini -

Prima parteLuca Capisani

Page 2: Acquisire ed elaborare immagini - Prima parte Luca Capisani

SOMMARIO

• Acquisizione immagini con Network Camera• Rete Ethernet e protocollo HTTP• Sistema operativo Linux• Rappresentazione delle immagini• Richiedere/Ottenere immagini con HTTP• ESEMPIO: Configurare la telecamera in diretta• Esempio: GIMP e le immagini esadecimali

Page 3: Acquisire ed elaborare immagini - Prima parte Luca Capisani

SOMMARIO - 2

• La programmazione nel linguaggio C• Blocchi fondamentali di un programma C• ESEMPI: – Un semplice programma C– Le strutture di controllo del linguaggio C– Le librerie di rete di Linux per il linguaggio C– Come acquisire una immagine da telecamera– Come salvare l’immagine su un file

Page 4: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Acquisizione immagini con Network Camera

• Scambio di immagini

• Mediante Ethernet/WI-FI Internet

• Accesso da qualunque dispositivo che accede alla rete Internet!

Page 5: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Network Camera: quali risorse utilizza?

• La rete Ethernet

• La rete Internet

• I protocolli TCP/IP

• Il protocollo Client/Server

• Browser per Internet!!!

Page 6: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Network Camera: vantaggi?Perché è una soluzione interessante?

• Vecchie telecamere: connessioni particolari– Servivano schede apposite, difficili da trovare e

programmare – Mancavano i drivers per applicazioni particolari– Tali interfacce erano spesso analogiche e costose– Un solo utilizzatore alla volta!!!

• Nuove telecamere: Ethernet e WI-FI– Ethernet e Wi-FI supportate da buona parte dei sistemi– Bassissimo costo di realizzazione della connessione– Ottima veliocità di trasmissione dati– Molto semplice condividere la telecamera tra più utenti– Non serve software dedicato!

Page 7: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Network Camera: Configurazione

• Per poter funzionare in rete bisogna:– Impostare l’accesso di utenti– Configurare l’indirizzo IP– Configurare il tipo di video desiderato– Configurare la luminosità e i colori

• L’utente usa un calcolatore da configurare:– Indirizzo IP del calcolatore– Software in grado di acquisire e visualizzare le

immagini/ il video

Page 8: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Network Camera: Configurazione utenti

Serve per• Impostare chi può usare la telecamera

• Evitare che venga usata da chi non è autorizzato (la rete è pubblica!)

• Evitare che chiunque possa cambiare le impostazioni

Page 9: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Network Camera: Configurazione Indirizzo IP

• La telecamera è connessa su una rete condivisa da tanti dispositivi

• Deve avere un indirizzo IP unico, non utilizzato da altri dispositivi, coerente con la rete a cui è connessa– Esempio: 192.168.121.12

• La netmask specifica quali altri indirizzi IP appartengono alla stessa rete:– Esempio 255.255.255.0 significa che appartengono alla rete tutti

gli indirizzi che iniziano con 192.168.121

• Sbagliando l’indirizzo IP non è possibile usare la telecamera!

Page 10: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Network Camera: Formato video/immagine

Permette di:• Impostare la risoluzione dell’immagine– Es. 320x240

• Il tipo e la qualità dell’immagine– Es. Dimensione del file ecc.

• Quante immagini al secondo vengono spedite– Es. 15 frame/secondo

Page 11: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Network Camera: Configurazione colori e luminosità

• Configurazione colori– Da bianco e nero al massimo risalto dei colori

• Luminosità– Va impostata in base a quanta luce c’è nell’ambiente

da filmare

• Contrasto– Permette di “sbiadire” l’immagine oppure “renderla

più viva”

Page 12: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Network Camera: Collegamento e configurazione calcolatore Client

• Schema di collegamento:Switch

Ethernet

Utente

Il client deve avere:•Indirizzo IP•Netmask Devono essere coerenti con la rete di appartenenza!

IP: 192.168.0.34MASK: 255.255.255.0

IP: 192.168.0.1MASK: 255.255.255.0

AltriUtenti

Page 13: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Rete Ethernet e protocollo HTTP• Sono supportati da TUTTI gli apparecchi in grado

di connettersi alla rete!

• HTTP: permette lo scambio di FILES:– Il Client (utente) chiede al server (telecamera) un file– Il server risponde con il file richiesto (se esiste)

Page 14: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Come avviene lo scambio di dati sulla rete

• Ciascun livello (applicazione TCP, IP, Scheda Rete) ha una propria specifica funzione.

• L’applicazione traduce il filmato in una serie di “pacchetti di dati” da spedire in rete

Applicazione

TCP

IP

Scheda Rete

Applicazione

TCP

IP

Scheda Rete

Page 15: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Come avviene lo scambio di dati sulla rete (2)

• Il flusso di dati viene suddiviso in “Pacchetti”• Ogni pacchetto attraversa la rete indipendentemente dagli altri• Un pacchetto può essere perso in tutto o in parte durante il

percorso• Ogni pacchetto contiene tutte le informazioni rilevati sul percorso

Applicazione

TCP

IP

Scheda Rete

Applicazione

TCP

IP

Scheda Rete

Page 16: Acquisire ed elaborare immagini - Prima parte Luca Capisani

A cosa serve il protocollo IP• Quando la rete è complessa (es. Internet) non è facile capire

quale strada connette meglio due utenti

• La rete IP serve, come una guida telefonica, per trovarea che rete è connesso il destinatario!!!!

• Ogni router ha una rubrica telefonica che dice dove vanno i pacchetti a seconda del destinatario!

193.201.x.x

13.33.x.x

13.33.x.x ????13.33.x.x??

Page 17: Acquisire ed elaborare immagini - Prima parte Luca Capisani

A cosa serve il protocollo TCP

• TCP serve per:– Mantenere una connessione tra telecamera e

client

– Controllare che non siano stati persi dati sulla rete

– Permettere tanti flussi di dati contemporanei

– Facilitare l’applicazione nel gestire la trasmissione

Page 18: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Cos’è una porta? Che porta useremo?

• E’ il meccanismo per poter permettere a tante applicazioni di usare la stessa architettura di rete senza interferenze!!!!

Applicazione

TCP

IP

Scheda Rete

P23 P80 P110

TELNET HTTP POP3 Porta 80: è la porta predefinita per le comunicazioni HTTP alla base del trasferimento delle pagine WEB tra i server WWW e i client (utenti).

Viene usata dall’applicazione Internet Explorer (o Mozilla) e dal rispettivo server (Telecamera, Apache o Microsoft Internet Information server).

Page 19: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Possiamo vedere il traffico della rete?• Con il programma gratuito wireshark, si può vedere quali informazioni

vengono ricevute e quali vengono spedite dal nostro PC:

Page 20: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Il protocollo HTTP: a cosa serve?

• Il protocollo HTTP (HyperText Transfer Protocol) – permette di trasferire dei files da un server HTTP

(Apache, Internet Information Server, Network Camera) a un client HTTP (Mozilla Firefox, Internet Explorer)

– Permette di controllare se il richiedente è autorizzato a ricevere il file

– Fornisce informazioni supplementari riguardo al file trasferito e alle caratteristiche del client e del server.

Page 21: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Scambio di richieste risposte tra PC (client) e telecamera (server)

• Richiesta:GET /mjpg/image.jpg HTTP/1.1Host: 192.168.121.12User-Agent: Mozilla/5.0 (Windows; U;

Windows NT 5.1; it; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3

Accept: image/png,image/*;q=0.8,*/*;q=0.5

Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3

Accept-Encoding: gzip,deflateAccept-Charset: ISO-8859-1,utf-

8;q=0.7,*;q=0.7Keep-Alive: 300Connection: keep-aliveReferer:

http://192.168.121.12/view/view.shtml?imagePath=/mjpg/video.mjpg&size=1

Authorization: Basic cm9vdDpmcmFuY2VzY2E=

Nome del file richiesto e vers. HTTP

Indirizzo IP del server

Informazioni sull’applicazione richiedente il servizio

Password di autorizzazione

Page 22: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Scambio di richieste risposte tra PC (client) e telecamera (server)

• Risposta:HTTP/1.0 200 OKCache-Control: no-cachePragma: no-cacheExpires: Thu, 01 Dec 1994 16:00:00 GMTConnection: closeContent-Type: multipart/x-mixed-replace; boundary=--myboundary

--myboundaryContent-Type: image/jpegContent-Length: 29423

......JFIF..

Il server risponde che la richiesta è corretta!

Ci informa che il contenuto richiesto è una immagine JPEG ed è lunga 29423 bytes!!!!

Il JPEG inizia a essere trasmesso!!!!

Page 23: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Qual è la procedura per farsi mandare una immagine?

• Mi connetto al server– Applicazione con protocollo HTTP– Manda una richiesta alla porta 80 del server

• Il server accetta la connessione

• Invio una richiesta GET /mjpg/image.jpg HTTP/1.1

– Specifico la password e altre info

• Il server risponde con le sue informazioni dalla porta 80 alla mia porta (che ha un numero a caso)– Alla fine comincia ad inviare i pezzi del file richiesto,– Tipicamente circa 1500 bytes alla volta

Page 24: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Il Sistema Operativo Linux• E’ composto da tantissimi blocchi, i quali sono sviluppati da

gruppi indipendenti di programmatori volontari

• E’ facilmente programmabile per interfacciarsi con la rete– La configurazione della rete è semplice– Ci sono tanti strumenti che aiutano in caso di problemi

• Offre gratuitamente tanti tool per la programmazione:– Compilatore C, C++, Java …– Editor– Librerie per fare qualunque cosa

• Interagire con l’utente• Accedere alla rete• Convertire le immagini• Leggere e Memorizzare i dati sul disco

Page 25: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Linux: componenti fondamentali• Distribuzioni (Chi mette assieme le componenti fondamentali)

• Kernel (il cuore del sistema operativo)• File system (gestisce i files di sistema e utenti)• Utenti e amministratore (Ciascuno ha le proprie regole!)• Interfaccia grafica (NON è parte fondamentale!)• Terminale (è il modo più diretto per accedere al sistema)

• Sistema di rete (Offre tutti gli strumenti indispensabili e oltre!)• I pacchetti software (sono sempre accessori rispetto al “piccolo

kernel”)

Page 26: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Distribuzioni• Dato che Linux è composto da tantissimi piccoli blocchi

programmati indipendentemente– Alcune importanti organizzazioni si occupano di “mettere

assieme” i blocchi– Per rendere più semplice ed immediata l’installazione– Per favorire gli utenti non esperti– Per assicurarsi che il sistema complessivo funzioni bene– Per tener traccia di tutti gli ultimi aggiornamenti sulla

sicurezza• Le più famose:– Mandriva, Ubuntu, Fedora, SuSE, Knoppix, Debian, Gentoo,

Slackware…– Elenco completo: http://www.linux.org/dist/list.html

Page 27: Acquisire ed elaborare immagini - Prima parte Luca Capisani

File system

• E’ l’insieme di tutti i programmi e dello spazio di memoria che servono per– Memorizzare i files– Evitare perdita di dati– Ritrovare velocemente i dati

• Lo spazio di memoria di Linux è tipicamente organizzato in 3 partizioni– root, “/”, mantiene l’albero principale delle directory– /home, mantiene i files dell’utente– swap, mantiene i files temporanei

Page 28: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Gli utenti e l’amministratore• In linux, ogni programma

– Può essere creato solo da alcuni utenti– Può essere installato solo dall’amministratore o da chi ne ha il

permesso– Può essere eseguito solo da chi ne ha il permesso

• In linux, ogni file– Può essere letto solo da chi ne ha il permesso– Può essere scritto/cancellato solo da chi ne ha il permesso– Può essere eseguito (se è un programma) solo da chi ne ha il

permesso• In linux, ogni risorsa (rete, periferiche, audio,video, …)

– Può essere utilizzata solo da chi ne ha il permesso

• L’amministratore (root) ha sempre tutti i permessi e può decidere i permessi degli altri

Page 29: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Gli utenti e l’amministratore (2)• Ogni utente:

– Ha una “user name” denominata login– Ha una password

• Ogni utente può:– Cambiare la propria password– Cambiare i permessi dei propri files, dei propri programmi e delle

proprie risorse

• Gli utenti non possono:– Vedere alcuna password– Utilizzare programmi, files, risorse assegnate ad altri

• L’amministratore (root) può:– Modificare le password di chiunque (non le può vedere)– Utilizzare e modificare qualunque programma, files o risorsa

(rischio!!!)

Page 30: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Il terminale• E’ il modo più diretto per interagire con tutte le funzioni del sistema

operativo• È dotato di un prompt che risponde ai comandi dell’utente

• Il prompt è gestito dalla shell che aiuta l’utente a

– Velocizzare le operazioni noiose

– Ricordare tutti i comandi utilizzati

– Effettuare alcune operazioni automaticamente

– Gestire l’interazione con i programmi

Page 31: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Il comando sudo

• Entrare come amministratore (root) è pericoloso:– Si possono cancellare, distruggere files e configurazioni– Si può resettare la macchina senza autorizzazioni

• Soluzione: è meglio usare l’utente root solo quando è necessario!!!– Solo alcuni comandi richiedono di essere amministratore– Basta scrivere prima del comando desiderato, il comando

sudo e inserire la password:– Esempio:

• enzo@www-server:~$ sudo ifconfig• [sudo] password for enzo: ****• ………

– NB: la password non appare a terminale!!!

Page 32: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Impostare gli indirizzi di rete

• Un Computer (Host IP), per connettersi alla rete, ha bisogno di:– Un Indirizzo IP e una netmask– Un indirizzo per il default gateway– Un indirizzo del server DNS• Tale indirizzo serve per tradurre i nomi degli host con

gli indirizzi IP

• La scheda di rete viene individuata con la sigla eth0

Page 33: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Impostare gli indirizzi di rete (2)

• Indirizzo IP e netmask:– sudo ifconfig eth0 192.168.x.x netmask 255.255.x.x

• Default gateway:– sudo route del default (cancella una route esistente)– sudo route add default gw 192.168.x.x

• Server DNS:– sudo echo nameserver 151.99.x.x > /etc/resolv.conf

Page 34: Acquisire ed elaborare immagini - Prima parte Luca Capisani

I pacchetti software

• Tutte le distribuzioni sono composte da pacchetti software:

• Spesso l’istallazione di alcuni pacchetti rende indispensabile l’installazione di altri pacchetti, struttura gerarchica!!!

Kernel

Glibc(librerie)

Bash(shell)

XORG(amb. Grafico)

netfilter(firewall)

CUPS(stampanti)

OpenOffice(Word, Excel,…)

libjpeg(x le immagini!)

Page 35: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Installare il software da Internet: APT-GET INSTALL

• Scarica da Internet e installa automaticamente uno o più pacchetti software andando a cercare automaticamente le dipendenze

• Esempio: installazione editor GEDIT– sudo apt-get install gedit

• Funziona solo sulle distribuzioni Debian-Ubuntu– Mandriva: urpmi

Page 36: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Visualizzazione di un file con CAT

• E’ il modo più veloce per visualizzare un file da terminale– Comando: cat /home/lab/pippo

• Visualizza il file pippo nella cartella /home/lab

Page 37: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Visualizzazione di un file esadecimale con HEXDUMP

• E’ il modo più veloce per visualizzare un file in esadecimale– Comando: hexdump /home/lab/pippo

• Visualizza il file pippo nella cartella /home/lab

Page 38: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Editing di un file con GEDIT

• E’ un editor che ha funzioni specifiche per programmare.

• Si avvia da terminale con il comando gedit &

Page 39: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Rappresentazione delle immagini

• Ciascuna immagine è rappresentata nel computer per mezzo di numeri

• L’area viene suddivisa in tanti piccoli quadrati colorati

• Ci sono metodi efficienti per la memorizzazione

• Vediamone i dettagli.

Page 40: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Come viene rappresentata una immagine? ZOOM!

• Una immagine è una sequenza di tantissimipuntini coloratidetti pixel (PICture ELement)

Page 41: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Dimensioni dell’immagine

• Una immagine è una grande matrice di pixel:– La dimensione è il numero di pixel orizzontali x il

numero di pixel verticali:– 640x480– 800x600– 102x768– Ecc.

Page 42: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Colorazione pixel RGB!• Ogni pixel ha un colore unico!

• Il colore del pixel è determinato in base a tre componenti fondamentali:– Rosso – R: 0-255– Verde – G: 0-255– Blu – B: 0-255

• In questo modo si possono ottenere più di 16 milioni di colori diversi (per ciascun pixel dell’immagine)!

Page 43: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Formati di immagine: cosa sono?

• Considerando il numero di pixels e il numero di colori di ciascun pixel, una immagine occupa tantissimo spazio.

• Una immagine si può memorizzare interamente così com’è– Formato RASTER: occupa molto spazio!– Esempio BMP

• Oppore si può memorizzare in modo da ridurre lo spazio occupato:– Formato lossy. Esempio: JPG

Page 44: Acquisire ed elaborare immagini - Prima parte Luca Capisani

I numeri esadecimali

• Sono rappresentazioni particolari dei numeri binari. • Ogni numero è una cifra da 0 a F che corrisponde ai

numeri da 0 a 15

Page 45: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Rappresentazione RGB esadecimale

• Esempio: il pixel

• È un mix dei colori:• Rosso: 224/255 Verde: 36/255 Blu: 36/255• Si rappresenta su tre bytes RGB.• Una rappresentazione semplice si ha in hex• E02424 (E0 (224), 24 (36), 24(36))

Page 46: Acquisire ed elaborare immagini - Prima parte Luca Capisani

ESEMPIO: Configurare la telecamera in diretta

• 1 coppia alla volta• Accedere alla telecamera con la userid e la

password di default• Impostare un indirizzo IP e una netmask

ammissibile per la rete• Verificare e cambiare le impostazioni

immagine/video• Controllare che le modifiche abbiano effetto• Non cambiare le password

Page 47: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Esempio: GIMP e le immagini esadecimali

• Aprire GIMP con il comando gimp & da terminale

• Creare una immagine nuova 1x1 pixel

• Immettere un pixel di un certo colore RGB

• Salvare l’immagine in uno dei seguenti formati:– PBM PGM XPM PPM BMP

• Verificare con hexdump che cosa è stato scritto su disco

• Ripetere l’esercizio con una immagine 3x3

Page 48: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Creare una immagine di pochi pixel

Page 49: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Impostare un colore

Page 50: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Colorare un pixel con quel colore, gli altri in nero

Page 51: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Salvare l’immagine in uno dei formati RASTER

Page 52: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Fare alcune prove confrontando i vari formati RASTER

• Cosa cambia tra i vari formati raster?

• Cosa cambia tra una immagine di 1 pixel e una di 9?

• Cosa si vede salvando l’immagine come jpg?

Page 53: Acquisire ed elaborare immagini - Prima parte Luca Capisani

La programmazione nel linguaggio C

• Rende semplice interagire con la rete ed elaborare le immagini

• Produce dei programmi estremamente veloci

• Non è indicato per creare programmi con finestre e pulsanti

Page 54: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Cosa serve per poter programmare in C

• Il compilatore GCC

• Le librerie di sistema (per aprire i files, connettersi alla rete, interagire con l’utente, ecc.)

• Alcune librerie aggiuntive per leggere/scrivere files jpeg

• Altre librerie contenenti funzioni già preparate per eseguire i programmi che ci interessano

Page 55: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Linguaggio C: il sistema operativo

• Funzionalità offerte dal sistema operativo

– Interfacciamento con l’utente (terminale ecc)

– Rete

– File system

– Ecc.

Page 56: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Il compilatore C di linux: GCC!

• Il suo funzionamento è semplicissimo:– gcc nomefile.c

• Produce un file eseguibile denominato a.out– Si esegue con il comando ./a.out

• Importante!!! Saper leggere i messaggi di errore di gcc!!!

Page 57: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Librerie di sistema: aiuto alla programmazione

• Ci sono compiti che non dobbiamo risolvere noi programmatori:– Come si invia un dato sulla rete?– Come si scrive un carattere sul video?– Come si scrive un file?

• Risposta?– Non ci interessa!

• Ci sono librerie già fatte per fare queste operazioni, basta saperle usare!

Page 58: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Librerie di sistema: aiuto alla programmazione

• Esempi: – #include <stdio.h>: contiene tutto ciò che ci

serve per gestire la stampa di caratteri a video!

– #include <sys/socket.h>, include <arpa/inet.h>, include <netdb.h>: contengono tutto ciò che ci serve per usare la rete!

– #include <string.h>: contiene tutto ciò che ci serve per usare le stringhe!

Page 59: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Librerie utente: permettono di scrivere il codice una volta per tutte!

• Esempio: Connettersi alla telecamera e richiedere una immagine è un problema ricorrente

• E’ meglio avere un pezzo di codice che lo fa, senza doverci preoccupare ogni volta del problema!

Page 60: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Blocchi fondamentali di un programma C

• Sezione INCLUDE:– Serve per includere le librerie e altri files .c– #include <stdlib.h> • Con le parentesi < e > si includono le librerie di sistema

– #include “mialib.h”• Con le virgolette si includono le librerie dell’utente

(nella stessa cartella dei programmi)– Inlcudere un file significa mettere il file indicato al

posto della parola include!!!– È come scrivere il codice al posto dell’include

Page 61: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Blocchi fondamentali di un programma C (2)

• Sezione DEFINE:– Serve per definire le costanti– #define imgX 640– #define imgY 480– Hanno lo stesso effetto di sostituire il numero al nome

della costante prima di compilare il codice!• Sezione del codice:– Metodi del programma

• Sono le parti del programma– Metodo main()

• Contiene quella parte di programma che viene chiamata non appena il programma parte

• Al suo interno chiama le altre parti (metodi) del codice

Page 62: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Blocchi fondamentali: metodo main()

int main(int argc, const char ** argv){

//Questo è un commento

leggiDati();

calcolaQualcosa();

scriviLaRisposta();

return 0; //Non ci sono errori

}

Page 63: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Blocchi fondamentali: PRINTF()

• La funzione printf()serve per visualizzare qualcosa all’utente

• Comunicare una informazione all’utente. Esempio:

• printf(“Ciao, come va?”);• Visualizza a video:• Ciao, come va?

Page 64: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Un semplice programma in linguaggio C

Nome file: prova.c

#include <stdio.h>

int main(int argc, const char ** argv){

printf(“Ciao, come va?”);

return 0;

}

Page 65: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Copiare, salvare, compilare ed eseguire l’esempio

• Copiare l’esempio con l’editor GEDIT

• Salvare il file .c

• Compilare con il comando gcc prova.c

• Eseguire con il comando ./a.out

Page 66: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Modificare l’esempio per scrivere il proprio nome e cognome

• Cosa devo cambiare per fare scrivere il mio nome e cognome?

• L’istruzione PRINTF serve per:– Interagire con l’utente– Comunicare all’utente qualcosa o il risultato

• NOTA: In questo momento noi siamo contemporaneamente programmatori e utenti!– Programmatori quando scriviamo il programma,– Utenti quando eseguiamo il programma e ne verifichiamo

gli output interagendo con esso.

Page 67: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Scrivere nome, cognome ed etàNome file: età.c

#include <stdio.h>int main(int argc, const char ** argv){

int annoNascita = 1982;int eta = 2008 – 1982;

printf(“Luca Capisani, età %i”, eta);

return 0;}

Page 68: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Salvare tutte le informazioni su un file: fprintf()!

#include <stdio.h>int main(int argc, const char ** argv){

FILE *fptr = fopen(“f.txt","w");int annoNascita = 1982;int eta = 2008 – 1982;fprintf(fptr,“Luca Capisani, età %i”, eta);fclose(fptr);return 0;

}

• Per controllare che il file è corretto: cat f.txt dopo aver eseguito il programma

Page 69: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Blocchi fondamentali 2: le strutture di controllo

• Nell’esercizio di prima, ogni istruzione viene eseguita nell’ordine indicato.• A volte è necessario eseguire istruzioni solo se si verificano certe

condizioni– Se piove

• Prendo l’ombrello– Altrimenti

• Esco in bicicletta!• A volte è necessario cambiare l’ordine delle istruzioni o ripetere

l’esecuzione di alcuni blocchi– Per fare una torta

• Aggiungere farina• Aggiungere olio• Aggiungere zucchero• Mescolare il tutto• Se non si amalgama, ricominciare dall’inizio

Page 70: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Istruzione condizionale IF THEN ELSE

• Esempio: mi dice se sono maggiorenne

#include <stdio.h>int main(int argc, const char ** argv){

int annoNascita = 1982;int eta = 2008 – 1982;printf(“Luca Capisani, età %i \n”, eta);

if (eta >= 18){printf(“Sei maggiorenne! \n”);

}

return 0;}

Page 71: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Cicli FOR• Esempio: comunicare all’utente il conteggio da 1 a 10!!!

• Procedura:– Scrivere 1;– Calcolare 1 + 1 = 2– Scrivere 2;– Calcolare 2 + 1 = 3– Scrivere 3;– Calcolare 3 + 1 = 4– …

• Le istruzioni si ripetono!

• Come possiamo scrivere la stessa cosa più rapidamente???

Page 72: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Cicli FOR• Esempio: comunicare all’utente il conteggio da 1 a 10!!!

• Non voglio ripetere le istruzioni uguali!

• Procedura:

– Imposto a = 0;– Inizio di un ciclo

• a = a + 1• Scrivo (a)

– Mi fermo solo quando ho raggiunto il limite

• Le istruzioni non si ripetono più!

• Come possiamo scrivere la stessa cosa nel linguaggio C???

Page 73: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Esempio: Uso dei cicli#include <stdio.h>int main(int argc, const char ** argv){

int i;

for (i = 0; i<10; ){ i = i+1; printf("i = %d \n" ,i);}

return 0;}

Page 74: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Uso delle librerie di rete

• Richiede di– Includere le librerie di rete

• #include <sys/socket.h>• #include <arpa/inet.h>• #include <stdlib.h>• #include <netdb.h>

– Configurare le impostazioni desiderate per la connesione

– Creare la connessione– Utilizzarla per inviare/ricevere dati– Chiudere la connessione

Page 75: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Configurare la rete…struct sockaddr_in *remote;

int tmpres;

char *ip;

char *get;

char buf[BUFSIZ+1];

char *host;

char *page;

host = "192.168.121.12";

page = PAGE;

sock = create_tcp_socket();

ip = get_ip(host);

remote = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *));

remote->sin_family = AF_INET;

tmpres = inet_pton(AF_INET, ip, (void *)(&(remote->sin_addr.s_addr)));

if( tmpres < 0) {

perror("Can't set remote->sin_addr.s_addr");

exit(8);

}else if(tmpres == 0){

fprintf(stderr, "%s is not a valid IP address\n", ip);

exit(7);

}

remote->sin_port = htons(PORT);

if(connect(sock, (struct sockaddr *)remote, sizeof(struct sockaddr)) < 0){

perror("Could not connect");

exit(4);

}

Page 76: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Un semplice programma per richiedere una immagine alla camera

#include <stdio.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <stdlib.h>

#include <netdb.h>

#include <string.h>

#include <unistd.h>

#include "netHTTP.h"

#include "mylib.h"

int PORT=80;

char* HOST = "192.168.121.12";

//char* PAGE = "/mjpg/video.mjpg";

char* PAGE = "/jpg/image.jpg";

int pktCount=0;void dataRec(void *data, unsigned long int l){

pktCount++;printf("Ricevuto pkt %d

len %d\n", pktCount, l);}int main(int argc, char **argv){ tcpConnect(); sendHTTPRequest(); memset(buf,0,sizeof(buf)); while((tmpres = recv(sock, buf, BUFSIZ, 0)) > 0){ dataRec(buf,tmpres); } closeSock(); return 0;}

Page 77: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Librerie!!– Di sistema

#include <stdio.h>#include <sys/socket.h>#include <arpa/inet.h>#include <stdlib.h>#include <netdb.h>#include <string.h>#include <unistd.h>

– Utente#include "netHTTP.h"#include "mylib.h"

Page 78: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Parametri!!

• Configurazione!

int PORT=80;char* HOST = "192.168.121.12";

Voglio ricevere il filmato?//char* PAGE = "/mjpg/video.mjpg";

Voglio vedere solo “una foto”?char* PAGE = "/jpg/image.jpg";

Page 79: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Richiesta HTTP di una immagine• Connessione TCP alla telecamera– Avviene usando – l’indirizzo IP 192.168.x.x– e la Porta 80• tcpConnect();

• Richiesta HTTP di tipo GET alla telecamera– Specifica il file che mi interessa e che cosa sono in

grado di fare (le mie caratteristiche)• sendHTTPRequest();

Page 80: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Arriva l’immagine!!!

• Preparo lo spazio di memoria memset(buf,0,sizeof(buf));• Attendo ciasun “pacchetto” dalla rete e lo

memorizzowhile((tmpres=recv(sock,buf,BUFSIZ,0))> 0){

dataRec(buf,tmpres);

}

Page 81: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Chiudo la connessione!

• Dico alla telecamera che ho finito di utilizzarla

• Non faccio più nessuna richiesta alla telecamera!

• closeSock();

Page 82: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Diagramma di flusso di connessione e richiesta

INIZIO

CONNESSIONE TCP

RICHIESTA HTTP

TRASFERIMENTO DI UN PACCHETTO

FINEDATI???

NO!

SI!CHIUSURA

CONNESSIONE

FINE

Page 83: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Dove va a finire la risposta?

• Nel nostro caso la risposta della telecamera va persa!

• Tuttavia vedremo la prossima volta come si può memorizzare su un file

• Alla fine possiamo visualizzare la foto con un comune programma da disegno!

Page 84: Acquisire ed elaborare immagini - Prima parte Luca Capisani

Esercizio

• Fate un programma che, sommando tutte le lunghezze dei pacchetti ricevuti dalla telecamera, vi dica quanto era lunga l’immagine.