10.1. Scopul aplicatiei Ghost Surveillance System
Ghost Surveillance System este o aplicatie software bazata pe platforma JAVA care realizeaza implementarea unui sistem de securitate. Datele video sunt obtinute de la un dispozitiv de captura, cum ar fi un o camera video conectata la un TV Tuner. Software-ul dispune de un subsistem de captura automata care (daca este activat) salveaza cadrele dupa detectia miscarii.
O alta parte a aplicatiei permite accesul la cadrele salvate anterior. Interfata utilizator a acestui subsistem permite accesul usor si intuitiv la arhiva de imagini, marirea si listarea la imprimanta a imaginii selectate.
Aplicatia dispune de un submeniu cu istoricul supravegherii care furnizeaza informatii vizuale despre subsistemul de captura automata.
Mediul de programare folosit este Java, mai exact JSDK 1.3. Pentru partea de 757h79h captura am folosit tehnologiile din Java Media Framework 2.1.1. (vezi Capitolul 8). Functionarea corecta a aplicatiei este conditionata de instalarea corecta a acestor pachete.
10.2. Prezentarea aplicatiei
Pentru a evita accesul persoanelor neautorizate, la intrarea în aplicatie, utilizatorul este solicitat sa introduca o parola. Parola implicita este "UTCN". Dupa introducerea corecta a parolei, apare ecranul de intrare în program, care cuprinde sigla aplicatiei si informatii legate de Copyright (Figura 10.1).
Figura 10.1.. Ecranul de intrare în aplicatie
Dupa initializarea camerei video, apare ecranul principal (vezi Figura 10.2 si Figura 10.3). Acesta este format din:
Fereastra Live video - afiseaza continuu imaginile primite de la camera video. Rezolutia la care se realizeaza afisarea este 320x240 pixeli. Vizualizarea poate fi întrerupta prin apasarea butonului Pause.
Fereastra informatii utile - afiseaza informatii despre data si ora curenta, cât timp a rulat aplicatia, numarul de cadre salvate. Reîmprospatarea informatiilor se face automat.
Sigla aplicatiei - este afisata în coltul dreapta sus.
Reglaj senzitivitate - permite reglarea senzitivitatii supravegherii. Valorile posibile sunt între 0 si 100. O valoare de 0 înseamna ca diferenta dintre doua cadre trebuie sa fie de 100% pentru ca aplicatia sa salveze un cadru. O valoare de 100 înseamna ca diferenta între cadre trebuie sa fie 0 pentru ca aplicatia sa salveze un cadru. În urma testelor a rezultat ca valoarea optima pentru senzitivitate este aproximativ 65.
Reglaj rata verificare - permite reglarea perioadei la care sa se faca compararea de cadre. Valorile posibile sunt între 1 si 10. Valoarea 1 înseamna ca verificarea se face la fiecare 2 secunde, valoarea 10 înseamna ca verificarea se face la fiecare 0.2 secunde.
Istoric supraveghere (History) - furnizeaza informatii utile despre diferentele între cadre. Este activat doar când supravegherea este pornita. Cu o linie de culoare rosie este afisat pragul de senzitivitate stabilit. Sub forma de dreptunghiuri galbene sunt reprezentate diferentele între doua cadre analizate succesiv. Daca o diferenta trece peste pragul de senzitivitate, se salveaza automat ultimul cadru analizat. Este foarte util pentru calibrarea sistemului de supraveghere având în vedere faptul ca pot exista variatii ale calitatii semnalului.
Intrare în submeniul Image - este un submeniu care permite vizualizarea, marirea si listarea la imprimanta a imaginilor capturate manual sau automat
Captura manuala de cadru - la apasare se realizeaza captura unui cadru, cadru care este salvat într-un fisier ce include în numele lui ora exacta (la precizie de milisecunda) la care s-a realizat captura, fisier aflat într-un director cu numele data curenta
Buton pornire/oprire supraveghere - permite oprirea/pornirea operatiei de supraveghere. Implicit este Off.Salvarea imaginilor se face în format .JPG.
Informatii utile
Fereastra Live video Sigla aplicatie
Reglaj
senzitivitate Reglaj rata
de verificare Istoric
supraveghere Buton
pornire/oprire supraveghere Captura
manuala de cadru Intrare în
submeniul Image
Figura 10.2. Meniul principal cu supravegherea dezactivata
History furnizeaza informatii Supravegherea este activata
Figura 10.3. Meniul principal cu supravegherea activata
Prin apasarea butonului Image din meniul principal se ajunge în submeniul Image, unde se pot efectua unele operatii asupra imaginilor, indiferent daca acestea au fost salvate manual sau automat. Fereastra este compusa din:
În partea din stânga sunt afisate imagini scalate (thumbnails) ale imaginilor salvate. Prin selectarea uneia dintre aceste imagini, în partea din dreapta a ecranului apare imaginea la marimea ei originala (vezi Figura 10.4).
Sub imagine se dau informatii despre data si ora exacta la care a fost capturata imaginea.
Data si ora capturarii Buton Back Buton Revert Buton Zoom Preview imagini si selectare Buton Print Imaginea
afisata
Figura 10.4. Meniul vizualizare imagini
Butonul de Zoom permite marirea unei anumite zone a imaginii. Marirea zonei de interes implica selectarea cu mouse-ul si apasarea butonului Zoom (vezi Figura 10.5)
Imaginea
marita
Figura 10.5. Meniul vizualizare imagini - imaginea marita
Prin apasarea butonului Print aparea fereastra standard de printare din Windows. Imprimarea se realizeaza pentru imaginea originala sau imaginea marita, în functie de operatiile efectuate asupra imaginii (vezi Figura 10.6).
Figura 10.6. Meniul vizualizare imagini - imprimare imagine
Prin apasarea butonului Back (vezi Figura 10.4) se revine la meniul principal
Din meniul principal se pot accesa informatii despre autorul aplicatiei si despre motivele realizarii ei. Pentru aceasta trebuie activata din meniu fereastra HELP/ABOUT. Aici mai gasiti o scurta descriere a aplicatiei, în limba engleza.
Ceea ce ne intereseaza pe noi din aceasta aplicatie este modul cum se realizeaza captura. În primul rând, camera trebuie sa fie detectata cu JMF Registry, care poate fi adus de la www.java.sun.com. Nu toate camerele sunt detectate, dar în general probleme au aparut doar la camerele Logitech.
10.3. Interfata aplicatiei cu camera video
Codul pentru detectia si initializarea camerei video este dat în Exemplul 10.1. Pentru o buna întelegere a tehnologiilor folosite, consultati Capitolul 8.
Exemplul 10.1. Interfata aplicatiei GSS cu camera video |
Aceasta clasa creaza un processor pentru dispozitivul de capura care a fost inregistrat in prealabil cu JMF Registry si salveaza cadrele capturate intr-un buffer. import javax.media.*; import javax.media.format.YUVFormat; import javax.media.format.JPEGFormat; import java.util.*; import javax.media.protocol.*; import javax.media.datasink.*; import java.io.IOException; import java.awt.image.BufferedImage; import java.awt.Component; import javax.media.util.BufferToImage; import javax.media.format.VideoFormat; import java.awt.Image; public class CameraInterface extends Thread implements ControllerListener, DataSinkListener catch (IncompatibleSourceException e) handler.addDataSinkListener(this); // Trece procesorul in starea Prefetch //processor.prefetch(); //waitForState(processor.Prefetched); System.out.println("Starts the processor"); handler.start(); //porneste procesorul //processor.start(); player.start(); state=OK; } private DataSource ProcessorSetUp()else MediaLocator _mlocator=_cap_info.getLocator(); _cap_info=null; if (_mlocator == null) // Creaza o DataSource pentru media locatorul dat try catch (Exception e) _mlocator=null; System.out.println("create processor for: " + InitDataSource.getContentType()); //creaza un processor pentru DataSource-ul obtinut de //la Camera try catch (Exception e) // processor.addControllerListener(this); player.addControllerListener(this); // Trece processorul in starea configured // processor.configure(); // waitForState(processor.Configured); // primeste iesirea de la processor // processor.setContentDescriptor(new ContentDescriptor(ContentDescriptor.RAW)); // pune processorul in starea realize // processor.realize(); // waitForState(processor.Realized); return (cloneableDataSource); } /** Aceasta metoda returneaza starea curenta a CameraInterface */ public int getStatus() public void run() public synchronized Component getPlayerVisual () public synchronized Component getPlayerControl() public synchronized BufferedImage getBufferedImage(); } clip_img=bim; return bim; } /** Urmatoarea metoda returneaza imaginea creata din bufferul de intrare */ public BufferedImage getImage() /** Aceasta metoda termina Camera Interface */ public void Delete() public boolean canDelete() /** Aceasta metoda opreste procesarea din buffer */ public void Stop() public void controllerUpdate(ControllerEvent evt) }else if (evt instanceof ResourceUnavailableEvent) }else if (evt instanceof EndOfMediaEvent) else if (evt instanceof SizeChangeEvent) } public void dataSinkUpdate(DataSinkEvent evt) } /** Aceasta clasa citeste din DataSource si imparte streamul in buffere */ private class DataSourceHandler extends Thread implements DataSink,BufferTransferHandler }else throw new IncompatibleSourceException(); this.source = source; } public void setOutputLocator(MediaLocator ml) public MediaLocator getOutputLocator() public String getContentType() public void open() public void run() catch (IOException e) } public void Stop()catch(IOException e) } /** Termina metoda DataSourceHandler */ public void close() catch (IOException e) } public void addDataSinkListener(DataSinkListener dsl) public void removeDataSinkListener(DataSinkListener dsl) protected void sendEvent(DataSinkEvent event) } } } /** Aceasta metoda este apelata cand vin date de la DataSource */ public void transferData(PushBufferStream stream) catch (IOException e) // Verificam sa vedem daca toate streamurile sunt gata if (readBuffer.isEOM() && checkDone(stream)) } } /* Verificam daca toate streamurile sunt procesate */ public boolean checkDone(SourceStream strm) } return done; } public Object [] getControls() public Object getControl(String name) } |
10.4. Detectia miscarii
O alta problema aparuta la dezvoltarea acestei aplicatii a fost modul de detectie a miscarii. Organigrama dupa care functioneaza sistemul de supraveghere este prezentata în Figura 10.7.
Figura 10.7. Organigrama algoritmului de detectie a miscarii
În Exemplul 10.2 este prezentat codul care calculeaza diferenta între mediile de culoare ale celor doua imagini.
Exemplul 10.2. Codul care calculeaza diferenta între imagini |
//calculeaza pentru doua imagini diferenta dintre ele ca //diferenta intre mediile de culoare ale celor doua imagini. private int computeDifference (BufferedImage oldImage,BufferedImage newImage) } //se face xor cu rgb pentru imaginea analizata(diferenta intre componentele de culoare) temp=newImage.getRGB(0,0,width,height,temp,0,width); index=0; for (int i=0;i<height;i++) } //se calculeaza diferenta intre medii int maxDifference=0; float medie=0; int masc=(255<<16) | (255<<8) | (255); for (int i=0;i<height;i++) for (int j=0;j<width;j++) medie+=RGB[i][j]; medie=medie/(width*height); maxDifference=(int)medie; float f=((float)maxDifference)/((float)masc); return (int)(f*255); } |
10.5. Avantajele si dezavantajele aplicatiei GSS
Avantajele aplicatiei GSS sunt urmatoarele:
Aplicatia poate fi rulata pe orice sistem care are instalate JSDK 1.3 si JMF 2.1.1. Avantajul este ca aceste pachete sunt gratuite, putând fi aduse prin download de la www.java.sun.com.
Salvarea imaginilor se face în format JPEG, care ocupa putin spatiu pe disc (o imagine la rezolutia de 320x240 are aproximativ 20 kb). Avantajul este evident, si anume necesar minim de spatiu pe disc. Pe un CD standard de 650 MB încap aproximativ 32.000 de astfel de imagini.
Salvarea imaginilor se face structurat. Numele directorului în care se afla imaginea contine data la care s-a facut captura, iar numele fisierului contine ora la care s-a facut captura. Din aceste motive cautarea unei imagini în baza de date este foarte usor de realizat.
Sistemul pe care ruleaza aplicatia poate fi folosit si în alte scopuri.
Datorita mecanismului de functionare bine pus la punct un intrus este detectat în mai putin de 1 secunda, dupa care analiza imaginii si tiparirea la imprimanta dureaza mai putin de 1 minut.
Dimensiunea aplicatiei este foarte redusa (mai putin de 100 kb).
Dezavantajele aplicatiei GSS sunt urmatoarele:
Cerinte hardware ridicate. Datorita faptului ca sunt necesare multe comparatii de coduri RGB, procesorul este destul de solicitat.
Aplicatia a fost conceputa sa ruleze corect doar la rezolutia de 1024x768, independent de numarul de culori. Folosirea aplicatiei la alte rezolutii poate duce la erori de afisare sau chiar la blocarea sistemului.
API-ul Java Media Framework nu este suficient de bine pus la punct. Din acest motiv aplicatia se poate bloca dupa un anumit timp de functionare.
|