joonas kiiskinen virhetilanteiden havaitseminen pakkauskoneesta

Transcription

joonas kiiskinen virhetilanteiden havaitseminen pakkauskoneesta
JOONAS KIISKINEN
VIRHETILANTEIDEN
KONENÄÖLLÄ
HAVAITSEMINEN
PAKKAUSKONEESTA
Diplomityö
Tarkastaja: professori Seppo Kuikka
Tarkastaja ja aihe hyväksytty
Teknisten tieteiden tiedekuntaneuvoston kokouksessa
6.5.2015
ii
TIIVISTELMÄ
TAMPEREEN TEKNILLINEN YLIOPISTO
Automaatiotekniikan koulutusohjelma
KIISKINEN, JOONAS: Virhetilanteiden havaitseminen pakkauskoneesta
konenäöllä
Diplomityö, 49 sivua, 3 liitesivua
Huhtikuu 2015
Pääaine: Automaatiotekniikka
Tarkastaja: professori Seppo Kuikka
Avainsanat: OpenCV, konenäkö
Laadunvalvonnassa on perinteisesti käytetty ihmisiä, eivätkä koneet ole heitä täysin
syrjäyttäneetkään. Kuitenkin teollisuudessa tuotantolinjat tukeutuvat konenäköön yhä
useammin, kun tekniikat ja algoritmit konenäössä kehittyvät. Konenäön etuna voidaan
pitää sen nopeaa ja täsmällistä tiedonkäsittelyä.
Tässä diplomityössä tutkittiin menetelmiä, joilla pystytään tekemään järjestelmästä
interaktiivinen ympäristönsä kanssa. Tähän sisältyy liikkeen tunnistaminen videosta,
missä tausta erotetaan alkuperäisestä kuvasta. Tavoitteena oli toteuttaa
konenäkösovellus, joka hyödyntää tätä ja monia muita toimintoja. Näiden avulla
sovellus pystyy informoimaan PLC-järjestelmää sen ympäristön muutoksista.
Sovellus käyttää avoimen lähdekoodin kirjastoja. Oleellisin näistä on OpenCV-kirjasto,
joka tarjoaa tarvittavat funktiot sovelluksen tekemiseen. Tämän lisäksi sovellus käyttää
vielä ZXing-kirjastoa, jonka avulla voidaan lukea viiva- sekä 2D-koodeja
digitaalikuvasta. Sovellus kehitettiin Qt-kehitysympäristössä, joka tarjosi myös
mahdollisuuden kehittää sovellukselle tarvittavan käyttöliittymän. Diplomityön
tarkoituksena oli jatkokehittää alkuperäistä järjestelmää, mutta myös tutkia järjestelmän
suoritusta kevyemmällä alustalla. Tässä onnistuttiinkin, mutta tiettyjä osia alkuperäisen
järjestelmän toiminnasta jouduttiin kuitenkin karsimaan kohdealustan heikon
suorituskyvyn takia.
Toteutettu konenäkösovellus pystyy tutkimaan jatkuvaa videovirtaa ja tutkimaan siitä
sovellukselle opetetut toiminnot. Toimintoihin sisältyy liikkeen tunnistaminen ja
viivakoodin lukeminen. Jokainen virheellinen liikehavainto tai onnistunut viivakoodin
tulkitseminen välitetään järjestelmään yhdistetyille laitteille. Sovelluksessa voidaan
määrittää käsin tai automaattisesti sallittu liikealue. Virheellinen liikehavainto tarkoittaa
sitä, että liikettä havainnoidaan tämän alueen ulkopuolella.
iii
ABSTRACT
TAMPERE UNIVERSITY OF TECHNOLOGY
Master’s Degree Programme in Automation Technology
KIISKINEN, JOONAS: Error detection from packing machine with computer
vision
Master of Science Thesis, 49 pages, 3 Appendix pages
April 2015
Major: Automation Technology
Examiner: Professor Seppo Kuikka
Keywords: OpenCV, computer vision
Traditionally, people have been used in quality control, and machines haven’t yet
completely displaced them. However, industrial production lines rely more and more in
computer vision when techniques and machine vision algorithms evolve. The main
advantage of machine vision can be considered to be rapid and punctual information
processing.
This thesis studies ways on which we are able to make the existing system to be
interactive with its surroundings. This includes movement detection from video stream
where background is subtracted from the initial frame. The goal was to create a
computer vision application which will utilize this and its many other functions. With
these the application is able to communicate with the PLC-system about the changes of
its surroundings.
The application uses open source code libraries. The most significant library is
OpenCV. It provides the necessary functions to complete the application. The
application also uses ZXing-library by which the application is able to read barcodes
and 2D-codes from a digital image. The application was developed in a Qt-environment
which offered the possibility to develop a required user interface for the application.
The most important purpose of this thesis was to develop further the original monitoring
system but to also investigate the performance of an embedded device when it is
running the original system. The investigation was successful but some features of the
original system had to be eliminated due to the poor performance of the target device.
The computer vision application is able to process continuous video stream and process
all the functions that have been taught for the application. These functions include
motion detection and barcode/2D-code reading. Every faulty motion detection or
successful barcode detection will trigger an event which will be sent to every device
which is connected to the monitoring system. In the application it is possible to define
an area manually or automatically where movement is allowed. Faulty motion detection
is triggered if movement is detected outside of this defined area.
iv
ALKUSANAT
Suuret kiitokset Jomet Oy:lle, joka tarjosi mielenkiintoisen diplomityöaiheen. Ennen
työn aloittamista, kävimme palavereita Jomet sisäisen kehitysryhmän kanssa, joissa
alettiin ideoimaan järjestelmä, joka pystyisi itse havaitsemaan jos pakkauskoneessa
ilmenee virhetilanne. Mielessäni kävi tuolloin, että kyseisen toiminnon suorittava
sovellus pystyttäisiin toteuttamaan vasta kaukana tulevaisuudessa. Ei kuitenkaan
kestänyt kauaa kunnes aloin hieman tutkia asiaa ja törmäsin OpenCV-kirjastoon ja
havahduimme sen tarjoamista mahdollisuuksista.
Erityismainintana haluan kuitenkin vielä kiittää ohjaajaani diplomi-insinööri Juha
Kiiskistä sekä työn tarkastajaa professori Seppo Kuikkaa. Molemmat ovat antaneet työn
rakenteeseen sekä sisältöön liittyvää rakentavaa palautetta.
Holzösterissä 12.4.2015
Joonas Kiiskinen
v
SISÄLLYS
Abstract ....................................................................................................................... iii
Termit ja niiden määritelmät ......................................................................................... 1
1
Johdanto................................................................................................................ 2
2
Konenäköjärjestelmä ............................................................................................. 4
2.1 Valaistus ....................................................................................................... 6
2.2 Linssi ............................................................................................................ 7
2.3 Anturointi ...................................................................................................... 8
2.4 Kuvan prosessointi ........................................................................................ 8
2.5 Kommunikointi ............................................................................................. 9
3
Konenäön soveltaminen ...................................................................................... 10
3.1 Digitaalikuva ............................................................................................... 10
3.1.1 Digitaalikuvaa mallintava funktio ................................................... 11
3.2 Digitaalisen kuvan käsittely ......................................................................... 11
3.2.1 Geometriset operaatiot .................................................................... 11
3.2.2 Kuvan gradientti ............................................................................. 15
3.2.3 Kuvassa esiintyvät reunat ............................................................... 16
4
Vanha järjestelmä................................................................................................ 20
4.1 Virheiden havaitseminen ............................................................................. 20
4.2 Kommunikaatio ........................................................................................... 20
4.3 Reagointi virheeseen ................................................................................... 20
4.3.1 Tiedon siirtäminen pilvipalveluun................................................... 21
5
Toteutus .............................................................................................................. 22
5.1 Kevyet kehitysalustat................................................................................... 22
5.2 Vanhan järjestelmän kehittäminen ............................................................... 24
5.2.1 Vaatimukset.................................................................................... 24
5.2.2 Käyttötapaukset .............................................................................. 25
5.2.3 Käytetyt kirjastot ............................................................................ 28
5.2.4 Sovellus .......................................................................................... 34
6
Tulokset ja arviointi ............................................................................................ 38
6.1 Testialusta ................................................................................................... 38
6.2 Loppusovelluksen yleiskuvaus .................................................................... 39
6.3 Käyttö ......................................................................................................... 40
6.4 Sovelluksen rakenne .................................................................................... 41
6.5 Jatkokehitys................................................................................................. 42
7
Yhteenveto .......................................................................................................... 44
Lähteet........................................................................................................................ 46
Liitteet ........................................................................................................................ 48
1
TERMIT JA NIIDEN MÄÄRITELMÄT
API
Ohjelmointirajapinta. (Application Programming Interface).
ASIC
Mikropiiri, joka on suunniteltu ainoastaan yhtä toimintoa
varten. (Application Specific Integrated Circuit).
FPGA
Ohjelmoitava mikropiiri, joka toimii kellotaajuuden
tarkkuudella. (Field Programmable Gate Array).
GCC
Kääntäjä, joka tukee lukuisia ohjelmointikieliä. (GNU
Compiler Collection).
inline-avainsana
C-ohjelmointikielissä käytetty avainsana, jolla vältytään
ohjelmassa muistihypyiltä.
IPC
Prosessien
välinen
Communication).
PLC
Ohjelmoitava logiikka, teollisuuskomponentti, joka tukee
IEC-61131-3-standardin
ohjelmointikieliä.
Käytetään
teollisuudessa
mm.
ohjaamaan
toimilaitteita.
(Programmable Logic Controller).
SIMD-käsky
Laskentayksikkö suorittaa samaa ohjelmaa useille eri
tietoalkioille. (Single Instruction stream, Multiple Data
streams).
STL-säilö
Säilö on olio, joka sisältää toisia olioita. (Standard Template Library container).
x86-prosessori
Intelin kehittämä prosessoriarkkitehtuuri.
kommunikaatio.
(Inter-Process
2
1
JOHDANTO
Konenäön kehitys sai alkunsa 1960-luvulla, kun Larry Roberts teki tohtorin tutkintonsa
3D-mallin
geometrisen
informaation
erottamisen
2D-näkymästä
MIT:lle
(Massachuttsetts Institute of Technology). Monet tutkijat käyttivät tätä työtä pohjanaan
omaan työhönsä sekä jatkoivat Robertsin aloittamaa työtä eteenpäin. 1970-luvun lopulla
David Marr kehitti uuden lähestymistavan (bottom up), jolla pystytään ymmärtämään
digitaalista näkymää paremmin konenäön kannalta. 1980-luvulla konenäkö alkoi
saavuttaa maailman laajuista tutkijakuntaa, mikä toi mukanaan uusia teorioita ja
käsitteitä. Vasta 1990-luvulla konenäköjärjestelmiä alkoi näkyä tuotantojärjestelmissä,
mikä johti konenäköteollisuuden varsinaiseen syntymiseen. Tällä hetkellä konenäkö
kehittyy edelleen huimaa vauhtia samalla kun prosessointiyksiköt kehittyvät,
mahdollistaen entistä monimutkaisempia ja näyttävämpiä konenäkösovelluksia.
Nousevana trendinä on 3D- sekä elepohjaisten järjestelmien kehittäminen.
Elepohjaisessa järjestelmässä perinteiset syötelaitteet, kuten hiiri ja näppäimistö
korvataan eleohjauksilla. [2]
Konenäöllä jäljitellään ihmisen näköaistia, eli konenäkö pyrkii tulkitsemaan 3D-mallia
2D-kuvista tai -videovirroista. Konenäön määritelmä koostuu tiedon automaattisesta
erottamisesta digitaalisista kuvista ja videoista. Tieto on esimerkiksi objektin
tunnistamista tai liikkeen seuraamista. Kuvien käsittely voidaan jakaa kolmeen eri
tasoon. Alimmalla tasolla tapahtuu kuvan prosessointi, mikä käsittää kuvan matalan
tason parannukset: kohinan suodattaminen, ominaisuuden tunnistaminen ja kuvan
kompressointi. Toisella tasolla on kuvan analysoiminen, jossa käytetään hyväksi
alemmalla tasolla saatuja tuloksia. Ylin taso koostuu konenäöstä, joka käyttää taas
analysointitason tuloksia muodostaen näistä uudet johtopäätökset: objektin
tunnistamisen, muodon analysoinnin ja yleisen tunnistamisen. Nykyään konenäköä
käytetään moneen erilaiseen tärkeään toimintoon teollisuudessa ja lääketieteessä.
Teollisuudessa monet tarkastelutehtävät pystytään suorittamaan koneellisesti konenäön
avulla sekä lääketieteessä konenäköä voidaan hyödyntää röntgen- ja magneettikuviin.
Kehityksen myötä näitä sovelluksia pystytään entistä helpommin siirtämään kevyille
alustoille. Nämä sovellukset voidaan kategorisoida neljään eri funktioon: mittaukseen,
laskemiseen, paikantamiseen ja dekoodaukseen. Mittausta ja laskemista voidaan käyttää
tuotteiden ominaisuuksiin, esimerkiksi piirilevyn komponenttien sijainti piirilevyllä..
Paikantamisessa vaadittu ominaisuus paikallistetaan, jolloin siihen voidaan suorittaa
muita tarvittavia operaatioita. Dekoodauksella viitataan erilaisten viivakoodien sekä 2Dkoodien tulkitsemiseen. [2]
3
Konenäköjärjestelmä tarkoittaa kokonaisuutta, jossa kuvan hankinta, käsittely ja
analysointi on yhdistetty yhdeksi kokonaisuudeksi. [2] Digitaalikuvan käsittely ja
analysointi tehdään tietokoneella tai jollakin muulla laitteella. Järjestelmä koostuu
yhdestä tai useasta kamerasta, valaistuksesta, laskentayksiköstä sekä kuvankäsittely- ja
analysointiohjelmasta. Tässä tutkimustyössä käytetään Logitechin C920-webkameroita,
joissa on sisäänrakennettu H.264-enkoodaus. Sisäänrakennetulla enkoodauksella on
vasta merkitystä kun siirrytään kevyempään alustaan, mutta tähän perehdytään
tarkemmin luvussa 5. Tyypillisesti konenäköjärjestelmä on osana tuotantolinjaa, jossa
voidaan
tarkastella
tuotteiden
ominaisuuksia.
Tuotantotehtaat
käyttävät
konenäköjärjestelmää ihmisten sijasta, koska ne pystyvät toimimaan nopeammin, ovat
luotettavampia ja pystyvät työskentelemään jatkuvasti. Tässä työssä pöytätietokone
toimii tutkimustyön konenäköjärjestelmän ytimenä, mutta tämän lisäksi tutkitaan
kevyempää alustavaihtoehtoa yksinkertaisempiin monitorointitoimintoihin.
Nykyajan pakkauskoneet räätälöidään entistä enemmän vastaamaan asiakkaan tarpeita,
jolloin jokainen valmistettava kone poikkeaa hieman toisista. Koneiden
perustoiminnallisuus toki pysyy samanlaisena, mutta pienet muutokset toimilaitteiden
ohjauksessa vaativat ohjelmakoodin muokkauksen, joka mahdollistaa inhimilliset
ohjelmavirheet. Tämän takia pakkauskoneen toimintaa halutaan monitoroida. Jos ja kun
ohjelmavirhe ilmenee ja keskeyttää koneen toiminnan, tilanteesta halutaan löytyvän
videomateriaalia, johon voidaan tukeutua ja tämän avulla pystytään korjaamaan
mahdollinen ohjelmavirhe. Koneen pysäyttävään virheeseen voidaan joutua ilman
ohjelmavirhettäkin. Mekaaninen ongelma onkin tyypillisempi kuin ohjelmallinen, koska
mekaaniset osat kuluvat ja alentavat täten osien toimintavarmuutta. Joka tapauksessa
videon avulla pystytään toteamaan ongelmatilanteen aiheuttaja.
Tässä työssä tutkitaan pystytäänkö OpenCV-kirjastolla luomaan webkamerapohjainen
konenäköjärjestelmä, joka pystyy toimimaan ”reaaliaikaisesti” yhdessä PLCjärjestelmän kanssa. Aiheeseen tutustuminen aloitetaan tutustumalla konenäön
perusteisiin, jonka jälkeen tarkastellaan konenäön mahdollistavaa OpenCV-kirjastoa.
Kirjastoon tutustumisen ohessa käydään läpi hieman myös sovellusohjelmointia ja
selvennetään tutkimuksessa tehtyä sovellusta. Tästä seuraavassa luvussa tarkastellaan
lopullisen sovelluksen tuloksia ja arvioidaan, kuinka hyvin OpenCV-kirjasto soveltuu
teollisiin automaatiosovelluksiin. Viimeinen luku tiivistää vielä yhteen koko
tutkimuksen.
4
2
KONENÄKÖJÄRJESTELMÄ
Konenäkö perustuu digitaalisten kuvien perusteelliseen tutkimiseen. Kuvan avulla
tietokone pystyy tekemään hyödyllisiä päätelmiä siinä esiintyvistä fyysisistä objekteista.
Videotiedostoa voidaankin käytännössä kuvitella digitaalikuvataulukkona, joka on
synkronoitu äänitiedoston kanssa. Videon oleellinen ominaisuus on kuvien
virkistystahti. Tämä määrittää kuinka monta kuvaa esitetään sekunnissa. Ihminen pystyy
erottamaan noin 55 kuvaa sekunnissa, mutta jo 20 kuvan virkistystahti näyttää ihmiselle
jatkuvalta liikkeeltä. Tämä tarkoittaa, että virkistystaajuuden ollessa 20, eli kuva
päivittyy 50 tahdilla, käytännössä konenäköjärjestelmällä on myös sama aika
prosessoida kuva ja tehdä tarvittavat päätelmät.
Konenäköjärjestelmässä on kuitenkin kaksi erilaista mahdollisuutta prosessoida
jatkuvaa videovirtaa. Toisessa näistä jokainen videovirtaa generoivan laitteen kuva
siirretään puskuriin, eli ”digitaalikuvataulukkoon” ja toisessa luetaan ainoastaan tuorein
kuva väylästä. Ensimmäiseksi esitetyn mallin sovelluksen tulee olla vähintäänkin yhtä
nopea kuin videovirran virkistystaajuus. Jos sovellus ei pysty tähän, niin puskuri tulee
täyttymään ajan myötä ja jos tämä halutaan välttää, niin sovelluksen täytyy hylätä
satunnaisia kuvia prosessoinnista. Tällöin on mahdollista, että hylätään jotain oleellista
tietoa sisältäviä kuvia. Sovelluksen prosessointinopeuden ollessa hitaampi kuin
videovirran virkistystaajuus, tarkoittaa tämä sitä, että järjestelmän ”reaaliaikaisuus” on
menetetty. Toinen sovellusmalli prosessoi ainoastaan uusinta kuvaa, jonka kamera on
lähettänyt. Tämän etuna on, että sovelluksen reaktioaika on deterministinen. Huono
puoli on, että kaikkia kuvia ei prosessoida, jos sovelluksen reaktioaika on suurempi kuin
videovirran virkistystaajuus.
Konenäön avulla toteutettuja sovelluksia:
•
•
•
•
•
•
•
•
•
Autonomisen auton visuaalinen ohjaus
Rekisterikilpien automaattinen tunnistus (ANPR)
Tekstin tunnistaminen (OCR)
Kasvon tunnistaminen
Hymyn tunnistaminen (kamera laukeaa vasta kun hymy on tunnistettu)
Objektitunnistus
Kirjautuminen järjestelmään kasvojen avulla (http://www.sensiblevision.com)
Urheilulähetysten grafiikka
Peliteollisuus: Nintendo Wii, Xbox Kinect
5
Konenäköjärjestelmän toiminnot voidaan jakaa neljään sovelluskohteeseen:
mittaamiseen, laskemiseen, paikantamiseen sekä dekoodaukseen. Näiden toimintojen
avulla pystytään alentamaan tuotantojärjestelmän kustannuksia sekä kasvattamaan
tuotantolinjan tuottavuutta. Konenäkö pystyy erittelemään virheelliset tuotteet
tuotantolinjalta ilman taukoja, väsymättä ja pyyteettömästi. Näin varmistetaan, että
tuotteen loppukäyttäjä ei saa käyttöönsä viallista tuotetta. Tuotantolinjan tuottavuuden
kasvattamisen perusteena on, että pienemmällä määrällä lähtömateriaalia saadaan
enemmän lopullisia tuotteita.
Konenäkö mahdollistaa virheiden havaitsemisen jo tuotantolinjan alkuvaiheesta
tehokkaasti. Tällöin vioittunut tuote tai komponentti voidaan käyttää uudelleen
esimerkiksi raaka-aineina uuden tuotteen tuottamiseen, jos lopullinen tuote koostuu
esimerkiksi erilaisista komponenteista. On siis tärkeää, että ennen kuin lopullinen tuote
valmistetaan, jokainen sen komponentti toimii. Tuotantolinjan loppupäässä havaittu
viallinen tuote voi joutua jätteeksi, jos siitä ei pystytä enää hyödyntämään mitään raakaaineita tuotantoprosessia varten.
Konenäöllä pystytään myös kasvattamaan tuotantolinjan päälläoloaikaa. Pakkauskoneen
toiminta on taattu, kun kaikki sisään tulevat tuotteet tai tavarat tulevat samalla lailla
sekä ennalta sovitulla tavalla.
Kuva 1 virheellinen tuote tuotantolinjassa
Kuvassa 1 on havainnollistettu tilanne, joka voisi mahdollisesti aiheuttaa koneen
seisahduksen. Jotta tuotantolinjan tuottavuus pysyy korkealla, on oleellista, että
vältetään pakkauskoneen virhetilanteita. Seisahduksesta tulee huomattavasti lyhyempi,
kun pysäytetään hihnakuljetin virheen korjaamiseksi.
Tuotteiden seuranta on myös tärkeää tuotantojärjestelmässä. Näin tuotteita pystytään
paikantamaan tuotantolinjalla ja mahdollisesti havaitaan ne kohdat, joiden toimintaa
pitää kehittää, jotta saavutetaan vieläkin parempi tuottavuus. Tuotteita seuratessa
konenäkösovellus tarkastelee viivakoodeja, 2D-koodeja sekä OCR-tekstejä (Optical
Character Recognition) eli koneen ja ihmisen ymmärtämiä tekstejä.
6
Näiden ohella konenäköjärjestelmän etuna voidaan myös pitää sitä, että se pystyy
työskentelemään jatkuvasti ilman mitään pysähdyksiä. Kun järjestelmä on kerran
ohjelmoitu jotakin tehtävää varten, se tekee aina samaa tehtävää. Ihmisillä alkaa
tapahtua virheitä enenevissä määrin noin 20 minuutin tarkastelutyön jälkeen, koska
mielenkiinto tehtävää työtä kohtaan laskee tutkitusti. Tämän lisäksi koneet pystyvät
työskentelemään nopeammin ja aina samanlaisesti.
Fyysisesti konenäköjärjestelmä koostuu viidestä eri osa-alueesta: valaistuksesta,
linssistä, anturoinnista, kuvaprosessoinnista ja kommunikoinnista. Itse järjestelmä voi
koostua joko erikseen edellä mainituista komponenteista tai kaikki nämä komponentit
voidaan yhdistää yksittäiseen sulautettuun järjestelmään. Erillisistä komponenteista
koottu järjestelmä voisi koostua esimerkiksi tietokoneesta, kamerasta ja ulkoisesta
valolähteestä. Ennen kuin tarkastellaan näitä komponentteja tarkemmin, on oleellista
tiedostaa, että ei ole yhdentekevää mitenkä kappaleet esitellään konenäköjärjestelmälle.
Kappaleen sijainnin ja suunnan tulisi olla vakio tai toistettava, jotta konenäön
tuottamasta lopputuloksesta tulisi hyödyllinen seuraavalle järjestelmälle.
2.1
Valaistus
Valaistus on tärkeä osa toimivaa konenäköjärjestelmää. Ilman sitä mitään kameran
ottamia kuvia ei luultavasti pystytä hyödyntämään, koska kuvista ei voida erottaa
mitään hyödyllistä. Oikealla valaistuksella, eli valon suuntauksella, tehokkuudella ja
valon värin valinnalla pystytään tuomaan kappaleen tarkkailtavat ominaisuudet näkyviin
ja mahdollisesti vielä korostamaan näitä ominaisuuksia. Tarkoituksena on siis saada
ainoastaan tarkkailtavista ominaisuuksista tarkkoja ja muista ominaisuuksista
mahdollisimman epäselviä, jotta erottuvuus olisi mahdollisimman suuri.
Kuva 2 valaistuksen suunnan merkitys
Kuvassa
2
on
esitelty
esimerkkinä
valaistuksen
suunnan
merkitys.
Vasemmanpuoleisessa kuvassa valaistus on sijoitettu kappaleen ja kameran väliin,
jolloin hehkulampun lanka näkyy epäselvästi. Oikeanpuoleisessa kuvassa valaistus on
sijoitettu kappaleen taakse kohti kameraa, jolloin saadaan selvästi tarkempi kuva
langasta.
7
Kuva 3 väriympyrä
Materiaalit myös heijastavat ja absorboivat eripituisia valon aallonpituuksia. Kun
materiaalin pinta näyttää erityisen kirkkaalta, se heijastaa suurinta osaa tulevasta
valosta. Pinnan ollessa tumma, pinta kostuu vastustavasta väristä, ja se absorboi
suurimman osan tulevasta valosta.
Kuva 4 Valolähteen värin merkitys
Voidaan käyttää yksinkertaista väriympyrää, joka jakautuu kahteen eri osaan;
lämpimään ja kylmään. Tämän avulla pystytään luomaan kontrasti kohteen ja taustan
välillä. Mustavalkokameralla on myös mahdollista erottaa tietyn värisiä ominaisuuksia,
kun käytetään oikean väristä valonlähdettä kuvauksessa. Jokainen väri heijastaa hyvin
samanväristä valoa, esimerkiksi punainen kappale näyttää kirkkaalta (valkoiselta)
punaisessa valaistuksessa ja samaisesta kappaleesta saadaan tumma (musta) vihreällä
valaistuksella. [9,15]
2.2
Linssi
Linssin avulla kaapataan kuva ja välitetään se anturoinnille valona. Linssi määrittää
myös tarkasteltavan alueen koon ja tarkkuuden syvyyden. Oikealla linssin valinnalla
pystytään edesauttamaan konenäköjärjestelmä kohti parempaa lopputulosta. Linssin
valinnalla voidaan rajata tarkasteltava alue ainoastaan haluttuihin ominaisuuksiin.
8
Kuva 5 väärä linssivalinta voi tehdä kuvasta lukukelvottoman konenäkösovellukselle
Väärällä linssin valinnalla otetaan epätarkempi kuva laajemmalta alueelta, joka sisältää
turhaa tietoa. Tällöin kuvalle joudutaan suorittamaan huomattavasti enemmän
algoritmeja, että saadaan eroteltua halutut ominaisuudet. Useampien algoritmien
suorittaminenkaan ei takaa, että huonosta kuvasta voitaisiin erottaa samat ominaisuudet
kuin hyvästä kuvasta.
2.3
Anturointi
Digitaaliset kamerat ovat tulleet entistä suosituimmiksi samalla kun niiden hinnatkin
ovat laskeneet. Yksi syy tähän on digitaalikameran anturointiteknologian kehitys.
CMOS-tekniikka on hiljalleen syrjäyttämässä kalliimpaa CCD-tekniikkaa. Anturointi
vastaanottaa linssin välittämän valon ja muuntaa sen elektroneiksi. Lopullinen
digitaalikuva muodostuu kun elektronit sijoitetaan pieniin kennoihin, jotka vastaavat
pikselialueita digitaalikuvassa.
Anturointi käyttää tyypillisesti CCD- tai CMOS-tekniikkaa muokatessaan linssin
välittämän valon digitaaliseksi kuvaksi. Tämä digitaalinen kuva koostuu pikseleistä,
missä vähäinen valo muodostaa tummia pikseleitä ja kirkas valo kirkkaampia pikseleitä.
On tärkeää, että kameran anturoinnin resoluutio on tarpeeksi suuri konenäkösovellusta
varten. Mitä alhaisempi resoluutio, eli MP-taso (Mega Pixels), sitä selkeämmin pikselit
erottuvat toisistaan kuvassa. Kun digitaalinen kuva on muodostettu, se lähetetään
eteenpäin prosessorille, joka suorittaa tarvittavia analyysejä kyseiselle kuvalle. [9]
2.4
Kuvan prosessointi
Kuvan prosessoiva yksikkö koostuu algoritmeista, jotka tarkastelevat kuvaa ja erottavat
kuvasta haluttuja ominaisuuksia. Prosessointivaihe voidaan jakaa seuraaviin vaiheisiin:
•
•
•
•
Kuva vastaanotetaan kameralta
Käsitellään kuvaa, jotta ominaisuudet erottuvat
Ohjelmat etsivät halutut ominaisuudet
Lasketaan mittaukset ja verrataan referenssiarvoihin
9
•
Lopuksi välitetään tulos eteenpäin, tyypillisesti tieto hyväksytystä tai hylätystä
tuotteesta.
Tähän kiteytyy koko konenäköjärjestelmän ydin. Kuvan prosessointiin liittyy usein
erilaisia konenäköohjelmistoja, joilla pystytään konfiguroimaan järjestelmä tutkimaan
tiettyjä asioita. Useimmissa ohjelmistoissa on toiminnot paikantamiselle, laskemiselle,
mittaamiselle ja dekoodaamiselle. Näitä toimintoja käytetään usein yhdessä laadittaessa
lopputulosta.
2.5
Kommunikointi
Kuvan prosessoimisen jälkeen lopputulokset välitetään eteenpäin seuraavalle
järjestelmälle. Lopputuloksen on tarkoitus olla hyödyllistä tietoa, joka on eritelty
digitaalikuvasta. Kommunikoinnin voi jakaa yksittäiseen signaaliin, joka yhdistetään
esimerkiksi PLC-järjestelmään tai solenoidiin, joilla ohjataan hylkäysmekanismia.
Toinen vaihtoehto kommunikoinnissa on, että välitetään dataa esimerkiksi RS-232:lla,
Ethernetillä tai Ethernet/IP:llä. RS-232-sarjaväylää ja Ethernetiä voidaan käyttää, jos
järjestelmän data halutaan siirtää esimerkiksi tietokoneelle. Ethernet/IP:llä data voidaan
siirtää HMI-paneeliin (Human Machine Interface), josta koneen operaattori voi
tarkastella mittaustuloksia.
10
3
KONENÄÖN SOVELTAMINEN
Digitaalisille kuville voidaan tehdä monenlaisia operaatioita. Useat konenäköön liittyvät
operaatiot muokkaavat kuvaa parantamalla kuvanlaatua tai prosessoimalla kuvaa
muodostaen uuden kuvan. Konenäössä käytetään kuitenkin myös operaatioita, jotka
muuttavat alkuperäisen kuvan esitystavan täysin. Alkuperäisessä kuvassa voidaan
esittää pikselin väriarvot, mutta prosessoidussa kuvassa voidaan esittää pikseleiden
väriarvojen diskreettejä derivaattoja, jolloin lopputuloksena näkyy alkuperäisen kuvan
reunoja. Tässä luvussa on tarkoituksena käydä läpi hieman molempia operaatioita
geometrisista operaatioista aina reunan tunnistamiseen. Aluksi on kuitenkin hyvä
tutustua siihen, mitä digitaalinen kuva sisältää.
3.1
Digitaalikuva
Digitaalinen kaksiulotteinen kuva koostuu pikseleistä ja pikseli voi sisältää useita eri
väriarvoja riippuen kuvan värimaailmasta. Digitaalikuvat esitetään usein RGBmuodossa, jolloin pikseliarvo sisältää punaisen, vihreän ja sinisen värikomponentin
arvot. Jokaisen värikomponentin arvo skaalautuu arvovälille [0,255], joka on
esitettävissä kahdeksalla bitillä. Näin ollen, RGB-muodossa olevan kuvan yksi pikseli
tarvitsee 24 bittiä muistia. Harmaasävyisessä kuvassa ainoana värikomponenttina on
harmaa, jonka arvoalue on myös [0,255]. Tällöin harmaasävyisen kuvan yhden pikselin
vaatima muistin määrä on kahdeksan bittiä. Konenäössä onkin tärkeää huomioida
prosessoitavan tiedon kokoa. Koska harmaasävyinen kuva on ainoastaan kolmasosan
kokoinen RGB-kuvaan verrattuna, on tärkeää, että vain riittävää dataa tutkitaan ja
manipuloidaan.
Kuva 6 tietokoneen näkemys digitaalikuvista
11
Kuvassa 6 esitetään digitaalikuvan sisältämän datan näkymää ihmisen ja tietokoneen
näkökulmasta. Ihminen havaitsee väriarvot värinä ja tietokone tulkitsee samaiset arvot
diskreetteinä lukuarvoina. Vasemmalla olevassa kuvassa esitetään kohta, johon
zoomataan. Keskellä oleva kuva näyttää mustavalkoisen datan zoomatusta alueesta ja
oikealla nähdään kohteen sisältämät RGB-komponenttien arvot. [2,15]
3.1.1
Digitaalikuvaa mallintava funktio
Kuvaa voidaan mallintaa myös funktiolla f(x,y), jossa x ja y ovat xy-koordinaatiston
koordinaatteja. Funktion ulostuloa, millä tahansa xy-koordinaattiparilla, kutsutaan kuvan
intensiteetiksi kyseisestä pisteestä. Kun x-, y- ja intensiteettiarvot ovat kaikki äärellisiä
ja diskreettejä, niin kutsumme tätä kuvaa digitaaliseksi kuvaksi. [15]
Kuvaa mallintava funktio koostuu kahdesta komponentista.
1. Valaisusta (illuminance) i(x,y) = kuvassa ilmenevän valaistuksen määrä.
2. Heijastuksesta (reflection) r(x,y) = kuvassa ilmenevän valaistuksen
heijastuminen kuvan objekteista.
, = , , ,
(1)
jossa
0 < , < ∞ ja 0 < , < 1
Objektin ominaisuudet määrittelevät r(x,y)-arvon. Kun r(x,y) = 0, niin objekti ei heijasta
yhtään valoa ja r(x,y) = 1 tarkoittaa valon täydellistä heijastumista. Esimerkkinä
mainittakoon, että aurinko valaisee kirkkaana päivänä 90 000 lm / m2, pilvisenä päivänä
10 000 lm / m2 ja valaistuksen voimakkuus toimistossa on noin 1000 lm / m2.
Vastaavasti lumen heijastuskerroin on 0.93, ruostumattoman teräksen on 0.63 ja mustan
sametin on 0.01. Funktion f(x,y) palauttamat arvot rajoittuvat tyypillisesti sisätiloissa 10
ja 1000 välille. Kuvattaessa mustavalkomaailmaa, funktion ulostuloarvot rajoitetaan 0 ja
255 väliin. Musta on 0 ja valkoinen on vastaavasti 255, kaikki muu tämän väliltä esittää
harmaan eri sävyjä.
3.2
Digitaalisen kuvan käsittely
3.2.1
Geometriset operaatiot
Geometrinen matriisioperaatio laskee uudet koordinaatit pikseliarvoille. Geometristen
operaatioiden avulla voidaan esimerkiksi zoomata, pyörittää ja muuttaa kuvan
näkökulmaa. Nämä operaatiot suoritetaan 2-ulotteisille kuville. Operaatioiden
12
lopputuloksena on uusi kuva, jossa alkuperäisen kuvan jokaiselle pikseliarvon
koordinaateille lasketaan uudet koordinaatit ja näihin koordinaatteihin sijoitetaan
alkuperäinen pikseliarvo. Pikseliarvojen sijoitus voidaan tehdä kahdella eri tavalla.
Eteenpäin sijoituksessa (forward mapping) käydään alkuperäisen kuvan pikselit yksi
kerrallaan läpi ja kopioidaan pikseliarvo geometrisen operaation osoittamaan
koordinaattipisteeseen. Asian voi myös mieltää siten, että lopullisen kuvan
koordinaattien pikseliarvoja muutetaan ”satunnaisessa” järjestyksessä. Käänteisessä
sijoituksessa (reverse mapping) käydään loppukuvan koordinaatit yksi kerrallaan läpi ja
ne paikannetaan alkuperäisestä kuvasta geometrisella operaatiolla. Lasketun paikan
pikseliarvo kopioidaan loppukuvan koordinaattiin. Tämän jälkeen loppukuvassa
siirrytään seuraavaan koordinaattiin ja lasketaan sen alkuperäinen sijainti ja niin
edelleen. Eli toisin kuin eteenpäin sijoituksessa, käänteisessä sijoituksessa loppukuvan
koordinaattien pikseliarvot muutetaan järjestyksessä. [4,18,19]
Kuva 7 vasemmalla esitetään forward mapping ja oikealla reverse mapping [18,19]
On olemassa kuitenkin kaksi tilannetta, jotka vaikeuttavat edellä kuvattuja
sijoitusprosesseja. Ensimmäinen on se, että lopullinen kuva on suurempi kuin
alkuperäinen. Tällöin koordinaatit eivät välttämättä kuulu alkuperäisen kuvan
pikselikoordinaatistoon. Tämä edellyttää jonkinlaista interpolaatiota, jossa lasketaan
kyseiseen koordinaattiin pikseliarvo. Toinen tilanne on se, missä lopullinen kuva on
pienempi kuin alkuperäinen. Tämä tarkoittaa sitä, että alkuperäisessä kuvassa on liiaksi
dataa, eli kaikkia pikseliarvoja ei voida sijoittaa loppukuvaan. Tätä varten tarvitaan
ekstrapolaatiomenetelmiä, joilla pystytään säilyttämään alkuperäisen kuvan sisältö.
Tämä kuitenkin johtaa siihen, että loppukuvassa on vähemmän tietoa, jolloin
kasvatettaessa loppukuvaa suuremmaksi, ei päästä alkuperäisen kuvan laatutasoon. [20]
Jotta voimme paremmin ymmärtää digitaalikuvan muokkaamisen, digitaalikuva täytyy
pystyä esittämään matemaattisessa muodossa. Alla on digitaalikuvan matemaattinen
esitys, jolla voidaan muokata alkuperäistä kuvaa.
1 = 1 ∗ = 1 ∗ ,
= + = + !
13
Tässä [ v w 1 ] viittaa alkuperäiseen kuvaan ja T on transformaatiomatriisi, joka on
alkuperäisen ja lopullisen kuvan geometrinen muutos. Transformaatiomatriisi voidaan
käsittää koostuvan neljästä eri osasta. 2x2-kokoinen matriisi
"
#,
vastaa lineaarisesta muutoksesta rotaatiolle, skaalaukselle sekä horisontaaliselle että
vertikaaliselle kiertämiselle. Matriisilla [ ] voidaan siirtää kuvaa origon suhteen,
matriisi $ tuottaa perspektiivisen muutoksen ja vaikuttaa kuvan
skaalaukseen. [4,18,19]
Liitteissä 1 ja 2 on esitetty eri ohjelmointiympäristöihin soveltuvat ohjelmat, joilla
voidaan demonstroida seuraavia geometrisia operaatioita.
3.2.1.1
Siirto
Siirrossa jokainen kuvan pikseli siirretään uuteen positioon lopulliseen kuvaan.
Transformaatiomatriisi on muuten yksikkömatriisi, mutta alimatriisilla [ ]
pystytään parametrisoimaan kuvan siirto origon suhteen.
Kuva 8 siirto-operaation lopputulos
1
0
0
1
!
0
0 ,
1
= + = + !
Yllä olevan kuvan koko on 461x461, eli kuvassa on 461 pikseliä sekä leveys- että
korkeussuuntaan. Siirtomatriisissa käytetyt ja ! ovat 100.
3.2.1.2
Rotaatio
Rotaatiossa kaikki kuvan xy-pikselit siirretään origon suhteen kulman % verran. Monet
rotaatiofunktiot poikkeavat toisistaan siinä mitä pistettä kuvasta käytetään origona.
14
cos %
− sin %
0
sin %
cos %
0
0
= v ∗ cos % − ∗ sin %
0 , = ∗ sin % + ∗ sin %
1
Kuva 9 rotaatio-operaation lopputulos
3.2.1.3
Skaalaus
Tämä tarkoittaa, että jokainen pikseli skaalataan matriisista löytyvillä kertoimilla ja
! . Näinollen, kuvan kokoa muokataan kertoimien mukaan. Negatiivisilla kertoimilla
kuva voidaan peilata sekä samalla skaalataan kuvan kokoa pienemmäksi.
Kuva 10 skaalauksen jälkeinen lopputulos: ! = -1
0
0
0
!
0
0
0
1
,
= ∗ -
= ∗ !
Jos kertoimet ja ! eivät ole samansuuruisia, niin kuvan mittasuhteet muuttuvat
samassa suhteessa
3.2.1.4
Horisontaalinen/vertikaalinen kiertäminen
Koordinaatiston skaalaaminen rajoittui edellä ainoastaan diagonaalisiin termeihin ja
.
Sekä
horisontaalisesessa
että
vertikaalisessa
kiertämisessä
samat
diagonaalimuuttujat pysyvät vakiona = = 1. Sallimalla :n ja :n olla nollaarvosta poikkeavia, pystytään kuvaa kiertämään siten, että esimerkiksi x-arvot voidaan
asettaa olemaan lineaarisesti riippuvaisia v- sekä w-arvoista, kun y-arvo pysyy
identtisenä w-arvoon.
15
Kuva 11 kierto-operaation lopputulos
1
/
0
.
1
0
0
0 ,
1
= + ∗ - = ∗ / + .
Yllä oleva kuva on saatu käyttämällä siirtomatriisissa arvoja 0 ja 1.
[4]
3.2.2
Kuvan gradientti
Kuvan gradientti ilmaisee valon intensiteetin tai värin muutosta kuvassa. Gradienttien
avulla saadaan tietoa kuvassa esiintyvistä objekteista. Etenkin gradienttien avulla
pystytään määrittelemään kuvassa esiintyvien reunojen sijainti ja suunta.
Matemaattisesti gradientti esitetään seuraavan laisesti:
2 2
, 2 2
2
013 = , 0
2
2
014 = 0, 2
01 = ja edelleen gradientin suunta saadaan
2
2
5 = arctan 92 2
Digitaalikuva F[x,y] derivoidaan diskreetisti, ottaen äärellinen erotus
2
2
, ≈ ; + 1, − ;, Gradienteilla voidaan erottaa kuvasta erilaista tietoa. Gradienttikuvat muodostetaan
ottamalla jokaisesta alkuperäisen kuvan pikselin ympäristöstä gradientin
approksimaatio, tyypillisesti jollakin matriisifiltterillä. Yksinkertaisin näistä
suodattimista on Sobelin operaattori. Tyypillisemmin gradientteja käytetään reunojen
16
etsimiseen kuvasta. Kun jokaiselle kuvan pikselille on laskettu gradienttiarvot, näistä
suurimmat arvot omaavat gradientit edustavat mahdollisia reunoja kuvasta.
[5]
3.2.3
Kuvassa esiintyvät reunat
Reunat ovat suuria lokaaleja muutoksia kuvassa, mitkä esiintyvät kahden eri alueen
yhdistymäkohdassa. Tärkeät ominaisuudet pystytään erottamaan kuvasta reunojen
perusteella, esimerkiksi kulmat, suorat ja käyrät viivat. Näitä tietoja voidaan käyttää
korkean tason konenäköalgoritmeissa, esimerkiksi objektin tunnistamisessa. [6,8]
Reunan tunnistaminen tarkoittaa suuren epäjatkuvuuskohdan tunnistamista ja
paikantamista
kuvasta.
Epäjatkuvuuskohdat
ovat
äkillisiä
pikselin
intensiteettimuutoksia, jotka voidaan karakterisoida objektin reunaksi. Klassisimmat
reunantunnistusmetodit käsittelevät kuvaa 2D-suodattimella, joka on rakennettu
olemaan herkkä suurille gradienteille ja suodattamaan tasaiset alueet kuvasta. Tämän
tyylisiä algoritmeja on olemassa lukuisia ja jokainen näistä on viritetty olemaan herkkä
tietyn tyyppisille reunoille, esimerkiksi kulmille tai suorille reunoille.
Reunantunnistusoperaattorin geometrian perusteella karakterisoidaan suunta, jolle
operaattori on herkin. Operaattorit voidaan optimoida tarkastelemaan horisontaalisia,
vertikaalisia tai diagonaalisia reunoja. Reunan tunnistaminen on haastavaa kohinaisista
kuvista, koska sekä kohina että reunat sisältävät suuria pikseli-intensiteettimuutoksia.
Kohinaa voidaan tietysti suodattaa pois kuvasta, mutta tämä johtaa silloin siihen, että
kuvassa ilmenevät reunatkin sumentuvat ja vääristyvät. Suodattimet, joita käytetään
kohinaisissa kuvissa, ovat tyypillisesti suurempia, jotta ne pystyvät keräämään tarpeeksi
dataa erottaakseen kohinan aiheuttamat pikseliarvot. Tämä johtaa vähemmän tarkkaan
reunan paikallistamiseen. Kaikki reunat eivät välttämättä edes koostu askelmaisista
arvoaluemuutoksista intensiteettitasossa. Valon taittuminen tai kameran huono
tarkennus voi aiheuttaa sen, että objektien reunat voivat muuttua astemaisesti
intensiteettitasossa eivätkä äkillisesti suurina askelmina. Eli ongelmia reunojen
tunnistamisessa on: kohinan aiheuttamat häiriöt, todellisten reunojen havaitsematta
jättäminen, reunan paikallistaminen ja korkeat prosessointiajat tunnistamisessa. [1,7,8]
On olemassa monta eri tapaa kuinka reunat tunnistetaan. Suosituimmat
reunantunnistusmenetelmät ovat gradientti ja Laplacian. Gradienttimenetelmässä reunat
tunnistetaan etsimällä maksimi- ja minimiarvot kuvan ensimmäisen derivaatan avulla.
Laplacian-menetelmässä etsitään kuvasta otetun toisen derivaatan nollakohtaylitykset,
jonka perusteella voidaan todeta reunan olemassaolo. Digitaalisista kuvista reunan
tunnistaminen pystytään tekemään soveltamalla erilaisia suodatinmatriiseja kuvan
jokaisen pikselin ympäristölle. Suodatinmatriisit approksimoivat kuvalle derivaatan
arvoja, jolloin näiden perusteella voidaan todeta reunoihin liittyviä tietoja.
Approksimaatio saadaan seuraavanlaisesti:
17
1.
2.
3.
4.
Käydään kuvan jokaisen pikselin ympäristö läpi
Ympäristön laajuuden määrittää suodatinmatriisin dimensio
Suoritetaan pistetulo jokaiselle ympäristön pikselille suodatinmatriisin kanssa
Summataan pistetulon lopputulokset, jolloin saadaan approksimaatio pisteen
derivaatasta
5. Sijoitetaan saatu approksimaatio ulostulokuvaan alkuperäisen pikselin kohdalle
Kuva 12 Suodatinmatriisien derivaattaiaproksimaatiot
Yllä oleva algoritmi on toteutettu liitteessä 3 olevassa ohjelmassa. Ohjelman ulostulo on
nähtävissä kuvassa, johon on piirretty eri suodatinmatriisien palauttamat derivaatan
approksimaatiot. [1,6]
3.2.3.1
Gradienttimenetelmät
Robertin ristioperaatio on yksinkertaisin reunantunnistusoperaattori, jossa on kaksi 2x2
matriisifiltteriä x- ja y-suunnalle.
"
+1
0
0
#
−1
"
0
−1
+1
#
0
Yksinkertaisuutensa takia Robertin ristioperaatio on myös nopea laskettava. Robertin
ristioperaation ulostulo kuvastaa gradientin suuruuden arviota kuvan jokaisessa
pisteessä.
Sobel- sekä Prewitt-operaattorit koostuvat molemmat kahdesta 3x3 matriisifiltteristä.
Toinen filtteri on yksinkertaisesti käännetty 90 asteella. Se on muuten samanlainen kuin
Robertin ristioperaatio, mutta suodatinmatriisit ovat hieman suurempia ja arvot ovat
erisuuret.
18
−1
−2
−1
0
0
0
+1
+2
+1
+1
0
−1
+2 +1
0
0
−2 −1
−1
−1
−1
0
0
0
+1
+1
+1
+1
0
−1
+1 +1
0
0
−1 −1
Nämä matriisit on suunniteltu löytämään horisontaalisia ja vertikaalisia reunoja.
Matriiseja voidaan soveltaa kuvaan erikseen, jotta saadaan erilliset reunahavainnot
gradienttikomponenteista. Nämä reunahavainnot voidaan sitten yhdistää ja laskea
yhdistettyjen gradienttien suuruus kaavalla 2.
|> | = ?>
+ >! (2)
[1,5,7]
3.2.3.2
Laplacian-menetelmät
Gaussin Laplacian-menetelmä (Laplacian of Gaussian, LOG) laskee toisen asteen
derivaatan kuvalle. Menetelmä korostaa alueita, joissa intensiteettimuutos on suuri ja
tämän takia sitä käytetään reunantunnistuksessa. Laplacian-menetelmä on hyvin herkkä
kohinalle. Tämän takia menetelmää käytetään yleensä kohinasuodatettuun kuvaan.
Kohinasuodatuksessa käytetään tyypillisesti Gaussianin kohinasuodatinta.
Kuvan pikseli-intensiteettejä kuvataan funktiolla I(x,y), jolloin Laplacian L(x,y)
funktiolle on seuraava:
ABC
@, = A
B
ABC
+ A! B
(3)
Koska sisääntulokuva koostuu yksittäisistä pikseleistä, operaattorille täytyy löytää
matriisifiltteri, joka pystyy approksimoimaan toisen asteen derivaattaa, joka on
Laplacian-menetelmän määrittelyssä. Alla esitellään yksi yleisimmin käytetyistä
matriisifilttereistä.
−1
2
−1
2
8
2
−1
2
−1
Koska kyseinen konvoluutio-operaatio on assosiatiivinen, matriisifiltterin sekä Gaussin
kohinasuodattimen tulo voidaan laskea ensiksi ja tämän jälkeen tätä tulomatriisia
voidaan soveltaa alkuperäiselle kuvalle. Kyseinen optimointi vähentää huomattavasti
aritmeettisten operaatioiden suoritusten lukumäärää verrattuna filttereiden erilliseen
suorittamiseen kuvalle. [6]
19
@E> , = −
0
1
0
1
−4
1
"1 −
FG H
B I! B
G B
#J
K
LB MNB
BOB
(4)
0
1
0
Canny-algoritmi tunnetaan parhaiten optimaalisimpana reunantunnistusalgoritmina. Sen
kehitti John F. Canny vuonna 1986. Algoritmi pystyy tunnistamaan monenlaisia reunoja
kuvista. Cannyn ajatuksena oli kehittää olemassa olevia reunantunnistusmetodeja ja
aiheesta voi lukea lisää hänen tutkielmastaan: ”A Computational Approach to Edge
Detection” [3]. Tutkielmassaan hän listasi aiheita, joita tuli kehittää olemassa olevissa
algoritmeissa. Ensisijaisesti hän pyrki saavuttamaan alhaista virhesuhdetta
tunnistamisessa. Tämän hän aloitti minimoimalla olemattomien reunojen tunnistamisen
sekä maksimoimalla todellisten reunojen tunnistamisen. Toinen asia, jota hän pyrki
kehittämään oli reunan pikselipisteiden lokalisointi. Tunnistettujen pisteiden ja kuvassa
esiintyvän reunan etäisyys tuli olla minimissään. Kolmas asia oli saavuttaa yksi
tunnistettu reuna vastaamaan yhtä kuvassa esiintyvää reunaa. Tämä oli oleellista, koska
kaksi ensimmäistä aihetta, joita hän pyrki saavuttamaan, eivät ottaneet kantaa tähän
kolmanteen ongelmaan. [3,5,7]
20
4
VANHA JÄRJESTELMÄ
Muutama vuosi sitten Jomet Oy:ssä päätettiin panostaa pakkauskoneen
videovalvontajärjestelmään. Tämän ideana oli parantaa koneen virhediagnostiikkaa ja
helpottaa virheiden alkuperän löytämistä. Järjestelmän toimintaperiaate on hyvin
yksinkertainen: tietokone pitää tallessa 30 minuutin videohistoriaa pakkauskoneen
toiminnasta. Virhetilanteen sattuessa, kymmenen viimeisintä minuuttia kopioidaan
puskurista pysyvään muistiin.
4.1
Virheiden havaitseminen
Tällä hetkellä virheiden havaitseminen on toteutettu logiikkayksikön toimesta.
Pakkauskoneessa on tyypillisesti venttiili- ja moottoriliikkeitä. Virhetilanteet havaitaan
molemmista liikkeistä eri tavalla. Venttiililiikkeeltä löytyy tyypillisesti liikkeen etusekä takaraja. Kun PLC ohjaa venttiiliä eteen, niin eturajan on tultava päälle tietyn ajan
kuluessa, muuten PLC tulkitsee venttiililiikkeen suorituksen epäonnistuneeksi eli
virheeksi. Moottoriliikkeiden virheiden havaitseminen tapahtuu moottorin
taajuusmuuttajassa, jos kyseessä on servomoottori, niin servo-ohjaimessa. Logiikka,
taajuusmuuntaja ja servo-ohjain on kytketty toisiinsa Ethercat-kaapelilla, jolla välitetään
moottoreiden virhetiedot logiikkayksikölle.
4.2
Kommunikaatio
Fyysinen yhteys PLC:n ja kamerajärjestelmän välillä on toteutettu Ethernet-kaapelilla.
Kamerajärjestelmä luo sisäisen palvelimen, johon PLC voi luoda asiakaspohjaisen
yhteyden. Yhteyden avulla välitetään tietoa pakkauskoneessa tapahtuvista virheistä
kamerajärjestelmälle.
4.3
Reagointi virheeseen
Virhetilanteen tapahtuessa, kamerajärjestelmä vastaanottaa sitä vastaavan viestin
palvelinohjelmassaan. Viestin vastaanottaminen signaloi videoita nauhoittavalle
ohjelmalle, että videoiden tallentaminen tiedostoihin voidaan lopettaa 10 s kuluttua.
Tällä toiminnolla pyritään varmistamaan, että virhetilanteen mahdolliset seuraukset
tulisivat myös videolle, jos jotakin vakavaa tapahtuisi. Ohjelma, joka luo videotiedoston
kameralta tulevasta virrasta, tallentaa 30 minuutin jatkuvaa videotiedostoa eräänlaiseen
rengaspuskuriin. Tämän ideana on, että 30 minuutin jälkeen tallennuksen aloituksesta
vanhin videomateriaali korvataan uudemmalla. Tällöin videotiedosto
21
sisältää ainoastaan 30 viimeisintä minuuttia.
4.3.1
Tiedon siirtäminen pilvipalveluun
Pilvipalveluna kamerajärjestelmässä käytetään Google Drive-palvelua. Google Datakirjasto sisältää Googlen kehittämän protokollan, jolla pystytään lukemaan ja
kirjoittamaan dataa Googlen palvelimille. Kirjastoa pystyy käyttämään seuraavilla
kielillä:
•
•
•
•
•
•
Java
Javascript
.NET:n tukemat kielet
PHP
Python
Objective-C
Järjestelmässä käytetään Google Data Python Client-kirjastoa. Jokainen kirjasto tarjoaa
kuitenkin samanlaiset mahdollisuudet käyttää Googlen palveluita. Kirjastot ovat myös
avointa lähdekoodia.
[16]
22
5
TOTEUTUS
Alkuperäinen järjestelmä on vastaanotettu varsin hyvin eri asiakkailla ja he ovat olleet
tyytyväisiä ripeään virheiden diagnosointiin ja niiden poistamiseen. Näiden
innoittamana järjestelmää halutaan kehittää eteenpäin. Ensimmäinen kehityskohde on
järjestelmän suorittaminen kevyemmällä alustalla kuin tehokkaalla pöytäkoneella.
Toinen fokus on kehittää järjestelmää olemaan interaktiivinen PLC:n kanssa.
Työn teknisenä kontribuutiona tutkittiin kuinka pienellä alustalla vanhaa järjestelmää
voidaan suorittaa sekä toteutettiin yksinkertainen konenäön opetussovellus.
Opetussovelluksen toteutuksen tarkoituksena oli myös tutkia, minkälaisia
mahdollisuuksia konenäkösovellukset voivat antaa ja kuinka paljon työtä ja vaivaa ne
mahdollisesti vaativat.
5.1
Kevyet kehitysalustat
Tämän päivän markkinoilla jatkuvan kasvun prosessoreiden suorituskyvyissä sekä
näiden laskevan hintatason johdosta sovelluskehittäjät voivat suunnitella erittäin
kehittyneitä ratkaisuja erilaisiin sovelluksiin. Samalla kun sovellukset kehittyvät,
suunnitelmat monimutkaistuvat ja nämä ongelmat voivat aiheuttaa pullonkauloja
kehittäjille. Pullonkaulat ilmenevät tyypillisesti pidempinä kehitysaikoina, yhä
monimutkaisempina kehitysympäristöinä ja sovellusten laadun ja vakauden ongelmina.
Kehittäjät voivat käsitellä näitä ongelmia käyttämällä kehittyneitä kirjastoja, kuten
OpenCV. Siirrettäessä sovellusta sulautettuun alustaan, mukana tulee ryhmä uusia
haasteita, muun muassa: C++-koodin toteuttaminen, muistin asettamat rajoitteet,
liukulukulaskenta sekä alustan laitteiston 100 % hyödyntäminen.
Konenäkösovellusten jatkuva lisääntyminen asettaa ristiriitaisia vaatimuksia
sulautetuiden alustojen kehittäjille. Kehittyneet konenäköalgoritmit vaativat yhä
enemmän muistia ja prosessointitehoa, mutta järjestelmien hintojen ja tehonkulutuksen
pitää olla mahdollisimman alhaiset.
Yksi tyypillisimpiä teollisuuden konenäkötehtäviä on tuotantolinjan tarkastelu, joka
havaitsee, luokittelee ja suodattaa objekteja maksimoidakseen tuotannon nopeutta ja
laatua. Tyypillisesti konenäköalgoritmit suoritetaan kalliilla ja tehokkailla tietokoneilla.
Videovalvontasovellukset tarjoavat toisen näkökulman konenäön kehitykseen.
Tavanomaisimmat valvontajärjestelmät eivät ole kiinnostuneita kuvan analyysistä, vaan
23
ne on suunniteltu enimmäkseen koodaamaan ja tallentamaan videovirtaa. Joka
tapauksessa, konenäköalgoritmit kehittyvät ja videovalvontaan yhdistetään yhä
enemmän automatisoitua monitorointia ja analysointia tallennettuun videoon.
Algoritmien kehittyessä luotettavammiksi ja nopeammiksi, valvontajärjestelmät tulevat
automaattisemmiksi ja kehittyneemmiksi. Tämä asettaa tietynlaisen haasteen
sulautetulle videovalvontajärjestelmälle. Koska tuoreimmat algoritmit on kehitetty
tehokkaille tietokoneille, huomattavaa lisätyötä ja optimointia voidaan vaatia, jotta
sovellus toimii tehokkaasti sulautetulla laitteella. Näinollen, monet sulautetut
kamerajärjestelmät pysyttäytyvät yksinkertaisemmassa ’koodaa ja tallenna’-mallissa.
Prosessorin arkkitehtuurin lisäksi muistin asettamat rajoitteet ja erityiset vaatimukset
deterministiselle ja reaaliaikaiselle toiminnalle aiheuttavat haasteita sulautetun
järjestelmän suunnittelulle. Moniytimiset laitteet alkavat olla aiempaa yleisempiä
sulautetuissa laitteissa. Sulautetut moniydinlaitteet saattavat koostua homogeenisistä
ytimistä, esimerkiksi dual-ARM-laitteet. Ne voivat myös yhdistää ARM-prosessorin
heterogeenisen ytimen kanssa, esimerkiksi DSP:n tai GPU:n. Monet OpenCV-kirjaston
funktioista hyötyvät paljon, kun käytetään erikoisprosessointiytimiä, vektori- tai
liukulukukiihdyttimiä.
Algoritmi, jota voidaan helposti ajaa rinnakkaisesti, voi olla hyvä ajettavaksi GPU:lla.
Konenäkö- ja kuvankäsittelyalgoritmit, joita ei pysty suorittamaan rinnakkaisesti, mutta
jotka silti vaativat intensiivistä liukulukulaskentaa, saattavat sopeutua paremmin DSPyksikölle. Matalan tason kuvankäsittelyfunktiot, esimerkiksi väriavaruuden vaihtaminen
ja kohinan suodattaminen soveltuvat tyypillisesti suoritettavaksi komponentilla, joka on
suunniteltu vain yhtä toimintoa varten, esimerkiksi FPGA:lla (Field Programmable
Gate Array) tai ASIC-piirillä (Application Specific Integrated Circuit). Sulautetut
laitteet, jotka sallivat sovelluskehittäjän jakaa tehokkaasti sovelluksen (esimerkiksi
OpenCV-sovellus) suorituksen
heterogeenisten
komponenteille,
saavuttavat
ylivoimaisen suorituskyvyn. [13]
Jaetun muistin tehokas käyttäminen ja jakaminen ovat yksi sulautetun järjestelmän
kehityksen haasteista. Monet nykypäivän sovelluksista vaativat kokonaisen
käyttöjärjestelmän, jolla on oma jalanjälki muistissa. Tämän takia muistinhallinnasta
tulee vieläkin tärkeämpää. Sulautettu konenäkösovellus, joka käyttää OpenCV-kirjastoa,
vaatii kohtuullisen suuren muistin riittävän suurella kaistanleveydellä ja hakuajalla.
Tämä siksi, jotta voidaan tarjota puskurit ja ohjelman data useille toisiinsa liittyville
tehtäville: datan hankkiminen, prosessointi ja tallentaminen tai ulostulon esittäminen.
Sulautetut moniydinprosessorit tarjoavat paremman suorituskyvyn kasvattamalla
prosessointitehoa, joka on sovellusten käytettävissä. Suurimmat haasteet tulevat
vastaan, kun kehittäjät haluavat hyväksikäyttää tuota prosessointitehoa kiihdyttääkseen
OpenCV:n suoritusta. Suurin haaste, kun siirrytään moniydinmalliin, on ohjelman
24
kokonaisuuden jakaminen osiin ja suorituksen jakaminen eri ytimille.
Yksinkertaisimmassa tapauksessa järjestelmä koostuu kahdesta ARM-ytimestä. Tällöin
ongelman lähestymistapana on kirjoittaa sovellus aivan kuin yksiytimiselle alustalle ja
sitten jakaa sovelluksen osia suoritettavaksi toiselle ytimelle. Oleellinen kriteeri
tehtävän suorittamisen siirtämisessä ytimeltä toiselle on prosessoreiden välisen
kommunikaation (Inter-Processor Communication, IPC) ajan kulutus. Suorituksen
jakaminen toiselle ytimelle on ainoastaan mielekästä, jos IPC-viestien lähettämiseen ja
vastaanottamiseen kuluva aika ei ylitä aikaa, joka on säästetty, kun prosessointikuorma
on jaettu kyseiselle ytimelle.
Monisäikeiset sovellukset vaativat erityistä käsittelyä, jotta tehtäviä jaetaan ytimille
oikein ja tehokkaasti. Rinnakkaisuuden tuoma suorituskyvyn parannus useissa
konenäköalgoritmeissa on rajoitettu, koska tyypillisesti algoritmeja suoritetaan
sarjallisesti, eli seuraavaa operaatiota ei voida aloittaa ennen kuin edellinen operaatio on
valmistunut. [13]
5.2
Vanhan järjestelmän kehittäminen
Ohjelmiston vaatimusmäärittelyssä kuvataan ohjelmiston tavoitteet ja vaatimukset.
Tässä kuvataan kuinka ohjelmiston tulisi toimia ja kuinka nämä toiminnallisuudet
yleisellä tasolla saavutetaan.
5.2.1
Vaatimukset
1. Yleiset vaatimukset
1.1 Sovelluksen pitää olla helppokäyttöinen
1.2 Sovelluksen täytyy olla yhteensopiva edeltävän järjestelmän kanssa
1.3 Käyttöönotto ei vaadi erillistä koulutusta
1.4 Sovelluksessa pitää olla eri käyttäjätasoja
2. Kamerajärjestelmän vaatimukset
2.1 Sovellukseen pitää pystyä luomaan tarkistustoimintoja
2.2 Tarkistustoimintoja pitää pystyä tallentamaan
2.3 Sovelluksen pitää pystyä hallitsemaan useita tarkistustoimintoja
2.4 Järjestelmästä pitää löytyä eri toimintatilat
2.5 Järjestelmän pitää pystyä välittämään binääritiedolla tarkistustomintojen
suorituksen totuusarvon
3. Työkalun vaatimukset
3.1 Seuraavien ominaisuuksien pitää olla tuettuja
3.1.1 Värin erottaminen kuvasta
3.1.2 Käyttäjän määrittämä alueopetus
3.1.3 Automaattinen alueopetus
3.1.4 Viivakoodi
4. Kommunikaation vaatimukset
25
4.1 Kommunikointi voidaan toteuttaa asiakas- tai palvelinsovelluksena
4.1.1 Portti pitää pystyä määrittämään erikseen
4.1.2 Asiakas-vaihtoehdossa, IP-osoite pitää pystyä määrittämään
5.2.2
Käyttötapaukset
Sovelluksen käyttäminen on jaettu ainoastaan yhdelle käyttäjäryhmälle. Käyttäjä pystyy
tekemään järjestelmän konfiguroinnin, kun hän on kirjautunut onnistuneesti
järjestelmään. Kuvassa 13 on esitelty vaatimusten perusteella tehty käyttötapauskaavio.
Kaaviossa on esitelty neljä erillistä päätapausta, jotka kaikki vaativat
käyttäjähallintatapahtuman onnistuneen suorituksen.
Kuva 13 kamerajärjestelmän käyttötapauskaavio
Järjestelmän tilan vaihtaminen
Sovellus sisältää kolme erilaista tilaa: Overview, Teach ja Run. Overview-tilalla
mallinnetaan sovelluksen joutokäyntiä, eli sovellusta suoritetaan kevyellä kuormalla.
Teach-tilassa käyttäjällä on mahdollisuus opettaa uusia työkaluja järjestelmään. Runtilassa sovelluksen suorituskuorma on suurin, sovellus käyttää aktivoituja työkaluja
kuvankäsittelyprosesseissaan ja generoi näiden avulla lopputuloksen.
26
Oletuksena järjestelmä on Overview-tilassa. Jos käyttäjä on onnistuneesti kirjautunut
järjestelmään, hän voi asettaa haluamansa tilan ”Operation mode”-pudotusvalikosta,
kun hän haluaa aktivoida kyseisen tilan käyttöönsä, hän painaa ”Change mode”näppäintä.
Onnistuminen:
Käyttäjä pystyy vaihtamaan onnistuneesti järjestelmän tilan.
Virhetilanteet:
Mikäli käyttäjä ei ole kirjautuneena sisään, niin ”Change mode”-näppäin ei ole
aktivoituna, eikä käyttäjän painalluksiin reagoida.
Jos käyttäjä yrittää vaihtaa tilan samaksi, jossa järjestelmä jo on, niin ”Change mode”näppäimen painalluksiin ei reagoida.
Menu-toimnnot
Sovelluksessa on menu-navigointi-ikkuna, joka sisältää Open-, Save- ja Exit-toiminnot.
Navigointi-ikkuna sijaitsee sovelluksen vasemmassa yläosassa. Painamalla ”File”välilehteä avautuu valikko, jossa on kyseiset vaihtoehdot. Open-toiminto avaa
tiedostodialogin, johon käyttäjä voi syöttää olemassa olevaa työkalua vastaavan
tiedoston. Save-toiminnolla pystytään tallentamaan opetuksessa oleva työkalu
tiedostomuotoon. Exit-toiminto lopettaa sovelluksen toiminnan.
Painamalla vaihtoehtoa ”File Save” avautuu tiedostodialogi tallennusta varten.
Käyttäjä pystyy navigoimaan itsensä haluamaansa polkuun sekä antamaan työkalulle
haluamansa nimen. Vaihtoehdossa ”File Exit”, graafinen käyttöliittymä suljetaan ja
sovellus suorittaa tarvittavat puhdistustoimenpiteet taustalla.
Onnistuminen:
Käyttäjä avaa onnistuneesti olemassa olevan työkalun muokattavaksi.
Käyttäjä tallentaa onnistuneesti opetuksessa olevan työkalun tiedostomuotoon.
Käyttäjä lopettaa sovelluksen toiminnan onnistuneesti.
Virhetilanteet:
Mikäli käyttäjä ei ole kirjautuneena sisään, niin vaihtoehdot Open ja Save eivät ole
aktivoituna, eikä käyttäjän painalluksiin reagoida.
Käyttäjän syöttäessä virheellisiä nimiä tiedostodialogiin, niin niihin reagoidaan
virheilmoituksella, joka ilmestyy näytölle: ”Name error!”.
27
Jos käyttäjällä on keskeneräinen työkalu suljettaessa käyttöliittymää, näytölle avautuu
kyselyikkuna: ”Do you want to save changes you made to unnamed.tool?”.
Työkalun opettaminen
Ohjelmasta löytyy kaksi erilaista tilaa opetusta varten. On mahdollisuus opettaa offlinetilassa tai reaaliaikaisesta videovirrasta. Offline-tila tarkoittaa, että koneen toimintaa on
tallennettu videotiedostoon ja opetusprosessi tehdään tälle videotiedostolle.
Tällä hetkellä opetettaviksi ominaisuuksiksi on määritelty väri, alue, automaatti ja
viivakoodi. Väriominaisuudella pystytään erottamaan tietty RGB-arvoväli kuvasta
minimi- ja maksimiarvojen avulla, jolloin lopputuloksena on binäärikuva, jossa on
valkoisella kaikki pikselit, jotka sopivat määriteltyyn arvoväliin. Alueominaisuudella,
käyttäjä voi määrittää itse alueen, jossa liikettä saa tapahtua. Pikselien suuret
arvomuutokset
saavat
tapahtua
ainoastaan
edellämainitulla
alueella.
Automaattiominaisuus
rajaa
alueen,
joka
muuttuu
opetuksen
aikana.
Viivakoodiominaisuus vaatii käyttäjää rajaamaan alueen, josta yritetään selvittää
viivakoodin sisältö.
Työkalua ei ole pakko tallentaa, mutta jos halutaan käyttää lukuisia työkaluja, niin ne
pitää tallentaa erillisiksi tiedostoiksi. Jos käytössä on ainoastaan yksi työkalu, niin
tallennusta ei vaadita. Siirryttäessä Run-tilaan ja jos työkalu on opetettu, niin se otetaan
automaattisesti käyttöön, ellei järjestelmälle ole opetettu jo jotakin muuta työkalua.
Onnistuminen:
Käyttäjä onnistuu opettamaan uuden työkalun.
Virhetilanteet:
Mikäli käyttäjä ei ole kirjautuneena sisään, opetustyökalut eivät ole aktivoituna, eikä
käyttäjän painalluksiin reagoida.
Kommunikointiasetusten vaihtaminen
Kommunikointia varten sovellukseen on lisätty vaihtoehdot asiakkaan ja palvelimen
välille. Asiakas-mallissa asiakas luonnollisesti ottaa yhteyden palvelimeen, jolloin
tarvitsee tietää IP-osoite, porttinumero ja verkkomaski. Palvelimella määritetään
ainoastaan porttinumero, jonka läpi asiakkaat voivat muodostaa yhteyden.
Onnistuminen:
Käyttäjä pystyy asettamaan onnistuneesti järjestelmän kommunikointiasetukset.
28
Virhetilanteet:
Mikäli käyttäjä ei ole kirjautuneena sisään, niin kommunikointiasetukset eivät ole
aktivoituna, eikä käyttäjän painalluksiin reagoida.
Jos käyttäjä syöttää viallisia arvoja asetuksiin, niistä ilmaistaan virheilmoituksella:
”Error: Invalid parameters!”.
Käyttäjähallinta login/logout
Sovellus vaatii, että suoritetaan kirjautuminen. Kirjautumisen avulla voidaan varmentaa,
että sovelluksen avulla tehtävät muutokset ovat oikean henkilön tekemiä. Kuvassa x
esitetään näkymä, johon syötetään käyttäjänimi sekä salasana.
Kuva 14 JometCV-sovelluksen kirjautumisdialogi
Jos kirjautuminen keskeytetään Abort-näppäimellä tai kirjautuminen epäonnistuu jonkin
muun syyn takia, suurin osa sovelluksen käyttöliittymäkomponenteista ei aktivoidu.
Kirjautumisen dialogi on mahdollista saada jälleen esiin Help-valikosta. Painamalla
sovellusikkunan yläreunasta olevaa Help-valikkoa avautuu valikko, jossa on Contents,
About ja Login. Painamalla ”Help Login”, avautuu sama näkymä kuin kuvassa 14.
Onnistuminen:
Käyttäjä kirjautuu onnistuneesti järjestelmään sisään.
Virhetilanteet:
Mikäli käyttäjätunnus tai salasana on virheellinen, niin näytölle ilmestyy virheilmoitus:
”Username doesn’t exist!” tai ”Username or password was incorrect!”.
5.2.3
5.2.3.1
Käytetyt kirjastot
Qt
Qt on poikkialustainen kehityskehys, joka on kirjoitettu C++-kielellä. Alun perin se
suunniteltiin käyttöliittymäohjelmointia varten, mutta nyt sen avulla pystytään tekemään
paljon muutakin:
29
•
•
•
•
•
•
•
Tietokannat
XML
WebKit
Multimedia
Verkottuminen
OpenGL
Konsolisovellukset
Qt koostuu moduuleista, joilla jokaisella on samanlainen API (Application
Programming Interface). Qt laajentaa C++-kieltä makroilla ja introspektiolla.
Lopullinen Qt-sovellus on kuitenkin aina muutettu C++-kielelle. Tarkoituksena on
kääntää yhdestä lähdekoodista alustariippumaton loppusovellus. Tämän avulla
pystytään rakentamaan natiiveja sovelluksia, joilla on natiivi ulkonäkö sekä tuntuma.
Kohdealustat:
•
•
•
•
•
•
•
Windows
Mac OS X
Linux/UNIX X11
Windows CE
Symbian
Maemo
Sulautettu Linux
QtObject-luokka on käytännössä jokaisen Qt-luokan ja –widgetin kantaluokka.
QtObject-luokka sisältää suurimman osan mekanismeista, jotka tekevät Qt:n
(tapahtumat, signaalit ja slotit, ominaisuudet sekä muistinhallinnan). Lisäksi QtObjectluokasta periytyneiden luokkien instanssit sisältävät metaolion. Kyseinen metaolio
tietää luokkansa nimen, periytymissuhteensa, ominaisuutensa, signaalit ja slottinsa sekä
yleisen informaation luokastaan. Metaolio luodaan käännösvaiheessa, jonka suorittaa
Qt:n MOC (Meta Object Compiler). MOC hakee tietoja *.h-tiedostoista ja luo niiden
avulla moc_*.cpp-tiedostoja, jotka käännetään lopuksi *.cpp- ja *.h-tiedostojen lisäksi
objektikoodiksi.
Signaalit ja slotit ovat Qt:n oma dynaaminen ja kevyehkö tapa sitoa tapahtumia ja tilan
muutoksia reaktioilla. Muut ympäristöt tarjoavat normaalisti callback-toiminnon, jolla
reagoidaan samalla tapaa tapahtumiin ja tilan muutoksiin. Callback on funktio-osoitin,
jota kutsutaan kun tapahtuma tapahtuu. Mikä tahansa funktio voidaan asettaa callbackfunktioksi. Callback-funktiot eivät kuitenkaan tarjoa minkäänlaista tyyppiturvallisuutta
ja toimivat aina suorana funktiokutsuna. Signaalit ja slotit tarjoavat kuitenkin
huomattavasti dynaamisemman ja geneerisemmän ratkaisun callback-funktioihin
30
verrattuna. Näiden avulla kahden eri luokan toimintojen yhdistäminen on huomattavasti
helpompaa kuin callback-funktioilla.
Signaalit määritellään C++-koodissa Qt:n oman varatun sanan alaisuuteen.
Esittelytiedostoista löytyy signals: -lohko, johon voidaan määritellä luokan lähettämiä
signaaleita. Signaaleita ei ole kuitenkaan pakko toteuttaa, koska MOC pystyy luomaan
myös näiden toteutuksen. Signaaleilla ei ole koskaan mitään paluuarvoa, eli
signaalifunktioiden tyyppi on void. Qt ei ole rajoittanut mitenkään slottien määrää,
joihin signaali voidaan yhdistää. Signaalit lähetetään varatulla sanalla emit. Yleisesti
signaalin lähettäminen aiheuttaa suoran funktiokutsun, mutta signaali voidaan myös
välittää tapahtumana säikeiden välillä.
Slotit ovat funktioita, jotka vastaanottavat signaaleita. Nämä määritellään *.htiedostossa slots:-sanan alle. Sloteilla on myös kolme eri näkyvyysaluetta: public,
protected ja private. Eli *.h-tiedostossa slotteja määritellessä pitää esitellä myös slotin
näkyvyysalue, joten slots: ei yksinään riitä. Slotit voivat palauttaa paluuarvoja, mutta
eivät signaali-slot-yhdistyksessä. Slot voi vastaanottaa määrittämättömän määrän
signaaleita ja toteutus vastaa luokan jäsenfunktiota sekä niitä voidaan kutsua samalla
lailla kuin muita luokan jäsenfunktioita. Jos useita slotteja on kytketty signaaliin, niin
slottien suoritusjärjestys on satunnainen.
Yhdiste signaalien ja slottien välillä on toteutettu QObject-luokassa. Jotta luokkien
instanssit pystyvät kommunikoimaan toistensa kanssa, ne pitää yhdistää tällä funktiolla.
Alla on funktion esittely, jota kutsumalla luodaan yhdiste, jos yhdiste luodaan
onnistuneesti, funktio palauttaa arvon tosi, muussa tapauksessa arvon epätosi. Qt pystyy
luomaan yhdisteitä signaalien ja slottien välillä, vaikka näiden parametrivälitys ei
täsmää. Ainoana rajoitteena on, että slot-funktiossa ei saa olla enempää parametreja
kuin signaalissa, koska Qt ei pysty luomaan arvoja tyhjästä.
bool QObject::connect( const QObject * sender, const char * signal, const QObject *
recv, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) [static]
5.2.3.2
OpenCV
OpenCV (Open Computer Vision) on ilmainen ja avoimen lähdekoodin
konenäkökirjasto, jolla on BSD-lisenssi (Berkley Software Distribution). Kirjaston
kehittämisen aloitti Intel vuonna 1999. Kirjasto on kirjoitettu C++:lla, mutta sitä
voidaan käyttää lukuisilla eri ohjelmointikielillä. Kirjasto mahdollistaa reaaliaikaisen
konenäön toteuttamisen käytännössä alustalla kuin alustalla, eli kirjasto on yhteensopiva
useimmilla PC- ja mobiilikäyttöjärjestelmillä. Tuhannet kehittäjät käyttävät OpenCV:tä
konenäkösovellustensa ytimenä, mikä tekee OpenCV-kirjastosta suosituimman
konenäkökirjaston. OpenCV-kirjastoprojekti on käynnissä oleva kehitysprojekti, jossa
31
säännölliset päivitykset pyrkivät kehittämään ja korjaamaan olemassa olevia ongelmia.
Pääasiallinen kehitys on kohdistettu x86-arkkitehtuurille. Kirjasto tukee myös ohjelman
kiihdytystä Intelin omalla IPP-kirjastolla (Integrated Performance Primitives).
Viimeisimmät päivitykset ovat lisänneet myös OpenCV-kirjastoon GPU-suorittimen
(Graphics Processing Unit) hyväksikäytön. Kiihdytyksessä käytetään NVidian
kehittämää CUDA-standardia (Compute Unified Device Architecture). [2]
OpenCV:n suurin vahvuus on sen laaja algoritmikanta, joka sisältyy sen normaaliin
jakelupakkaukseen. OpenCV:n toiminnollisuudet, kuva 15, jakautuvat kuvan
pikselitason suodattamisesta ja muuttamisesta aina monimutkaisiin ominaisuuksien
analyyseihin ja koneoppimisen toiminnollisuuksiin.
Kuva 15 OpenCV:n ominaisuuksia [21]
Huolimatta siitä, että OpenCV oli alun perin suunniteltu työpöytäkäyttöiseen
tietokoneeseen, OpenCV on hyödyllinen työkalu myös sulautetussa alustassa. Osa
laitevalmistajista tarjoaa kirjastoja sulautetuille järjestelmille. Nämä kirjastot pystyvät
suorittamaan osan OpenCV:n tarjoamista algoritmeista, mutta vain harvat pystyvät
tarjoamaan yhtä kattavan algoritmikannan kuin OpenCV. OpenCV on siirretty jo ARMarkkitehtuuriin, joka on suosittu CPU-valinta sulautettujen alustojen keskuudessa.
Työpöytäympäristöön suunniteltu OpenCV-ohjelma voidaan siis kääntää sulautettuun
ARM-ympäristöön. Sovellus ei välttämättä toimi samalla lailla sulautetussa
32
järjestelmässä kuin työpöytäympäristössä, koska sulautettu järjestelmä käyttää
normaalisti vähemmän muistia sekä järjestelmän suorituskyky saattaa olla muutenkin
alhaisempi. Jotta OpenCV:tä voidaan käyttää sulautetussa järjestelmässä sulavasti,
muutamat esteet pitää selvittää, jotta saavutetaan hyväksyttävä suorituskyky sulautetulla
järjestelmällä. [2]
Koska OpenCV on avointa lähdekoodia ja kirjoitettu kokonaan C/C++:lla, kirjasto on
käännetty ja siirretty monelle erilaiselle alustalle. Käännösprosessi ei kuitenkaan yksin
välttämättä riitä siihen, että saavutetaan reaaliaikaisuus kyseisellä alustalla. Kirjaston
koodin uudelleenkirjoittaminen ja optimointi uudelle alustalle vaatisi valtavan
työmäärän. Alustakohtaiset optimoivat kääntäjät ovat oleellisia tämäntyylisten
ongelmien ratkaisuissa. GCC-kääntäjä (GNU Compiler Collection) on yksi esimerkki,
joka on onnistunut kääntämään OpenCV-kirjaston ARM-alustalle. GCC-kääntäjä on
vahvasti keskittynyt C-kieleen ja osaa optimoida C++-kieltä. OpenCV:n tämänhetkinen
versio rakentuu vahvasti C++-kielen STL-säilöihin (Standard Template Library), niin
kuin GCC ja C99-laajennokset, mitä monet sulautettujen alustojen kääntäjät eivät tue.
Jos sulautetun alustan kääntäjä pystyy kääntämään ainoastaan C-koodia, niin OpenCV
täytyy palauttaa aina 1.1 versioon tai aikaisempaan, koska nämä versiot on kirjoitettu
melkein täysin C-kielellä. Versio 1.1 ei tietenkään sisällä uusien versioiden kehittyneitä
algoritmejä, joten versiopalautus aiheuttaa varmasti ongelmia. OpenCV:n lähdekoodi
sisältää monia alatason optimointeja x86-prosessoreille. Nämä optimoinnit eivät
kuitenkaan ole käytettävissä ARM-prosessoreissa tai DSP-alustoissa. Optimoinnit on
kuitenkin mahdollista korvata laitekohtaisilla kirjastoilla tai olennaisilla funktioilla,
jotka hyödyntävät arkkitehtuurikohtaisia atomisia käskyjä, SIMD-käskyjä
nopeuttaakseen koodin suoritusta. OpenCV:n ohjelmointirajapinta mahdollistaa usein,
että data voidaan välittää monessa eri muodossa funktioille. Tämä voi monimutkistaa
näiden funktioiden optimointia uusille alustoille. Rajoittamalla nämä funktiot
toimimaan ainoastaan yhdellä tietotyypillä, mahdollistaa sen, että kääntäjä generoi
yksinkertaisempaa ja tehokkaampaa koodia. Lisäksi, käyttämällä inline-avainsanaa
pienissä, usein toistuvissa funktioissa voi myös kasvattaa suorituskykyä korkean tason
konenäköfunktioilla. [2]
Optimointi sulautettuihin alustoihin tarkoittaa usein laitekohtaisen assembly-koodin
hyväksikäyttöä alkuperäisessä koodissa. Onneksi sulautetut prosessorit ovat kehittyneet
monimutkaisemmiksi, samalla kehitystyökalut ovat tulleet tehokkaammiksi ja
käyttäjäystävällisemmäksi. Useimmat valmistajat sulautetuissa järjestelmissä tarjoavat
optimoituja kirjastoja, jotka ovat käsinkirjoitettu tarjoamaan parhaan suorituskyvyn
matalan tason matematiikalle, kuvan ja konenäön funktioille. OpenCV-kirjaston
yhdistäminen näihin valmistajan tarjoamiin kirjastoihin voi kiihdyttää huomattavasti
korkean tason OpenCV:n ohjelmointirajapintaa.
33
Muutamat yritykset tarjoavat konenäkö- ja kuvankäsittelykirjastoja, joilla voidaan
korvata osa OpenCV:n funktioiden koodin osista tai joissakin tapauksissa koko funktio.
Lisäksi optimoitua matematiikkakirjastoa voi käyttää kasvattaakseen OpenCV:n
funktioiden suorituskykyä. Käyttämällä näitä optimoituja kirjastoja OpenCV:n
ohjelmointirajapinnassa,
voidaan
maksimoida
suorituskyky
hyödyntämällä
arkkitehtuurikohtaisia ominaisuuksia, kuitenkin säilyttämällä standardin rajapinta
korkean tason ohjelmistoon. Toisin sanoen, nämä matalan tason kirjastot voivat
kiihdyttää OpenCV-kirjaston funktioita rikkomatta olemassa olevan sovelluksen koodia,
joka on kirjoitettu OpenCV:n ohjelmointirajapinnalla.
Toinen usein kohdattu ongelma käyttäessä OpenCV-kirjaston funktioita, on se, miten
sulautetun prosessorin ympäristö suhtautuu liukulukujen käsittelyyn. Tämä tuo
huomattavan ongelman käytettäessä OpenCV-kirjastoa, koska se sisällyttää lukuisia
kuvankäsittelyfunktiota, jotka tukeutuvat vahvasti liukulukuaritmetiikkaan. OpenCV
tukee monenlaisia kuvatyyppejä, jotka sisältävät myös liukulukuesitykset. Monet
OpenCV:n
kuvankäsittelyfunktiot
eivät
kuitenkaan
koskaan
käytä
liukulukuaritmetiikkaa tai käyttävät sitä ainoastaan, kun kuva koostuu
liukulukuarvoista. Kuitenkin muutamat erikoisemmat funktiot, jotka käsittelevät
ominaisarvoja, kuvan transformaatioita tai kuvan statistiikkaa käyttävät aina
liukulukulaskentaa, huolimatta siitä, mikä on alkuperäisen kuvan tyyppi. Tämän
tyyppiset algoritmit tarvitsevat alustalta natiivia liukulukutukea, jotta voidaan saavuttaa
reaaliaikainen kuvankäsittely. [2]
5.2.3.3
ZXing
ZXing-kirjasto on niin ikään avoimen lähdekoodin kirjasto, joka on toteutettu Javakielellä, mutta kirjasto voidaan siirtää useille eri ohjelmointikielille. Kirjasto tukee
useiden 1D- ja 2D-viivakoodien dekoodausta digitaalikuvasta.
Taulukko 1 ZXing-kirjaston tukemat viivakoodityypit
Tyyppi
Code 39
Code 93
Code 128
Codabar
EAN-8
EAN-13
ITF
RSS-14
RSS-Expanded
UPC-A
UPC-E
Aztec
Dimensio
1
1
1
1
1
1
1
1
1
1
1
2
34
Data Matrix
PDF 417
QR Code
2
2
2
Loppusovellus tehtiin Qt-kehysalustalla ja ZXing-kirjastosta löytyy QZXing-moduuli,
jonka avulla pystytään hyödyntämään kirjaston toimintoja Qt-ympäristössä.
Moduulinen käyttäminen oli varsin yksinkertaista, joka voidaan nähdään myös liitteessä
4.
Kuva 16 ZXing-kirjaston viivakoodiolion käyttäminen Qt-ympäristössä
Instantioinnissa luodaan muuttuja pääikkunaan: QZXing *barcodeDecoder_ = new
QZXing(this); Tämän jälkeen yhdistetään pääikkunan signaali moduulin slotin kanssa,
mikä
suorittaa
viivakoodien
dekoodaamisen.
Moduulin
vastaanotettua
dekoodaussignaalin, se alkaa prosessoimaan kuvaa. Prosessoinnin onnistumisesta
ilmoitetaan tagFound-signaalilla. Tällöin voidaan suorittaa pääikkunan getTag()funktio, jolla reagoidaan onnistuneeseen dekoodaukseen ylimmällä tasolla.
5.2.4
Sovellus
Ensimmäinen haaste konenäkösovelluksen kehittämisessä oli taustan erottaminen
kuvista. Kamera asennetaan staattiseksi pakkauskoneen yhteyteen, jolloin suurin osa
kuvasta pysyy vakiona. Koska pakkauskoneen liikkeet ovat toistuvia ja pakattavat
tuotteet pysyvät vakiona, voidaan näitä varten kehittää alueita kuviin, joiden sisällä
liikkeiden ja tuotteiden on pysyttävä normaaliajossa. Jos liikkeet tai tuotteet eivät pysy
määriteltyjen alueiden sisällä, todetaan, että virhe on ilmennyt.
35
5.2.4.1
Taustan erottaminen
Taustan erottaminen tai etualan tunnistaminen tarkoittaa kuvankäsittelytekniikkaa, jossa
etuala poistetaan kuvasta jatkokäsittelyä varten, esimerkiksi objektin tunnistusta varten.
Tyypillisesti suurin osa kuvasta on taustaa ja kuvassa esiintyvät objektit (autot, ihmiset,
tekstit jne.) muodostavat kuvan etualan. Kun kuva on esiprosessoitu, kuvasta
paikannetaan objektit, mikä tarkoittaa useiden algoritmien suorittamista kuvalle.
Taustan erottamista käytetään usein liikkuvien objektien seuraamiseen vertailemalla
juuri otettua kuvaa referenssikuvaan. Referenssikuvaan viitataan usein taustakuvana tai
–mallina. Taustan erottamista kuvasta käytetään pääosin ainoastaan videokuvalle.
Taustan erottamisessa on kuitenkin omat haasteensa. Ideaalitapauksessa taustan
pikseliarvot pysyisivät videokuvassa aina samoina, jolloin vertaamalla tarkasteltavan
kuvan pikseliarvoja taustakuvan pikseleihin, arvojen poiketessa voidaan todeta, että
kyseisessä pikselikohdassa on tapahtunut liikettä. Robustin taustan erottamisen täytyy
kuitenkin pystyä reagoimaan valaistuksen muutoksiin sekä toistuviin ja pitkäaikaisiin
muutoksiin.
Luvussa 3.2 esiteltiin kuvan digitaalinen esittäminen. Digitaalinen video voidaan esittää
samanlaisella funktiolla V(x,y,t), johon liitetään lisäparametri t, joka kuvastaa videon
aikamuuttujaa.
Q + 1 = |R, , + 1 − R, , |
Yllä on esitetty absoluuttinen erotus ajanhetkellä t + 1, jossa taustakuvan oletetaan
olevan ajanhetkellä t oleva kuva. Mutta kyseinen lauseke toimii ainoastaan tapauksissa,
joissa objektit liikkuvat ja tausta pysyy täsmälleen samana. Kuvankäsittelyssä törmätään
usein raja-arvo käsitteeseen ja samoin tässäkin tapauksessa tarvitaan raja-arvoa, joka
absoluuttisen erotuksen tulee ylittää.
|R, , + 1 − R , , | > ℎ
Raja-arvolla Th pystytään nyt hieman varioimaan pikseliarvojen sallittua muutosta.
Tämän lähestymistavan tarkkuus on riippuvainen liikkeiden nopeuksista, mikä johtaa
siihen, että nopeilla ja hitailla liikkeillä tarvitaan mahdollisesti erilaisia raja-arvoja.
Jotta tausta saadaan erotettua entistä tarkemmin, erotuksessa käytettävän taustakuvan
pitää olla luotettava. Videosta otettu yksi kuvakaappaus V(x,y,t) voi olla hyvinkin
epäluotettava. Luotettavuutta voidaan kasvattaa ottamalla lukuisia kuvia taustasta ja
palauttamalla näiden kuvien pikseliarvojen keskiarvo lopulliseen taustakuvaan.
36
U, = ∑V
XY R , , − ,
V
jossa N on taustasta otettujen kuvien lukumäärä. Edellä olevalla lausekkeella saadaan
B(x,y), joka kuvastaa uutta keskiarvoitettua taustakuvaa. Tämän jälkeen alkuperäinen
taustakuva V(x,y,t) voidaan korvata absoluuttisessa erotuksessa B(x,y)-funktiolla ja näin
päästään tarkempiin tuloksiin. OpenCV tarjoaa tähän toimintoon oman olioluokan.
5.2.4.2
Reunojen tunnistaminen
Luvussa 3.3.3 esitettiin hieman teoriaa kuinka digitaalisesta kuvasta voidaan löytää
reunoja. OpenCV tarjoaa monia eri tapoja tämän toteuttamiseen. Yksinkertaisimmissa
algoritmeissa paikannetaan pikseleiden positiot, joissa pikselin gradientti on suurempi
kuin pikselin ympäristön muut gradientit.
Yleisin derivoinnissa käytettävä operaattori on Sobelin derivaatta-operaattori, joka ei
varsinaisesti derivoi mitään, ainoastaan generoi derivaatan approksimaation kyseiselle
pisteelle. Tätä voidaan hyödyntää ja laajentaa x. asteen derivaatoille. Tämä operaattori
on ainoastaan matriisifiltteri, joka approksimoi derivaatan arvon diskreetissä
avaruudessa. Vastaavanlaisia matriisifilttereitä löytyy lukuisia ja etenkin Sobeloperaattorin heikkoutena on pienien matriisifiltterien heikko tarkkuus.
Matriisisuodattimen dimension kasvaessa käytetään laajempaa aluetta kuvasta
derivaatan arvon approksimaatioon, mikä johtaa pienempään virhearvioon, mutta on
huomattavasti hitaampi suorittaa. Heikko tarkkuus antaa vastaavasti virheellisiä
derivaatan suuntia, joita käytetään esimerkiksi objektien tunnistamiseen.
OpenCV:ssä käytetään kolmea eri approksimaattoria: Sobel, Scharr ja Laplacian. Sobel
ja Scharr ovat käytännössä aivan samanlaisia, mutta Scharr-filtterillä päästään
tarkempaan lopputulokseen samalla suoritusajalla. Laplacian määriteltiin luvussa 3.3.3,
josta ilmenee, että siinä käytetään toisen asteen derivaattoja. OpenCV:n toteutus
Laplacian-operaatiosta on toteutettu Sobel-filttereitä käyttämällä. Koska Laplacianoperaattori käsittelee digitaalikuvan toisen asteen derivaatta-approksimaatioita,
lähtökuvan reunat ilmenevät nollina Laplacianin muodostamassa datajoukossa.
Toisaalta merkitsevät ja vähemmän merkitsevät reunat esiintyvät Laplacianin
datajoukossa nollina, mutta tämä ongelma voidaan poistaa suodattamalla pikselipositiot,
joissa ensimmäinen derivaatta on myös suuri.
Paras reunantunnistus-funktio/algoritmi OpenCV:ssä on cvCanny()-funktio, joka vaatii,
että operoitava kuva on mustavalkoinen, josta lopuksi muodostetaan binäärikuva.
cvCanny()-funktion toteutuksessa kuitenkin tukeudutaan Sobel-operaattoriin, jolla
suoritetaan tarvittavat derivoinnit kuvalle.
37
5.2.4.3
Alueen opettaminen
Yksinkertaisimmaksi menetelmäksi todettiin, että käyttäjä itse saa määrittää tutkittavan
alueen, jonka sisäpuolella liikehdintää saa tapahtua. Loppusovellukseen määriteltiin
kaksi aluetta, jotka on mahdollista opettaa. Toinen tarkastelee liikettä; ettei sitä tapahdu
alueen ulkopuolella ja toiseen alueeseen voidaan määrittää viivakoodin sijainti.
Liikkeen määrittäminen perustuu kuitenkin edelleen taustan erottamiseen kuvasta,
jolloin etualan äärirajat otetaan talteen ja tarkastetaan, että ne ovat sallitun alueen
sisällä. Toinen tapa, jota testattiin, oli värialueiden seuranta. Kuvasta luodaan
binäärikuva sallimalla ainoastaan rajattu värialue. Eli jos alkuperäisen kuvan pikselin
väriarvo sisältyy rajattuun väriarvoalueeseen, se merkataan valkoisella binäärikuvaan.
Binäärikuvan valmistuttua haetaan valkoisten alueiden määrittämät äärirajat, joista
jälleen tarkastetaan, että ne ovat sallittujen rajojen sisällä.
38
6
TULOKSET JA ARVIOINTI
6.1
Testialusta
Tutkimuksen ensimmäisenä tutkimuskohteena oli alkuperäisen järjestelmän
suorittaminen kevyemmällä alustalla. Koska alkuperäisen järjestelmän toiminnallisuus
ei vaadi laitteistolla kovin paljon, toiminnallisuuden toteuttamista aloitettiin tutkimaan
BeagleBone Black-alustalla, joka ei ole erityisen tehokas mutta edullinen tutkimusta
varten. Taulukossa on esitelty alustan oleellisimpia ominaisuuksia.
Taulukko 2 BeagleBone Black-kehitysalustan tietoja
CPU
GPU
Muisti
Flash
OS
Cortex-A8, 1GHz
SGX530, 20MHz
DDR3, 512 MB
8bit eMMC, 2 GB
Ångström
Järjestelmälle valittiin kameraksi Logitechin C920, jossa on sisäänrakennettu H.264videopakkauskoodaus. Tämä siksi, koska alkuperäinen järjestelmä pystyi pakkaamaan
vastaanottamat videovirtansa entistä pienempään kokoon, mutta tämä ei ole mahdollista
enää BBB-alustalla sen heikon suoritustehon takia. Alustaa varten luotiin uusi
tallennusohjelma, joka pystyy hyödyntämään edistyneemmän USB-kameran
ominaisuuksia käynnistämällä sisäisen videopakkauskoodauksen ja pienempikokoisen
videovirran lähettämisen. Matalaresoluutioisesta videovirrasta muodostuu myös
pienempiä videotiedostoja, mikä nopeuttaa tiedostojen siirtelyä pilvipalveluun.
Koska molemmilla alustoilla toimii Linux-käyttöjärjestelmä, ohjelmien siirtäminen
onnistui ongelmitta alustalta toiselle. Ainoana muutoksena jouduttiin toteuttamaan uusi
videoiden tallennusohjelma, josta mainittiin jo edellä. Kevyen alustan videoiden koko
kasvoi, vaikka videoiden resoluutio onkin pienempi. Syynä tähän on, että PC-ympäristö
pystyy pakkaamaan vastaanotettua videota vieläkin pienemmäksi ilman että
tallennetusta videosta menetetään kuvia. Kevyt alusta on näinkin yksinkertaisessa
prosessissa aivan suorituskykyjensä äärirajoilla. Tästä johtuen järjestelmä jumittui niin
pahasti, että tallennettavasta videosta uupui paljon kuvia ja huonoimmassa tapauksessa
koko minuutin tallennus epäonnistui kokonaan. Toinen ongelmakohta ilmeni
samanaikaisessa videon tallennuksessa sekä toisen videon siirtämisessä pilvipalveluun.
Tilannetta helpottaisi huomattavasti, jos alustan suoritusympäristö olisi
kaksiydinprosessori, jolloin käyttöjärjestelmä pystyisi skeduloimaan tehtävien suoritusta
39
samanaikaisesti molemmille ytimille. Yksiytimisessä alustassa molemmat: sekä
tallennus- että siirtoprosessi kamppailevat suoritusajasta ytimellä.
Tämä kevyt alusta antoi kuitenkin positiivisen vaikutelman siitä, mihin näinkin halvalla
laitteella pystytään. Etenkin kun teknologia kehittyy ja kun markkinoille ilmestyy
entistä halvempia ja tehokkaampia kevyitä alustoja, alkuperäinen järjestelmä pystytään
varmasti siirtämään tällaiseen alustaan. Tässä vaiheessa järjestelmän toimiminen BBBalustassa on kuitenkin siinä määrin epävarmaa, että se ei pysty vielä korvaamaan
olemassa olevaa alustaa.
[17]
6.2
Loppusovelluksen yleiskuvaus
Tämän tutkimustyön teknisenä kontribuutiona toteutettiin konenäkösovellus, jonka
käyttöliittymän pääsivu on esitelty kuvassa 17. Sovellusta voidaan käyttää
pakkauskoneen erilaisiin monitorointitoimintoihin. Sovellus voidaan konfiguroida
lukuisiin eri toimintoihin, esimerkiksi tallentamaan koneen toimintaa levylle, sovellusta
voidaan hyödyntää anturityyppisesti palauttamaan konfiguroituja tilatietoja sekä
sovellus pystyy dekoodaamaan 1- ja 2-uloitteisia viivakoodeja. Sovelluksen
käyttöliittymä ja logiikka on toteutettu Qt:lla. Konenäköön liittyvä toiminnollisuus
käyttää OpenCV-kirjastoa ja viivakoodien dekoodauksessa käytetään ZXing-kirjastoa.
Sovellus on melko yksinkertainen ja tämän tarkoituksena on ainoastaan esitellä
konenäköä OpenCV-kirjaston avulla alkuperäisessä valvontajärjestelmässä. Sovelluksen
toteutus jakautuu kahteen osaan: kehys- ja toteutusluokkiin. Kehysluokkien
tarkoituksena on luoda ympäristö toteutusluokille. Toteutusluokat toteuttavat taas
sovelluksessa vaadittavan toiminnon tietämättä muista sovelluksessa esiintyvistä
toiminnoista.
40
Kuva 17 JometCV-sovelluksen käyttöliittymä
Sovelluksesta oli tarkoitus tehdä myös mahdollisimman itsenäinen, jotta se ei olisi
mitenkään riippuvainen pakkauskoneesta, johon tätä järjestelmää tultaisiin käyttämään.
Sovelluksen itsenäinen toiminnollisuus perustuu tarkastustoimintoihin, joita käyttäjä
pystyy luomaan sovelluksessa.
6.3
Käyttö
Sovellusta käytetään kamerajärjestelmän konfigurointiin. Tämän avulla voidaan luoda
automaattinen tallennustoiminto, joka tallentaa järjestelmän kameran videovirtaa levylle
puskurimaisesti. Myös puskurin koko konfiguroidaan sovelluksessa. Kun puskuri tulee
täyteen, vanhin videomateriaali poistetaan. Näin saadaan tilaa uudelle videolle.
Automaattinen tallennus voidaan linkittää myös tarkastustoimintoihin. Jos
tarkastustoiminto lähettää tapahtuman tallennukselle, tapahtumaan liittyvä video
tallennetaan erilliseen paikkaan, josta tiedoston voi poistaa ainoastaan käyttäjä. Näin
vältytään poistamasta video, joka sisältää tapahtumatietoja.
Sovellukseen kuuluu myös tarkastustoimintoja. Näillä toiminnoilla on tarkoitus luoda
järjestelmästä riippumaton sen fyysisestä ympäristöstä eli käytännössä pakkauskoneesta,
johon se asennetaan. Tarkastustoimintoja voidaan luoda automaattisesti tai
manuaalisesti käyttäjän toimesta. Automaattinen tarkastuksen luominen perustuu
järjestelmän kykyyn oppia itse pakkauskoneen toiminta-alue. Järjestelmä tarkastelee
kameran kautta pakkauskoneen normaalia toimintaa. Tästä se pystyy tulkitsemaan
alueen, jossa liikkeet tapahtuvat. Kun ajon aikana tapahtuu jotakin liikettä tämän alueen
ulkopuolella, automaattinen tarkistus lähettää tästä tapahtuman. Tapahtuma voidaan
ottaa joko vastaan tai ei.
41
Käyttäjä itse voi myös määrittää tarkastustoimintoja. Käyttäjä pystyy rajaamaan
kameran näkymästä alueen, johon voidaan soveltaa muutamaa eri toimintoa. Yksi näistä
on esimerkiksi viivakoodin lukeminen, jolloin toimintoa opetettaessa on annettu
intervalli, joka määrittää aikavälin kuinka usein viivakoodia yritetään lukea alueesta.
Onnistuneen lukemisen jälkeen lähetetään tapahtuma, joka sisältää viivakoodiluvun
tuloksen.
Toinen toiminto on värin tunnistaminen alueesta. Otetaan esimerkiksi tilanne, jossa
ryhmittelijä haluaa siirtää tuotteet paikasta A paikkaan B. Alla olevasta kuvasta 18 käy
ilmi, että käyttäjän rajaamalla alueella vain toisessa tilanteessa rajatulta alueelta
pystytään tunnistamaan tarpeeksi suuri ruskea alue. Ennen siirtoa pakkauskone voi
tehdä kyselyn käyttäjän määrittämälle tarkistustoiminnolle, löytyykö alueesta riittävän
suuri ruskea alue.
Kuva 18 JometCV-sovelluksella opetettu tarkistustoiminto
6.4
Sovelluksen rakenne
Kuvassa 19 on nähtävissä toteutetun sovelluksen rakenne. Sovelluksen käyttöliittymä,
on rakennettu SovellusGUI-luokkaan, joka myös muodostaa tarvittavat oliot muille
toiminnoille. Sovelluksen kommunikointi PLC-järjestelmän kanssa on toteutettu
TCP/IP-yhteydellä. MyServer-luokka sisältää tähän tarvittavat palvelut. Jokaisesta
yhteydenottavasta laiteesta muodostetaan MyClient-luokan olio.
42
Kuva 17 JometCV-sovelluksen luokkakaavio
Sovelluksen kannalta konenäköosuuden tärkein osuus sisältyy TeachToolkantaluokkaan, joka toimii perustana jokaiselle opetettavalle toiminnolle. TeachToolluokasta on periytetty myös OnlineTeach-luokka, joka tarjoaa tarvittavat palvelut
reaaliaikaisen tarkastustyökalun tekemiseen. Periytymisketjua jatketaan vielä
FileTeach-luokalla, jonka avulla voidaan opettaa työkaluja videotiedostoista. Barcodeluokka sisältää toiminnot viivakoodien tulkitsemiseen.
6.5
Jatkokehitys
Tutkimuksen tarkoituksena oli kehittää itsenäistä järjestelmää, jonka pystyisi liittämään
koneeseen kuin koneeseen. Tämän lisäksi selvitettiin, kuinka hyvin kevyt alusta pystyy
suoriutumaan alkuperäisen järjestelmän suorituksessa. Itsenäisen järjestelmän
kehittämisessä onnistuttiin riittävän hyvin, mutta parannettavaa vielä löytyy paljon.
Ensimmäinen asia, joka kävi ilmi jo sovellusta tehtäessä oli, että kyseessä on sen
kokoinen projekti, joka ei sovellu yhden ihmisen toteutettavaksi tiukalla aikataululla.
OpenCV-kirjasto on jatkuvan kehityksen alla. Siihen tulee paranneltuja
toiminnollisuuksia versio versiolta. Näin ollen tämänkin työn sovellus on suoraan
riippuvainen OpenCV-kirjaston suorituskyvystä. Sovellusta tulisikin päivittää
vastaamaan uusimman OpenCV-kirjaston moduulien käyttöä, joka voisi jo itsessään
parantaa eri tarkistustoimintojen toimintavarmuutta.
Tällä hetkellä sovelluksen käyttämä automaattinen oppiminen perustuu taustan
erottamiseen ja siitä saadun etualan rajaamiseen. Rajattu alue tarkoittaa aluetta, jossa
liike saa tapahtua. Nyt etuala rajataan suorakulmiolla, joka sallii liian suuren alueen
sallituksi alueeksi.
43
Kuva 18 automaattisesti tunnistetun alueen minimoiminen
Kuvassa 20 on pyritty havainnollistamaan tilannetta. Mustalla rajattu alue edustaa
etualaa, eli liikettä. Punainen väri näyttää tämänhetkisen sovelluksen rajaaman sallitun
alueen. Keltaisella värillä muodostettu monikulmio rajaa optimaalisesti sallitun liikkeen
alueen.
Näiden lisäksi yhtenä tärkeimpänä jatkokehitysideana voitaisiin pitää järjestelmän
toiminnan siirtämistä kevyemmälle alustalle. Tällä hetkellä se ei välttämättä ole
mahdollista, mutta teknologian kehittyessä tehokkaampia ja pienempiä alustoja ilmestyy
aivan varmasti.
44
7
YHTEENVETO
PLC-järjestelmän ollessa tietoinen ympäristöstään pystytään parantamaan järjestelmän
virhediagnostiikkaa. Tämä tarkoittaa tämän työn yhteydessä sitä, että kun virhe tapahtuu
PLC-järjestelmässä, kamerajärjestelmä tarjoaa tästä videon, jonka avulla on helppoa
tehdä tarvittavia johtopäätöksiä virheestä. Kamerajärjestelmää voidaan myös käyttää
hyväksi ennaltaehkäisemään virhetilanteita. Asioita, joita perinteisillä antureilla ei
pystytä havaitsemaan, voidaan tunnistaa kamerajärjestelmän avulla.
Tässä diplomityössä tutkittiin, miten OpenCV-kirjastoa pystytään hyödyntämään Qtkehitysympäristössä luomalla itsenäinen konenäköjärjestelmä. Työn teknisenä
kontribuutiona toteutettiin JometCV-sovellus, joka on jatkokehitystä yrityksen
alkuperäiselle pakkauskoneen monitorointijärjestelmälle. JometCV-sovellus on
kehitetty Qt-kehitysympäristössä ja käyttää OpenCV- ja ZXing-kirjastoja toteuttaakseen
sovellukseen tarvittavat toiminnot. Yksi oleellisimmista toiminnoista on erilaisten
liikkeiden tunnistaminen ja näiden analysointi, joiden perusteella voidaan antaa tietoa
PLC-järjestelmälle. Tämän lisäksi sovelluksen avulla kamerajärjestelmä voidaan
konfiguroida älykkääksi anturiksi, jolta PLC pystyy kysymään ympäristönsä tietoja.
JometCV-sovellukseen kehitettiin myös useita uusia toimintoja, joilla parannettiin
yksinkertaisen monitorointijärjestelmän toimintoja. Uuteen sovellukseen kehitettiin uusi
käyttöliittymä, jonka avulla pystytään konfiguroimaan koko järjestelmä halutunlaiseksi.
Uusina toimintoina esiteltiin konenäköön perustuva automaattinen virheen
tunnistaminen, uusien tarkkailutoimintojen luominen ja viivakoodien dekoodaus. Näin
JometCV-sovelluksesta haluttiin tehdä soveltuva moneen eri toimintaan. Sovellus
saatiin työn aikana riittävälle tasolle vaatimusten osalta, mutta työn teon aikana
havaittiin, että kyseinen projekti on liian suuri yhden henkilön vietäväksi loppuun.
Sovellus osaa havaita liikkeen hyvin, mutta se sallii vielä liian suuren alueen
virhetarkastelussa. Jotta näitä virheellisiä liikkeitä havaitaan entistä tarkemmin,
kyseinen alue pitää optimoida mahdollisimman pieneksi opetustilanteen jälkeen.
Lisäksi, sovelluksen toiminta perustuu vahvasti OpenCV-kirjastoon, joka kehittyy koko
ajan. Sovelluksen toimintaa pystytään mahdollisesti parantamaan päivittämällä
OpenCV-kirjasto ja tarkkailemalla, ilmestyykö siihen parempia funktioita.
Työn toisena osana tutkittiin kevyitä kehitysalustoja ja näiden kykyjä suorittaa
videoprosessoimista. Ensimmäisenä haasteena oli tutkia pystytäänkö Jometin
alkuperäinen monitorointijärjestelmä siirtämään suoritettavaksi kevyellä alustalla.
45
Tutkimuskohteeksi valikoitui BeagleBone Black. Kyseinen kehitysalusta yllätti
positiivisesti,
koska
se
kykeni
suorittamaan
alkuperäisen
järjestelmän
monitorointitoimintoa. Tähän ei kuitenkaan pystytty ilman pieniä muutoksia, sillä
kehitysalustan vaatimattomasta suoritustehosta johtuen, alusta ei pysty dekoodaamaan
yhtään jatkuva-aikaista videovirtaa eri muotoon. Niinpä päätettiin käyttää kameraa, joka
suorittaa valmiiksi jo kamerassa tarvittavan dekoodauksen. Tämäkin muutti järjestelmän
toimintaa siinä mielessä, että systeemin tallentamien videoiden koko kasvoi. Tästä
johtuen videoiden siirtäminen pilvipalveluun hidastuu eikä tallennettavia videoita voida
säilöä enää niin montaa levylle kuin alkuperäisessä ratkaisussa. Näiden lisäksi järjestelmän toimiessa koko ajan suorituskykynsä huipulla - videon tallennuksessa
voitiin havaita, että muutamia kuvia hukataan tallennettaessa videota, kun järjestelmä
prosessoi muita järjestelmän toimintoja, esimerkiksi lataa viimeisintä videota
pilvipalveluun.
JometCV-sovellus toteutettiin PC-ympäristöön, mutta nykyajan teknologia kehittyy
huimaa vauhtia, mahdollistaen kyseisen sovelluksen siirtämisen kevyelle järjestelmälle
hyvinkin pian. Kirjoittaessa tätä diplomityötä, vastaan on tullut jo useita potentiaalisia
kehitysalustoja, joiden pitäisi ainakin teknisten ominaisuuksiensa puolesta kyetä
suorittamaan tätä sovellusta.
46
LÄHTEET
[1] Argyle, E. 1971. Techniques for edge detection Proc. IEEE, vol. 59, pp. 285-286
[2] Bradski, G., Kaehler, A., 2008. Learning OpenCV. O'Reilly Media.
[3] Canny, John. 1986. A Computational Approach to Edge Detection, IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. PAMI-8, No. 6, pp. 679-698.
[4] Wolberg, G. 1996. Digital Image Warping. IEEE Computer Society Press. pp. 3-12.
[5] Gonzalez, R. C. & Woods, R. E., 2001. Digital Image Processing. Upper Saddle
River, NJ: Prentice-Hall. p. 117, 134 pp.165-168, pp. 572-582.
[6] Harris and M. Stephens., 1988. A Combined Corner and Edge Detector, Proceedings
of the Fourth Alvey Vision Conference, Manchester, pp. 147-151.
[7] Lim, Jae S. 1990. Two-Dimensional Signal and Image Processing, Englewood
Cliffs, NJ, Prentice Hall, pp. 478-488.
[8] Parker, James R. 1997. Algorithms for Image Processing and Computer Vision, New
York, John Wiley & Sons, Inc., pp. 23-29.
[9] Shapiro, L. & Stockman, G. 2001. Computer vision. Prentice Hall., pp. 33-53.
[10] Szeliski, R. 2010. Computer Vision. Algorithms and Applications.
[11] Ziou, D. & Tabbone, S. 1998. Edge Detection Techniques an Overview, International Journal of Pattern Recognition and Image Analysis, 8(4): pp. 537-559
[12] Lindeberg, T. 1998. Edge detection and ridge detection with automatic scale selection, International Journal of Computer Vision, 30, 2, pp 117-154
[13] Vahid, F. & Lysecky, R. & Zhang, C. & Sitt, G. 2003. Highly configurable
forms for embedded computing systems.
plat-
[14] Rafael, G. & Woods, R. Digital Image Processing. Upper Saddle River, New Jersey, Pearson Education, pp. 165-168.
[15] Sachs, J. 1999. Digital Image Basics.
[16] Online: https://developers.google.com/gdata/. Viitattu 13.2.2014
[17] Online: http://www.elinux.org/Beagleboard:BeagleBoneBlack. Viitattu 1.2.2014
47
[18] Online: http://blogs.mathworks.com/steve/2006/05/05/spatial-transformationsinverse-mapping/. Viitattu 15.2.2014
[19] Online: http://blogs.mathworks.com/steve/2006/04/28/spatial-transforms-forwardmapping/. Viitattu 15.2.2014
[20] Online: http://www.cambridgeincolour.com/tutorials/image-interpolation.htm.
Viitattu 5.3.2014
[21] Online: http://qinxuye.me/article/install-opencv-in-windows/. Viitattu 11.2.2014
48
LIITTEET
Liite 1
#include ”opencv2/highgui/highgui.hpp”
#include “opencv2/imgproc/imgproc.hpp”
#define NEW_SIZE 2
using namespace cv;
int main( int argc, char** argv)
{
//Ladataan kuva
Mat srcImg = imread(“lena.jpg”, 1);
//Luodaan ikkuna kuvaa varten
const char* winName = ”Geometrinen operaatio”;
namedWindow( winName, CV_WINDOW_AUTOSIZE );
/* Luodaan matriisi geometrista operaatiota varten
*
* geoMat = [ NEW_SIZE, 0, 0;
*
0, NEW_SIZE, 0;
*
0, 0, 1];
*/
Mat geoMat = (Mat_<double>(3,3) << NEW_SIZE, 0, 0, 0, NEW_SIZE, 0, 0, 0, 1);
//Varataan muistia lopullista kuvaa varten
Mat destImg;
Size imgSize(srcImg.size().width*NEW_SIZE, srcImg.size().height*NEW_SIZE);
//Kutsutaan funktioita, joka tekee muutoksen 3x3-matriisin perusteella
warpPerspective( srcImg, destImg, geoMat, imgSize );
//Näytetään muokattu kuva
imshow( winName, destImg );
waitKey( 0 );
return 0;
}
Liite 2
%Ladataan kuva
srcImg = imread(’lena3.jpg’);
%Vakio
PI = 3.14;
%R-Matriisissa käytettävä käännöskulma
angle = PI/4;
R = [ cos(angle), sing(angle),0;
-1*sin(angle), cos(angle),0;
0,0,1];
%Muodostetaan transformaatiomatriisi
tform = affine2d(R);
%Tehdään geometrinen muutos ja näytetään se
Imshow(imwarp(srcImg,tform));
49
Liite 3
Img2 = imread('lena.jpg');
Img = double(rgb2gray(Img2));
SImg = zeros(size(Img));
RImg = zeros(size(Img));
PImg = zeros(size(Img));
SI = size(Img);
width = SI(2);
height = SI(1);
Sx = [-1,0,1;-2,0,2;-1,0,1];
Sy = [1,2,1;0,0,0;-1,-2,-1];
Rx = [1,0;0,-1];
Ry = [0,1;-1,0];
Px = [-1,0,1;-1,0,1;-1,0,1];
Py = [1,1,1;0,0,0;-1,-1,-1];
M_W = 3; % do not need the + 1, I assume the for loop means while <less than or equal to>
% x and y are reversed...
for y=1 : height
for x=1 : width
S = 0;
P = 0;
R = 0;
for M_Y = 1 : M_W
for M_X = 1 : M_W
if (x + M_X - 1 < 1) || (x + M_X - 1 > width)
S = 0;
P = 0;
R = 0;
%disp('out of range, x');
continue
end
if (y + M_Y - 1 < 1) || (y + M_Y - 1 > height)
S = 0;
P = 0;
R = 0;
%disp('out of range, y');
continue
end
if (M_X <= 2) && (M_Y <= 2)
S = S + Img(y + M_Y - 1, x + M_X - 1) * Sx(M_Y,M_X);
S = S + Img(y + M_Y - 1, x + M_X - 1) * Sy(M_Y,M_X);
P = P + Img(y + M_Y - 1, x + M_X - 1) * Px(M_Y,M_X);
P = P + Img(y + M_Y - 1, x + M_X - 1) * Py(M_Y,M_X);
R = R + Img(y + M_Y - 1, x + M_X - 1) * Rx(M_Y,M_X);
R = R + Img(y + M_Y - 1, x + M_X - 1) * Ry(M_Y,M_X);
else
S = S + Img(y + M_Y - 1, x + M_X - 1) * Sx(M_Y,M_X);
S = S + Img(y + M_Y - 1, x + M_X - 1) * Sy(M_Y,M_X);
P = P + Img(y + M_Y - 1, x + M_X - 1) * Px(M_Y,M_X);
P = P + Img(y + M_Y - 1, x + M_X - 1) * Py(M_Y,M_X);
end
% It is y + M_Y - 1 because you multiply Robertsx(1,1) *
% Img(y,x).
end
end
SImg(y,x) = S;
RImg(y,x) = R;
PImg(y,x) = P;
end
end
subplot(2,2,1);
50
imshow(Img2,[]);
title('Orig');
subplot(2,2,2);
imshow(SImg,[]);
title('Sobel');
subplot(2,2,3);
imshow(RImg,[]);
title('Roberts');
subplot(2,2,4);
imshow(PImg,[]);
title('Prewitt');
Liite 4
//yhdistetään imageReady-signaali decodeImage-slotin kanssa
connect(this,SIGNAL(imageReady(QImage,int,int,bool)),barcodeDecoder_,SLOT(decodeImage(QImage,int,int,bool)));
//yhdistetään viivakoodilukijan tagFound-signaali pääikkunan getTag-slotin kanssa
connect(barcodeDecoder_,&QZXing::tagFound,this,&MainWindow::getTag);