Budjettivalvontakamera liikkeentunnistuksella

Muu­ta­man kym­pin in­ves­toin­nil­la voi ra­ken­taa tal­len­ta­van ja liik­keen tun­nis­ta­van vi­deo­val­von­nan. Mi­nä to­teu­tin it­se­äni Rasp­berry Pil­la ja kym­pin web-ka­me­ral­la, se­kä Motion-oh­jel­mal­la.
Kuva: Mike_fleming: CCTV Camera. CC BY-SA 2.0

Raspberry Pista on moneksi, kuten tiedämme. Päätin toteuttaa erään vähemmän mielikuvituksellisen käyttöidean, ja valjastin yhden Raspberry Pin kyttäämään puolestani. Pienellä investoinnilla käytössäni oli todellinen tee-se-itse-mallinen tallentava videovalvonta.

Web-kameran kuvan tallennus voidaan toteuttaa monella tapaa, mutta päädyin lopulta varsin monipuoliseen Motion-ohjelmaan sen liikkeentunnistusominaisuuksien vuoksi.

Laitteistoltaan viritykseni on varsin vaatimaton: päätön1 Raspberry Pi kahden gigan muistikortilla, 700 mAh:n virtalähteellä ja verkkokaapelilla varustettuna. Kameraksi valitsin Gigantin halvimman Trustin Cuby -webkameran (9,90 €).

Valitsin käyttöjärjestelmäksi Debianin sen tuttuuden vuoksi, vaikkakin tämä tarkoitti sitä, että aluksi jouduin poistelemaan rankalla kädellä oletusasennuksesta mm. X-palvelimen graafisine apuohjelmineen vapauttaakseni muistikortille tarpeeksi tilaa Motionille työkaluineen (mm. FFmpeg).

Kamera toimii UVC:na teoriassa plug-and-play -tekniikalla, käytännössä ei. Tämä johtuu siitä, ettei kameran lukuun tarkoitettua Video4Linux2– (V4L2-)tukea ole Debianin kernelissä. Uudessa firmwaressa tuki sen sijaan on, ja päivittäminen siihen on helppoa Hexxehin rpi-update -työkalun avulla. Seuraavat ohjeet perustuvat Pixelamin blogipostauksen ohjeisiin:

Komennetaan Raspberryn terminaalissa:

sudo apt-get install ca-certificates
sudo apt-get install git-core
sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update
sudo chmod +x /usr/bin/rpi-update
sudo rpi-update

Viimeisen komennon tulisi ulostaa virhe:

/opt/vc/sbin/vcfiled: error while loading shared libraries: libvchiq_arm.so: cannot open shared object file: No such file or directory

Tämän jälkeen komennetaan:

sudo ldconfig
sudo rpi-update
sudo reboot

Uudelleenkäynnistyksen jälkeen webkameran pitäisi tunnistua, ja /dev/ -kansioon ilmestyä tiedoston ”video0”. Jos näin ei käy, kannattaa ensin alkuun kokeilla irrottaa kamera ja kytkeä se uudelleen – omalla kameralla noin joka neljäs kytkentä johtaa virheeseen, mutta uudelleenkytkentä auttaa.

Web-kamera tuottaa reippaasti dataa, joten ulkoinen tallennusväline on käytännössä pakollinen. Itse päädyin käyttämään NFS-tiedostopalvelintani videokuvan tallentamiseen, mutta iso muistitikku tai ulkoinen kiintolevy toimii toki myös.

Itse Motion-ohjelma löytyy pakettivarastosta. Suosittelen asentamaan sen apt-getin vivulla –no-install-recommends, jotta asennettavien riippuvuuksien määrä pysyy kohtuullisena. En esimerkiksi tarvitse ohjelman MySQL- tai Postgresql-tukea.

Paketin asentamisen jälkeen ohjelmisto on periaatteessa käyttövalmis. On kuitenkin järkevää tehdä ohjelmalle asetustiedosto. Kannattaa huomata, että paketista tupsahtanut /etc/motion/motion.conf ei oletuksena ole käyttäjän luettavissa, joten Motion ei lue sitä vaan toimii oletusasetuksillaan.

Oman asetustiedoston voi tehdä joko /etc/motion/motion.conf -tiedoston, tai seuraavan, omaa asetustiedostoani lähellä olevan, tulosteen pohjalta:

# Ei daemonia, tulosta ulostulo päätteeseen
daemon off
# PID-tiedoston sijainti:
process_id_file /var/run/motion/motion.pid
# Tallenna 1. videolaitteesta
videodevice /dev/video0
# Käytetään YUYV-palettia (jos kamera ei tue tätä,
#käytetään ensimmäistä sopivaa palettia
v4l2_palette 6
# Kaapattavan kuvan leveys ja korkeus. Oma kamerani tukee
# periaatteessa 640×480:een asti, mutta jostain syystä
# näitä suuremmat arvot jumittavat ohjelman. Saattaa
# johtua alitehoisesta virtalähteestä.
width 320
height 240
# Suurin sallittu framerate, itse valitsin 8:
framerate 8
# Ohjelmallinen kirkkauden säätö päälle:
auto_brightness on
# Kuinka monta pikseliä pitää vaihtua, jotta muutosta
# pidetään ”liikkeenä”. Oletus on 1500, mutta kuhunkin
# tilanteeseen sopiva arvo vaihtelee.
threshold 1000
# Ohjelma yrittää säätää liikkeentunnistuksen tarkkuutta
# itse
threshold_tune on
# Tallennetaan hetken aikaa liikkeen päättymisen jälkeen:
post_capture 10
# Kuinka paljon eri liikkeillä voi olla väliä, ennen kuin
# niitä pidetään eri tapahtumina? Oletus 60 sekuntia, mutta
# tämäkin vaihtelee käyttötilanteen mukaan.
gap 30
# Tallenna kustakin tapahtumasta eniten liikettä sisältävän
# kehyksen JPG-kuva:
output_normal best
# Tallennetaan myös videokuvaa
ffmpeg_cap_new on
# Tallennetaan video mpeg4-muotoisena
ffmpeg_video_codec mpeg4
# Tallennetaan lisäksi kerran minuutissa JPG-kuva, oli
# liikettä tai ei
snapshot_interval 60
# Piirretään tunnistetun liikkeen ympärille neliö sekä
# videossa että kuvassa:
locate on
# Tulostetaan kuvan ja videon oikeaan alalaitaan
# tallennusaika
text_right %d.%m.%Yn%T-%q
# Tulostetaan kuvan ja videon vasempaan alalaitaan
# liikkeen ja kohinan määrä, ja tapahtuman juokseva numero
text_left Liike %D | Kohina %NnTapahtuma %v
# Tallenna sisältö tähän kansioon (ja alikansioihin):
target_dir /home/pi/output/
# Minuutin välein otettavien kuvien tallennuskansio ja
# nimimalli (snapshots/pp-kk-vvvv_hhmmss)
snapshot_filename snapshots/%d-%m-%Y_%H%M%S
# Tapahtumien kuvien ja videoiden tallennuskansio ja
# nimimalli (events/tapno-pp-kk-vvvv_hhmmss-kehysno)
jpeg_filename events/%v-%d-%m-%Y_%H%M%S-%q
movie_filename events/%v-%d-%m-%Y_%H%M%S-%q
# Tarjoa livekuvaa (MJPEG) portissa 8081
webcam_port 8081
# Näytä oletuksena 1 fps, ja liikkeessä 4 fps:
webcam_motion on
webcam_maxrate 4
# Salli kaikkien koneiden päästä käsiksi kuvaan
webcam_localhost off

Asetusten teon jälkeen Motionin voi käynnistää päätteessä (screenissä):

motion -c /polku/asetustiedostoon.conf

Jos kaikki meni hyvin, pitäisi Motionin nyt alkaa tallentaa videokuvaa aina liikettä havaitessaan, ja tilannekuvan kerran minuutissa. Lisäksi livekuvaa voi ihmetellä osoitteessa http://raspin.osoite:8081/. Ainakin Firefox tukee käytettyä MJPEG-muotoa suoraan.

Ylläolevilla asetuksilla oma kamerani tuottaa materiaalia noin 15 megatavua tunnissa, eli 360 megatavua vuorokaudessa – suhteellisen maltillisesti siis. Kuvan laatukin on 320×240 -resoluutiolla vielä ihan hyväksyttävä. En kuitenkaan viitsi julkaista kameran kuvia tässä, jotten paljastaisi liikaa sen sijainnista ja kuvauskohteesta.

1) Eli headless, ts. ilman näyttöä

PC-speaker musiikintoistossa

Musiikkia voi kuunnella myös
PC-speakerista, jos kestää kaiuttimen
mitättömän äänenlaadun.
Kuva: Openclipart

PC-tietokoneisiin on kautta aikain kuulunut äänimerkkejä jakeleva kaiutin, niin kutsuttu PC-speaker, joka on yleensä toteutettu pietsoelektronisella kaiuttimella. Kaiutin sopii hyvin käyttötarkoitukseensa: antamaan yksiäänisiä piippauksia esimerkiksi käynnistyksen yhteydessä.

Nykyään näitä piippereitä tulee harvemmin koteloissa vastaan, mutta hankkimassani uudessa tiedostopalvelimessa tällainen kuitenkin mukana on. Ajattelin huvikseni kokeilla, miten saada moniäänistä musiikkia ulos tuosta laitteesta.

Käytössäni oli Ubuntu Server 11.04, johon asensin riippuvuuksineen tätä käyttötarkoitusta varten alsa-utils- ja mpg321-paketit:

sudo apt-get install alsa-utils mpg321

Koska yleisesti PC-speakerin ääntä ei ole pidetty tarpeellisena tällä vuosituhannella, sen kernelmoduuli on mustalistattu. Otin moduulin kuitenkin käyttöön käsin (mustalistauksen voi poistaa myös pysyvästi, mutten halunnut niin tehdä tällä kertaa):

sudo modprobe snd_pcsp

Jos jostain syystä kerneliin on ladattu jo piipperin toinen moduuli, ”pcspkr”, se pitää ottaa pois:

sudo modprobe -r pcspkr

Tämän jälkeen kaikki tuntui olevan melkein kunnossa, tosin aplay (ALSA:n äänentoisto-ohjelma) herjasi, ettei voinut avata äänikorttia 0. Googletuksen jälkeen kävi ilmi, että kyseessä oli ALSA:n asetuksiin liittyvä seikka, joka esti PC-speakeria olemasta ensimmäinen äänilaite. Tämä hämäsi ALSA:a, ja poistin tämän rajoituksen tiedostosta /etc/modprobe.d/alsa-base.conf kommentoimalla pois rivin ”options snd-pcsp index=-2”.

Sitten vain ALSA:n uudelleenkäynnistys:

sudo alsa force-reload

Tämän jälkeen mpg321 pystyi toistamaan ääntä piipperin kautta. Kun vielä nostin alsamixerillä äänenvoimakkuuden melkein tappiinsa, oli ääni kuultavissa ja paikoitellen jopa tunnistettavissa.

Ok, eihän PC-speakeria tuohon tarkoitukseen ole tarkoitettukaan, mutta tulipahan todettua, että tällainenkin on mahdollista.

HDTV-projekti osa 3

Sain tarvikkeeni tänään postista, ja jouduin toteamaan että eihän tämä projekti voi onnistua. Ensinnäkään tuo HDMI→DVI-sovitin ei sovi omistamani DVI→VGA-sovittimen kanssa yksiin, liittimet ovat piirun verran erilaiset. Ja ilmeisesti olisin muutenkin tarvinnut jonkinlaisen signaalinmuuntimen vielä tuohon.

Noh, tällaista elämä toisinaan on, eikä onneksi älyttömiä rahamääriä mennyt hukkaan. Pitäisi varmaan kaivella vanha telkkarini varaston perukoilta ja viritellä jonkinlainen RCA→RF -muunnin siihen. Jossain muistelen joskus sellaisia nähneeni, ja jos sellaisen omistat niin saa ottaa yhteyttä.

Tavallaan ehkä ihan hyväkin että ei tämän pidemmälle lähtenyt ajatus; saattaa olla että kun muutan Jyväskylään, ei Elisan Viihdettä olekaan saatavilla sinne.

Tilannepäivitystä + HDTV-projekti osa 1

Alan pikkuhiljaa ymmärtää että intti on taaksejäänyttä elämää, ja sen takia voinkin taas uusin ideoin ryhtyä blogiakin päivittämään. Vuoden aikana on tapahtunut yhtä sun toista, joihin palaan sitten jos niihin jotain ajankohtaista kommentoitavaa ilmaantuu.

Uusimpana projektina olisi toteuttaa melko edullinen HDTV-ratkaisu itselleni seuraavalla tapaa:
Otan toisen CRT-näyttöni TV-ruuduksi, näyttö venyy periaatteessa 1280×1024 -resoluutioon, mutta vielä jää nähtäväksi millä resoluutiolla saan kuvaa ruutuun vai saanko lainkaan.

Näytössä ei yllättäen ole HDMI- tai edes DVI-liitintä, joten kuva saa luvan ilmestyä VGA-piuhaa pitkin koneelle. Koska DealExtremestä ei löytynyt HDMI→VGA -palikkaa, vaan pelkästään HDMI→DVI -palikka, pääsee laatikoissani pölyttynyt DVI→VGA -palikka myös hyvään käyttöön.

Tuon palikan perään sitten tulisi DealExtremestä sopiva osa, joka maksaa posteineen 9,99 USD eli jotakuinkin 7,95 €. Tästä sitten menisi johto Elisa Viihteen mukana toimitettuun digiboksiin.



Tuollaisella virityksellä voisi teoriassa kuvitella saavansa HD-telkkarin näkymään, ja melko halvalla. Kustannuksia projektille:1. CRT-näyttö saatu ilmaiseksi.
2. DVI→VGA -muunnin n. 5 €
3. HDMI→DVI -muunnin n. 8 €
4. Digiboksi saatu Elisa viihteen mukana
Yhteensä noin 13 euroa. Melko edullinen setti jos minulta kysytään. Ok, joutuuhan tuosta Elisa Viihteestä maksamaan 40 € kuussa seuraavan kahden vuoden ajan, mutta sen mukana tuli myös ”24M/1M”* yhteys, joka varsinaisesti oli hankintasyy.Seuraavaksi olisi vuorossa DX-tilaus, jonka teen kunhan löydän rahaa jostain. Jos mielestäsi olen jossain kohtaa mennyt harhaan tai jos tuon voisi jollain ilveellä tehdä vieläkin halvemmalla, laita toki kommenttia. Muutenkin kommentointi on suotavaa.
*) ”Teoreettinen maksiminopeus” ts. tuohon nopeuteen tuskin päästään missään. Itselläni nopeus on jotain 18M/0,8M vähän ajankohdasta riippuen.

Kotiinsoittaminen on välillä ihan hyvä asia

Mietiskelin eräänä kauniina (tainno, ei tässä maassa taida sellaisia ollakaan, ainakaan tähän vuodenaikaan) päivänä, mitä tapahtuisi jos Asus Eee -kannettavani joutuisi hukkaan – tai even worse – varastettaisiin. Sen takaisin saaminen saattaisi olla jokseenkin hankalaa.

Näinpä päätin että koneeni saa luvan soittaa kotiin? kerran viidessä minuutissa. Tässä tapauksessa se ottaa yhteyden KServer-Secondary-kotipalvelimeeni ja välittää sille koneen ajan ja senhetkisen ulkoverkon IP-osoitteen jäljittämistä varten. Tämä kaikki tapahtuu CRON-työnä automaattisesti koko ajan, joka käynnistyskerralla. Luonnollisesti jos verkkoa ei ole saatavilla, ei kuvia myöskään siirretä.

Kuin pisteenä I:n päällä, koneeni web-kameraa käytetään tässä hyödyksi. (Pienen kikkailun jälkeen) sain sen ottamaan kuvan, johon nuo tiedot liitetään ja se sitten siirretään palvelimelle. Eee:n kamera pystyy jopa 640×480 -resoluutioiseen kuvaan, joten siitä saa jo varsin hyvin – suotuisissa valaistusolosuhteissa – selvää, kuka konettä käyttää.

Tuo kaikki on pakattu ohjelmistoon nimeltä KServer AntiTheft, ja sen voi ladata sen projektisivulta. Tein siihen palvelinkäyttöliittymänkin omaan käyttööni, ja tässäpä uusin kuva Eee:ltäni:

Oho, kuvaa ei saatu.

Uskoakseni noilla tiedoilla voisi jo toivoa koneen löytävän tiensä takaisin minulle, jos joku tyhmempi sen varastaa. Täydellistä turvaahan tämä ei tuo, mutta huomattava lisä kuitenkin. Kun vielä suojaa BIOS:in salasanalla ja estää käynnistymisen muualta kuin kiintolevyltä, ei koneeseen helposti asenneta muuta käyttöjärjestelmääkään päälle.

Vielä kun saisi tuunattua tuon web-kameran merkkivalon pois huomiota herättämästä, alkaisi paketti olla täydellinen.