5.29. Crtični kodovi i Data Matrix kodovi¶
Još dvije obitelji kodova zaokružuju kamerine dekodere. Jednodimenzionalni crtični kodovi – pruge na boku kutije žitarica, bolnička narukvica, otpremna naljepnica – najstariji su strojno čitljivi simboli koji su još u svakodnevnoj uporabi. Data Matrix kodovi dvodimenzionalni su poput QR kodova, no gušći su pri istoj veličini sadržaja i namijenjeni industrijskom označavanju – oznaka proizvođača laserski urezana u tiskanu pločicu, a ne plakat na zidu. Modul image ima namjenski dekoder za svaki, pokrivajući industrijske, maloprodajne i inventurne primjene koje potrošački 2D kodovi nikada nisu sasvim dosegnuli.
5.29.1. 1D crtični kodovi¶
Jednodimenzionalni crtični kod kodira svoj sadržaj kao niz okomitih crta promjenjive širine, koje se čitaju slijeva nadesno (ili odozgo prema dolje za okomito orijentirane kodove). Širine se kvantiziraju na jednu od malog skupa vrijednosti, a niz širina ispisuje znakove u onoj simbologiji koju je pisač odabrao: numeričkoj za UPC kod proizvoda, alfanumeričkoj za skladišni broj dijela ili proizvoljnom tekstu za Code 128 naljepnicu.
find_barcodes() pretražuje sličicu za 1D crtične kodove u bilo kojoj od podržanih simbologija i vraća popis rezultatskih objekata BarCode:
codes = img.find_barcodes()
for c in codes:
img.draw_rectangle(c.rect, color=(0, 255, 0))
print(c.payload, c.type, c.quality)
Dekoder pretražuje sličicu i vodoravno i okomito u jednom pozivu, pa se crtični kod otisnut pod bilo kojim kutom pronalazi u jednom prolazu, a da aplikacija ne mora zakretati ulaz. roi ograničava pretragu; nikakvi drugi parametri ugađanja ne postoje – dekoder je samodostatan.
Podržane simbologije pokrivaju uobičajene potrošačke i industrijske obitelji. Maloprodajni skup čine image.EAN2, image.EAN5, image.EAN8, image.UPCE, image.UPCA, image.EAN13 (numerički kodovi fiksne duljine na većini potrošačke ambalaže), image.ISBN10 i image.ISBN13 (iste obitelji prenamijenjene za knjige). Općenamjenski skup čine image.I25 (Interleaved 2 of 5, čest na otpremnim naljepnicama), image.CODABAR (rabi se u knjižnicama i krvnim bankama), image.CODE39, image.CODE93 i image.CODE128 (alfanumeričke simbologije promjenjive duljine za proizvoljan tekst). Obitelj za rubove polica image.DATABAR (RSS-14) i image.DATABAR_EXP (RSS-Expanded) zaokružuju popis.
Svaka detekcija nosi rječnik graničnog okvira – x, y, w, h, rect, corners – te dekodirani payload kao niz. type je konstanta simbologije s gornjeg popisa, koju aplikacija provjerava kada joj je važno koja je obitelj točno dekodirana (npr. prihvaćanje samo EAN13 za aplikaciju skenera u trgovini).
Dva polja koja su važna za filtriranje jesu rotation i quality. rotation je kut crtičnog koda u ravnini slike izražen u radijanima: dekoder se nosi s proizvoljnim zakretima, ali kôd nizvodno koji želi uredno prikazati detekciju možda će htjeti odfiltrirati kodove koji se vrate nagnuti preko nekog praga.
quality je broj dekodiranja: broj linija skeniranja koje su uspješno dekodirale isti sadržaj. Dekoder prelazi preko svakog retka (i stupca) sličice koji presijeca crtični kod te uvećava brojač svaki put kad dekodiranje uspije. Otisnuti crtični kod u oštrom fokusu i pri dobrom osvjetljenju daje quality u desecima; djelomično zaklonjen ili razmrljan crtični kod mogao bi se dekodirati na samo jednoj ili dvije linije skeniranja i prijaviti quality od 1 – 2. Odfiltriravanje detekcija ispod quality > 5 odbacuje prolazna pogrešna dekodiranja s jedne linije skeniranja bez ikakvog troška za prave detekcije.
Aplikacija za 1D crtične kodove je malena. Snimi sličicu, pozovi find_barcodes(), prođi kroz vraćeni popis, filtriraj po c.type i c.quality te proslijedi c.payload preko UART-a ili USB-a do bilo koje nizvodne faze koja bilježi ili naplaćuje skeniranje.
5.29.2. Data Matrix¶
Data Matrix kod 2D je simbol koji kodira svoj sadržaj kao mrežu crnih i bijelih ćelija, onako kako to čini QR kod. Razlikuje se od QR koda u dva praktična pogleda: manji je pri istoj veličini sadržaja (kodiranje je gušće) i usmjeren je na industrijsku uporabu, a ne na potrošačku (gdje QR kodovi prevladavaju). Uzorci laserski urezani u metalne dijelove na tvorničkom podu, naljepnice otisnute na pakiranjima integriranih sklopova, oznake postavljene na medicinske štrcaljke – sve su to obično Data Matrix kodovi, a ne QR kodovi.
find_datamatrices() pretražuje sličicu za Data Matrix kodove i vraća popis rezultatskih objekata DataMatrix:
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 ograničava pretragu na uobičajen način. Jedini parametar ugađanja specifičan za dekoder jest effort, cijeli broj koji upravlja koliko se naporno dekoder trudi pronaći podudaranje. Veće vrijednosti poboljšavaju detekciju slabih, oštećenih ili kosih kodova po cijenu brzine sličica; manje vrijednosti rade brže, ali mogu propustiti kodove koje bi veći trud pronašao. Vrijednosti ispod otprilike 160 praktički ne uspijevaju u detekciji; vrijednosti iznad otprilike 240 daju sve manji povrat. Zadana vrijednost 200 razuman je kompromis za jasnu sliku, a prava polazna točka za novu aplikaciju jest zadana vrijednost plus ili minus 20, ovisno o tome jesu li mete čiste (niže) ili oštećene (više).
Svaka detekcija nosi rječnik graničnog okvira i četiri otkrivena kuta, dekodirani payload te rotation u ravnini slike izražen u radijanima. Metapodaci o rasporedu opisuju veličinu i gustoću simbola koji je dekoder pročitao: rows i columns brojevi su ćelija mreže podataka; capacity je najveći broj znakova sadržaja koje bi simbol mogao nositi pri toj veličini; padding je koliko je tih mjesta ostalo neiskorišteno (capacity - len(payload)).
Polja rasporeda korisna su za aplikacije koje trebaju provjeriti format urezane oznake, a ne njezin sadržaj. Sustav za praćenje dijelova mogao bi zahtijevati da sve oznake budu kodovi 12-puta-12 s najviše dva znaka popune; detekcija koja se vratila kao 8-puta-8 (manji simbol nego što specifikacija propisuje) ili s 10 znakova popune (uglavnom prazna) označava se za ponovno označavanje.
5.29.3. Kada koji odabrati¶
Dok se QR naspram AprilTag svodio na vrstu sadržaja (proizvoljni podaci naspram malog ID-a), crtični kodovi naspram Data Matrix kodova svode se na fizičku gustoću i industriju.
Kada je aplikacija okrenuta potrošaču, a kodovi već postoje na terenu – namirnice, knjige, otpremne naljepnice, knjižnične knjige – pravi detektor jest find_barcodes(). Kodovi koje aplikacija čita otisnuti su da ih čita neki drugi sustav, a standardizirane maloprodajne simbologije ono su što je taj sustav očekivao.
Kada je aplikacija industrijska, a kodovi se tiskaju za samu aplikaciju – praćenje inventara na tvorničkom podu, kodovi serija urezani na dijelove, oznake sljedivosti na medicinskim uređajima – pravi detektor jest find_datamatrices() ili find_qrcodes(), ovisno o tome treba li aplikaciji veća gustoća Data Matrixa ili šira alatna podrška QR-a.
Šačica aplikacija miješa sva četiri detektora u jednom cjevovodu. Kamera za pregled paketa mogla bi pokrenuti prolaz find_barcodes() za otisnuti UPC, prolaz find_qrcodes() za otpremni QR kod na istoj kutiji te prolaz find_datamatrices() za urezani kod dijela, sve na istoj snimljenoj sličici; tri se rezultatska popisa povezuju prema položaju graničnog okvira i prijavljuju kao jedinstveni zapis detekcije. Trošak svakog detektora se zbraja, pa aplikacije koje ovo rade obično sužavaju svaki prolaz odgovarajućim roi umjesto da pretražuju cijelu sličicu za svaku vrstu koda.