Pre par dana sam rešio da iskoristim IP kameru kako bih automatizovao neke procese. To je trebalo da podrazumeva da dobijam obaveštenja kada neko uđe u određeno polje na kameri. Kako je to moj lični projekat, nije mi bilo bitno da performanse budu na nivou neke komercijalne aplikacije, te sam odabrao Python kao jezik u kome ću raditi. Srećom, OpenCV je dostupan za python te mi je to olakšalo neke stvari. Nakon istraživanja, i nakon nemogućnosti da pronađem bar nešto što će me uputiti na tok procesa, odlučio sam da sam odradim prljavi posao.

Najbolja solucija za ovaj moj mali projekat je bila da pretvorim svaku sliku u histogram, te očitam podatke i u slučaju zadovoljavajućih vrednosti, izdam upozoenje. Kako nisam našao neki primer/turorijal o očitavanju vrednosti histograma, morao sam da improvizujem. Sledi kod u celosti, a nakon toga objašnjenje.

Krenimo ovako. Većina kamera šalje sliku u više formata, a kako mi se sama slika ne bi prikazivala, najbezbolnije je bilo očitavanje mjpg formata. To su u principu obične jpeg slike koje se šalju u kontinuitetu sa još par dodatnih informacija. Svaka jpeg slika počinje kodom 0xff 0xd8 a završava se sa 0xff 0xd9 te je potrebno izvući samu sliku iz strima. Nakon toga dekodiramo sliku. Kako je meni bitno samo određeno polje na toj slici, unosim vrednosti koje meni trebacu i „kropujem“ je. Pre svega to znači da se samo manji deo slike obrađuje, te je sam proces brži. OpenCV već ima par ugrađenih funkcija za izolovanje pozadine, što mi olakšava proces, a to je createBackgroundSubtractorMOG2() koji funkcioniše tako što upoređuje par frejmova i sve što je nepromenjeno na njima je pozadina a svaka promena se detektuje.

Ako bismo prikazali tu sliku, izgledala bi kao crna pozadina, dok sve što ulazi u polje biva označeno belim poljima. Nakon toga dolazimo do sledećeg zaključka: ako imamo crno belu sliku onda pomoću histograma možemo videti odnos crne i bele pozadine te na taj način odrediti da li je neko ušao u polje ili ne. Testiranjem sam uočio da su vrednosti koje dobijam kada nema nikoga u tom polju od 4.0 do 9.0 a kada neko uđe u polje, vrednosti su od 2.0 do 0.5. Zbog toga, ukoliko vrednost bude ispod 1.0 obaveštavamo da je neko ušao u polje. Što se obaveštenja tiče, time.sleep(1.5) služi kako se obaveštenja ne bi gomilala jer kada na čekanju ima više od 50 obaveštenja, dolazi do greške koja izbacuje program. Na ovaj način smanjujemo broj obaveštenja kako bi program funkcionisao.

Sve u svemu, to je to, radi već par dana. Ukoliko neko ima bolju ideju, rado ću je prihvatiti, a takođe ukoliko ima nejasnoća, komentari su ispod, tu sam da odgovorim.

Zanimljivo, hmm? Pokaži svima!