Browse Month: August 2012

Od starog Symbian telefona do sigurnosne kamere uz pomoć Python-a

Kako ponuda Android telefona raste, a zajedno sa ponudom i broj aplikacija na Gugl Pleju, tako je sve više onih koji će se ponoviti novim i pametnijim telefonima, dok će njihovi stari telefoni otići za tridesetak evra na kutiji pored Futoške ili biti bačeni u fioku i biti zaboravljeni. Ukoliko je Vaš prethodni telefon neka Nokia sa Symbian OS-om, možda ipak, još uvek nije vreme da se rastanete sa njim.

Ukratko o Python-u

Python je veoma moćan programski jezik visokog nivoa. Kod pisan u Python-u se obično interpretira, ali postoje i prevodioci koji Python kod prevode u mašinski jezik. Veoma je jasan, sintaksa je čitljiva, a možda i najvažnije, jako je intuitivan. Objektno je orijentisan.  Podržan je na mnogim platformama, a samo neke od njih su nabrojane: Linux, Windows, BSD, Symbian OS, Xbox… Uz Python dolazi biblioteka standardnih modula, ali je po potrebi moguće pisanje novih modula u Pythonu, pa čak i u C-u ukoliko su potrebne veće brzine izvršavanja. Vidi još… [en]

Python Guardian

Python Guardian
Python Guardian

Ovu skriptu sam napisao kada sam počeo da učim Python. Bilo mi je zanimljivo da od starog telefona napravim nešto korisno, što usput mogu da kontrolišem na daljinu, putem SMS poruka. I tako je nastao Python Guardian. Skripta verovatno nije savršena niti sam je ikada preterano testirao, ali je meni zato radila posao za koji sam je napisao. Elem…

Python-Guardian.py je skripta koja telefon pretvara u sistem za nadzor koji reaguje ukoliko dođe do promene u nadgledanom prostoru. U promene spada sve ono što kamera telefona može da zabeleži (npr. pomeranje objekata ili nagla promena intenziteta/boje svetla). Nivo detekcije promene se može podešavati sa više parametara, kao što su broj osetljivih tačaka, nivo tolerancije promene boje pixela, minimalni broj detektovanih izmenjenih pixela itd. Kada je promena detektovana, Python Guardian može da pošalje obaveštenje putem SMS-a, da postavi fotografiju nadgledanog prostora na internet i/ili da aktivira alarm. Nakon pokretanja skripte, nadgledanje prostora može biti pokrenuto automatski, nakon isteka definisanog vremenskog intervala ili ručno, slanjem SMS poruke na broj telefona na kojem je pokrenuta skripta. Slanjem SMS poruke je takođe moguće deaktiviranje nadgledanja prostora.

[CODE]

Ovaj deo je odvojen za one koji žele malo više da se upoznaju sa načinom funkcionisanja python-guardian skripte. Objasniću kako skripta zapravo detektuje promenu, dok popratne delove koda kao npr. kod za slanje SMS poruka ili upload fotografije, koje sam preuzeo (i prilagodio) sa interneta, neću objašnjavati. Nihov opis možete naći na sledećem sajtu: www.mobilenin.com.

Nadgledanje prostora se može vršiti na dva načina. Prvi način je kada se upoređuju frejmovi video kamere; frejmovi sa kamere pristužu više puta u sekundi, što znači da se poređenje može češće obavljati, te se na taj način može i brže odreagovati na eventualne promene. Sa druge strane ovaj način nadgledanja znatno troši bateriju. Drugi način je da se u određenim vremenskim intervalima prave fotografije koje se kasnije porede na isti način kao i frejmovi. Ovaj način, zbog postojanja intervala između dva poređenja, neće odreagovati na brze promene, ali baterija telefona traje duže.

Naččin nadgledanja se podešava menjanjem vrednosti parametra monitoringType, a vrednosti mogu da budu ‘video’ ili ‘photo’

‘video’

Kada se koristi ovaj način nadgledanja, poziva se sledeća linija koda, kojom se uključuje kamera, odnosno podaci sa kamere se prosleđuje frejm po frejm monitoringCallback funkciji.

camera.start_finder(monitoringCallback, size=monitoringResolution)

Ovo parče koda se obično koristi da bi se korisniku na displeju prikazalo šta kamera u datom trenutku posmatra, te da korisnik tako može ispravno da kadrira svoju fotografiju pre nego što je napravi. U ovom slučaju monitoringCallback funkcija nema tu namenu, već služi da bi upoređivala trenutni sa prethodnim frejmom i ukoliko postoji bitna razlika među njima, objavi alarm.

Da bi monitoringCallback funkcija uporedila trenutni i prethodni frejm, prethodni frejm mora biti negde sačuvan. U prvom prolazu kroz funkciju ne postoje podaci o prethodnom frejmu, tako da prvi prolaz, koji je obeležen firstFrame promenljivom, služi samo da bi trenutni frejm sačuvao u memoriji telefona. U svakom sledećem n-tom (gde je n=frameAnalysisFreq) prolazu kroz funkciju upoređuje se trenutni sa prethodnim frejmom i trenutni se postavlja kao prethodni za sledeći prolaz. Parametar frameAnalysisFreq se uvodi jer nije potrebno proveravati svaki frejm da bi se uočila promena. Recimo da sa kamere bude prosleđeno 20 frejmova u sekundi, za detektovanje promene, nije potrebno praviti proveru za svaki frejm. Za upoređivanje dva frejma koristi se funkcija compareFrames kojoj se prosleđuju trenutni i prethodni frejm.

‘photo’

Funkcija photoMonitoringLoop se poziva kada se koristi nadgledanje pomoću fotografija. Kao i monitoringCallback funkcija, funkcija photoMonitoringLoop koristi promenljivu firstFrame, da bi u provm prolazu napravila fotografiju koja će se u narednom prolazu koristiti kao prethodna prilikom pozivanja funkcije compareFrames. U ovoj funkciji, frameAnalysisFreq parametar predstavlja vremenski interval između dva poređenja. Funkciju photoMonitoringLoop se poziva sledećim kodom:

gTimer.cancel()
gTimer.after(1, photoMonitoringLoop)

Takvo pozvanje funkcije, će dozvoliti da trenutna funkcija u kojoj se nalazi kod iznad, nastavi sa izvršavanjem – photoMonitoringLoop  funkcija će se izvršavati nezavisno. gTimer je objekat klase e32.Ao_timer() koja dozvoljava ovakav način pozivanja funkcija, gde prvi parametar (u ovom slučaju jedinica) označava vremenski interval koji će proći pre nego što funkcija (drugi parametar) bude pozvana.

compareFrames()

res = compareFrames(currentFrame, previousFrame)

Funkcija compareFrames za argumente prima dva frejma (fotografije), koja predstavljaju trenutni i prethodni frejm (fotografiju). Ona ne upoređuje frejmove (fotografije) u potpunosti, već samo u određenim tačkama, tzv. osetljivim tačkama. Broj tačaka po vertikalnoj i horizontalnoj osi se može podešavati parametrima verticalCheckDotsNumberhorizontalCheckDotsNumber. Ako uzmemo vrednosti 3 i 4 za pomenute parametre respektivno, tačke koje se proveravaju na frejmu (fotografiji) su raspoređene na sledeći način:

Raspored osetljivih tačaka
Raspored osetljivih tačaka

Svaka osetljiva tačka na trenutnom frejmu (fotografiji) se poredi sa istom tom osetljivom tačkom na prethodnom frejmu (fotografiji). To radi funkcija compareArea kojoj se prosleđuju oba frejma (fotografije) i x i y koordinate osetljive tačke. Jedna osetljiva tačka sadrži jedan piksel u sredini i još osam piksela raspoređenih oko njega na razdaljini koja je definisana parametrom diameter. Poređenje tih piksela se radi prema boji, odnosno prema RGB vrednostima datih piksela, pozivanjem funkcije comparePix. U zavisnosti od rezultata compareArea  funkcije, funkcija compareFrames kao rezultat vraća celobrojne vrednosti od 0 do 4, gde svaka vrednost označava jedno od sledećih stanja:

0 – prethodno stanje 0, 3 ili 4: broj osetljivih tačaka, koje se na oba frejma razlikuju više od granice podešene parametrima, je manji od vrednosti parametra maxNumberOfChangedDots. Parametri koji određuju granicu prema kojoj se porede osetljive tačke, su maxPixelDifference i maxNumberOfChangedPixels,
1 – prethodno stanje 0: broj osetljivih tačaka, koje se u trenutnom poređenju na oba frejma razlikuju više od granice podešene parametrima, je veći od vrednosti parametra maxNumberOfChangedDots,
2 – prethodno stanje 1 ili 2: u nekom od prethodnih n poređenja (n=maxDelayedFrames), razlika među frejmovima je bila veća nego što je dozvoljeno,
3 – prethodno stanje 2: u toku poređenja n (n=maxDelayedFrames) frejmova, nije detektovano m (m=maxDisturbedFrames) frejmova čija je različitost veća od dozvoljenog,
4 – prethodno stanje 2: u toku poređenja manje od n (n=maxDelayedFrames) frejmova, detektovano je m (m=maxDisturbedFrames) frejmova čija je različitost veća od dozvoljenog (vreme je da se oglasi alarm, poziva se funkcija startAlert()).

Kada se sistem nalazi u stanju 2, parametar maxDelayedFrames određuje broj frejmova koji će biti provereni (i čija će različitost biti manja od dozvoljene) pre nego što sistem pređe u stanje 3. Parametar maxDisturbedFrames određuje koliko frejmova čija je različitost veća od dozvoljene, treba da bude detektovano kada se sistem nalazi u stnaju 2, da bi sistem prešao u stanje 4.

Algoritam
Algoritam stanja

Ovakav algoritam omogućava da kamere budu nesavršene kao što je to recimo kamera na telefonu na kojem je ova skripta testirana (Nokia 6120 Classic). U uslovima kada ima malo svetlosti, dešavalo se da pojedini frejmovi “zakucaju” i podaci sa kamere ne budu istiniti, pa je zbog toga uvedena zadrška prelazka u stanje 4, da bi se sprečilo oglašavanje lažnog alarma.

Ovakav algoritam omogućava i režim povećane sigurnosti tj. kada “skripta posumnja” u neku promenu na frejmovima i pređe u stanje 1 ili 2, zaobilazi se parametar frameAnalysisFreq  i tada se, u ‘video’ načinu nadgledanja proverava svaki frejm koji skripta dobije od kamere, onosno u ‘photo’ načinu nadgledanja ne postoji vremenski interval među dva poređenja, već se fotografije sa kamere i porede najvećom mogućom brzinom. Da bi aktivirali ovakav način provere, potrebno je  parametar useIncreasedSafetyRegime postaviti na 1. Kada se uključuje ili isključuje režim povećane sigurnosti, parametre maxDelayedFramesmaxDisturbedFrames treba rekonfigurisati.

Evo i opisa čemu služe ostali parametri:

startupInterval – ceo broj, koji predstavlja broj sekundi koji će proći pre nego što se aktivira nadgledanje, ukoliko je opcija Startup immediately odabrana prilikom pokretanja skripte,
soundsEnabled – ako je vrednost 0 zvukovi obaveštenja o početku i kraju nadgledanja se neće emitovati; za vrednost 1 zvukovi će biti emitovani,
adminNumbers i notifyNumbers – liste brojeva administratora i brojeva koji će biti obavešteni kada je detektovana promena (ukoliko je prilikom pokretanja skripte odabrana opcija SMS Notify),
startSMSPhrase i stopSMSPhrase – fraze (stringovi) kojima administrator, putem SMS poruke, može da uključuje/isključuje nadgledanje,
webServerAddress i webServerLink – kada se koristi Photo upload alarm, ova dva parametra određuju internet lokaciju skripte koja preuzima i postavlja fotografiju na server,
uploadPhotoFilename, sndDir, sndAlarm, sndMonitoringStarted, sndMonitoringStopped – putanje na telefonu do fotografije za upload, direktorijuma sa zvukovima, ime zvuka alarma, početka i završetka nadgledanja,
monitoringResolution – rezolucija frejmova/fotografija koji se dobijaju od kamere i koji se dalje analiziraju,
apidFilename – fajl u kome se čuva id podrazumevane pristupne tačke (default access point).

.

Šta mi je potrebno za pokretanje skripte?

Osim telefona na kojem Vam trči Symbian OS, potrebno je još da na isti instalirate Python za S60 telefone. Poslednju verziju PyS60 možete preuzeti odavde.

Kako da pokrenem skriptu?

Arhivu python-guardian.zip raspakujte na memorisku karticu telefona. Zatim iz foldera python-guardian, kopirajte fajl python-guardian.py u direktorijum Python koji se nalazi na memoriskoj kartici. Nakon toga pokrenite Python aplikaciju koju ste instalirali u prethodnom koraku. Kliknite na Options, odaberite Run script, a zatim pronađite skriptu python-guardian.py i pritisnite OK.

U arhivi se takođe nalazi i upload_image_to_url.php preuzet sa ovog sajta: www.mobilenin.com, koji vam je potreban ako želite fotografiju da uploadujete na svoj server.

Šta ako skripta ne radi kako treba ili pronađem neki bug?

Javite, probaćemo da popravimo 😉

Šta dalje?

Pokušajte sami da napišete neke zanimljive skripte za Vaš telefon. Jednostavno možete napisati skriptu koja će proveravati da li su izašli rezultati ispita na sajtu fakulteta, skriptu koja će da spamuje telefon Vašeg kolege SMS porukama ili skriptu Naravno, Python možete da instalirate i na Vaš računar, a pogodnu verziju potražite ovde. Nakon instaliranja, na ovom linku, možete potražiti neki zanimljiv softver koji je pisan u Python-u.