Vanha sivusto

Tämä on vanha itQ.fi-sivusto, ja sisällön ylläpitäminen sille on lopetettu. itQ siirtyi WordPress-alustalle 6.6.2015.

sunnuntai 15. heinäkuuta 2012

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 640x480: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.%Y\n%T-%q # Tulostetaan kuvan ja videon vasempaan alalaitaan
# liikkeen ja kohinan määrä, ja tapahtuman juokseva numero
text_left Liike %D | Kohina %N\nTapahtuma %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öä

1 kommentti :

Anonyymi kirjoitti...

Kiitos selkeästä kuvauksesta! Jotain tällaista rakentelen varmaan itsekin, kunhan Raspberry Pi saapuu vihdoin...