Muutaman kympin investoinnilla voi rakentaa tallentavan ja liikkeen tunnistavan videovalvonnan. Minä toteutin itseäni Raspberry Pilla ja kympin web-kameralla, sekä Motion-ohjelmalla. 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 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:
Tämän jälkeen komennetaan:
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:
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ä):
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öä