5.29. Viivakoodit ja Data Matrix -koodit

Kaksi koodiperhettä täydentää kameran dekooderit. Yksiulotteiset viivakoodit – raidat muropaketin kyljessä, sairaalan rannekkeessa, lähetystarrassa – ovat vanhin yhä jokapäiväisessä käytössä oleva koneluettava symboli. Data Matrix -koodit ovat kaksiulotteisia kuten QR-koodit, mutta tiheämpiä samalla hyötykuorman koolla ja suunnattu teolliseen merkintään – valmistajamerkki laseretsattuna piirilevylle pikemminkin kuin juliste seinällä. image-moduulissa on oma dekooderi kummallekin, kattaen teollisuus-, vähittäis- ja varastosovellukset, joita kuluttajien 2D-koodit eivät koskaan aivan saavuttaneet.

5.29.1. 1D-viivakoodit

Yksiulotteinen viivakoodi koodaa hyötykuormansa sarjana vaihtelevan levyisiä pystypalkkeja, jotka luetaan vasemmalta oikealle (tai pystysuuntaisissa koodeissa ylhäältä alas). Leveydet kvantisoituvat johonkin pienestä arvojoukosta, ja leveyksien sarja muodostaa merkit siinä symboliikassa, jonka tulostin valitsi: numeerinen UPC-tuotekoodille, aakkosnumeerinen varaston osanumerolle tai mielivaltainen teksti Code 128 -tarralle.

find_barcodes() skannaa kehyksestä 1D-viivakoodit missä tahansa tuetussa symboliikassa ja palauttaa listan BarCode -tulosolioita:

codes = img.find_barcodes()

for c in codes:
    img.draw_rectangle(c.rect, color=(0, 255, 0))
    print(c.payload, c.type, c.quality)

Dekooderi skannaa kehyksen sekä vaaka- että pystysuunnassa yhdellä kutsulla, joten mihin tahansa kulmaan tulostettu viivakoodi löytyy yhdellä läpikäynnillä ilman, että sovelluksen tarvitsee kiertää syötettä. roi rajoittaa hakua; muita viritysparametreja ei ole – dekooderi on omavarainen.

Tuetut symboliikat kattavat yleiset kuluttaja- ja teollisuusperheet. Vähittäisjoukko on image.EAN2, image.EAN5, image.EAN8, image.UPCE, image.UPCA, image.EAN13 (numeeriset kiinteäpituiset koodit useimmissa kuluttajapakkauksissa), image.ISBN10 ja image.ISBN13 (samat perheet uudelleenkäytettyinä kirjoille). Yleiskäyttöinen joukko on image.I25 (Interleaved 2 of 5, yleinen lähetystarroissa), image.CODABAR (käytössä kirjastoissa ja veripankeissa), image.CODE39, image.CODE93 ja image.CODE128 (vaihtuvapituiset aakkosnumeeriset symboliikat mielivaltaiselle tekstille). Hyllynreunaperhe image.DATABAR (RSS-14) ja image.DATABAR_EXP (RSS-Expanded) täydentävät listan.

Jokainen tunnistus kantaa rajauslaatikon sanaston – x, y, w, h, rect, corners – ja dekoodatun payload-arvon merkkijonona. type on yllä olevasta listasta peräisin oleva symboliikkavakio, jonka sovellus tarkistaa, kun se välittää erityisesti siitä, mikä perhe dekoodattiin (esim. hyväksyen vain EAN13 ruokakaupan skannerisovelluksessa).

Kaksi suodatuksen kannalta merkityksellistä kenttää ovat rotation ja quality. rotation on viivakoodin kuvatasossa oleva kulma radiaaneina: dekooderi selviää mielivaltaisista kierroista, mutta jatkokäsittelykoodi, joka haluaa näyttää tunnistuksen siististi, saattaa haluta suodattaa pois koodit, jotka palautuvat jonkin kynnysarvon yli kallistuneina.

quality on dekoodauslukumäärä: niiden skannausviivojen määrä, jotka onnistuneesti dekoodasivat saman hyötykuorman. Dekooderi käy läpi kehyksen jokaisen rivin (ja sarakkeen), joka leikkaa viivakoodin, ja kasvattaa laskuria joka kerta, kun dekoodaus onnistuu. Tarkasti tarkennettu ja hyvin valaistu tulostettu viivakoodi tuottaa kymmenissä olevan quality-arvon; osittain peittynyt tai tahriintunut viivakoodi saattaa dekoodautua vain yhdellä tai kahdella skannausviivalla ja raportoida quality-arvon 1 – 2. Suodattamalla pois tunnistukset, joiden quality > 5 ei toteudu, hylätään ohimenevät yhden skannausviivan väärät dekoodaukset ilman, että aidot tunnistukset kärsivät.

1D-viivakoodisovellus on pieni. Ota kehys, kutsu find_barcodes(), käy palautettu lista läpi, suodata c.type- ja c.quality-arvoilla ja välitä c.payload UARTin tai USB:n yli mihin tahansa jatkovaiheeseen, joka kirjaa tai veloittaa skannauksen.

5.29.2. Data Matrix

Data Matrix -koodi on 2D-symboli, joka koodaa hyötykuormansa mustien ja valkoisten solujen ruudukkona, samaan tapaan kuin QR-koodi. Se eroaa QR-koodista kahdella käytännöllisellä tavalla: se on pienempi samalla hyötykuorman koolla (koodaus on tiheämpi) ja se on suunnattu teolliseen käyttöön kuluttajakäytön sijaan (jossa QR-koodit hallitsevat). Tehdaslattialla metalliosiin laseretsatut kuviot, integroitujen piirien koteloihin tulostetut tarrat, lääkeruiskuihin sijoitetut merkit – kaikki nuo ovat tyypillisesti Data Matrix -koodeja, eivät QR-koodeja.

find_datamatrices() skannaa kehyksestä Data Matrix -koodit ja palauttaa listan DataMatrix -tulosolioita:

codes = img.find_datamatrices()

for c in codes:
    img.draw_rectangle(c.rect, color=(0, 255, 0))
    print(c.payload, c.rows, c.columns)

roi rajoittaa hakua tavalliseen tapaan. Ainoa dekooderikohtainen viritysnuppi on effort, kokonaisluku, joka säätelee sitä, kuinka kovasti dekooderi tekee työtä löytääkseen osuman. Suuremmat arvot parantavat heikkojen, vaurioituneiden tai vinojen koodien tunnistusta kehysnopeuden kustannuksella; pienemmät arvot toimivat nopeammin mutta voivat ohittaa koodeja, jotka suurempi ponnistus olisi löytänyt. Noin 160:tä pienemmät arvot epäonnistuvat käytännössä tunnistamisessa; noin 240:tä suuremmat arvot tuottavat vähenevää hyötyä. Oletus 200 on järkevä tasapaino selkeälle kuvalle, ja oikea lähtökohta uudelle sovellukselle on oletus plus tai miinus 20 sen mukaan, ovatko kohteet puhtaita (pienempi) vai vaurioituneita (suurempi).

Jokainen tunnistus kantaa rajauslaatikon sanaston ja neljä tunnistettua kulmaa, dekoodatun payload-arvon ja kuvatasossa olevan rotation-kulman radiaaneina. Asettelun metatiedot kuvaavat dekooderin lukeman symbolin koon ja tiheyden: rows ja columns ovat dataruudukon solumäärät; capacity on hyötykuorman merkkien enimmäismäärä, jonka symboli voisi tuossa koossa kantaa; padding on se, kuinka monta noista paikoista jäi käyttämättä (capacity - len(payload)).

Asettelukentät ovat hyödyllisiä sovelluksille, joiden on validoitava etsatun merkin muoto sen sisällön sijaan. Osaseurantajärjestelmä saattaa vaatia, että kaikki merkit ovat 12-kertaa-12-koodeja, joissa on enintään kaksi täytemerkkiä; tunnistus, joka palautui 8-kertaa-8-kokoisena (pienempi symboli kuin määritys edellyttää) tai 10 täytemerkillä (enimmäkseen tyhjä), merkitään uudelleenmerkittäväksi.

5.29.3. Milloin valita kumpi

Siinä missä QR-koodin ja AprilTagin valinta perustui hyötykuorman lajiin (mielivaltainen data vastaan pieni tunniste), viivakoodien ja Data Matrix -koodien valinta perustuu fyysiseen tiheyteen ja toimialaan.

Kun sovellus on kuluttajille suunnattu ja koodit ovat jo kentällä olemassa – ruokakaupat, kirjat, lähetystarrat, kirjaston kirjat – oikea tunnistin on find_barcodes(). Sovelluksen lukemat koodit tulostettiin toisen järjestelmän luettaviksi, ja standardoidut vähittäissymboliikat ovat sitä, mitä tuo järjestelmä odotti.

Kun sovellus on teollinen ja koodit tulostetaan sovellusta varten – varastonseuranta tehdaslattialla, osiin etsatut eräkoodit, lääkinnällisten laitteiden jäljitettävyysmerkit – oikea tunnistin on find_datamatrices() tai find_qrcodes(), riippuen siitä, tarvitseeko sovellus Data Matrixin suuremman tiheyden vai QR:n laajemman työkalutuen.

Kourallinen sovelluksia yhdistää kaikki neljä tunnistinta yhteen putkeen. Pakkaustarkastuskamera saattaa suorittaa find_barcodes() -läpikäynnin tulostetulle UPC:lle, find_qrcodes() -läpikäynnin samassa laatikossa olevalle lähetys-QR-koodille ja find_datamatrices() -läpikäynnin etsatulle osakoodille, kaikki samalla otetulla kehyksellä; kolme tuloslistaa korreloidaan rajauslaatikon sijainnin perusteella ja raportoidaan yhtenä tunnistustietueena. Kunkin tunnistimen kustannus kasautuu, joten näin tekevät sovellukset tyypillisesti kaventavat kunkin läpikäynnin sopivalla roi-arvolla sen sijaan, että hakisivat koko kehyksestä jokaista koodityyppiä.