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öä

4 thoughts on “Budjettivalvontakamera liikkeentunnistuksella”

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

    1. Rakentelin samanlaisen systeemin – ja hyvin toimi.
      Siihen saakka kunnes päivitin Pi:n rasbianin Jessieksi. Nyt ei tee videoita, mutta hillitömän määrän stillkuvia. Jotka nekään eivät kelvollisia.

  2. Vastaava havainto kun päivitin raspbianin.
    Ja kokeiln myös Ubuntussa (16.04), ei sekään tee sitä videotiedostoa enää.

  3. Debian bullseye – ja taas tuntuu toimivan, konffaus ei ihan tuollaisenaan mutta tekee videon.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

This site uses Akismet to reduce spam. Learn how your comment data is processed.