5.29. Čárové kódy a kódy Data Matrix

Nabídku dekodérů kamery doplňují další dvě skupiny kódů. Jednorozměrné čárové kódy – pruhy na boku krabice od cereálií, nemocniční náramek, přepravní štítek – jsou nejstaršími strojově čitelnými symboly, které jsou stále v každodenním používání. Kódy Data Matrix jsou dvourozměrné jako QR kódy, ale hustší při stejné velikosti datové zátěže a zaměřené na průmyslové značení – výrobní značka laserem vyleptaná na desce plošných spojů spíše než plakát na zdi. Modul image má vyhrazený dekodér pro každý z nich, který pokrývá průmyslové, maloobchodní a inventarizační aplikace, na které spotřebitelské 2D kódy nikdy úplně nedosáhly.

5.29.1. 1D čárové kódy

Jednorozměrný čárový kód kóduje svou datovou zátěž jako posloupnost svislých čar různých šířek, čtených zleva doprava (nebo shora dolů u svisle orientovaných kódů). Šířky se kvantizují na jednu z malé množiny hodnot a posloupnost šířek vyjadřuje znaky v té symbologii, kterou tiskárna zvolila: číselné pro produktový kód UPC, alfanumerické pro skladové číslo dílu nebo libovolný text pro štítek Code 128.

find_barcodes() prohledává snímek na 1D čárové kódy v kterékoli z podporovaných symbologií a vrací seznam výsledkových objektů 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)

Dekodér prohledává snímek vodorovně i svisle v jediném volání, takže čárový kód vytištěný pod jakýmkoli úhlem je nalezen v jednom průchodu, aniž by aplikace musela vstup otáčet. roi omezuje hledání; žádné další ladicí parametry neexistují – dekodér je soběstačný.

Podporované symbologie pokrývají běžné spotřebitelské a průmyslové skupiny. Maloobchodní sadou jsou image.EAN2, image.EAN5, image.EAN8, image.UPCE, image.UPCA, image.EAN13 (číselné kódy s pevnou délkou na většině spotřebitelských obalů), image.ISBN10 a image.ISBN13 (tytéž skupiny přeúčelované pro knihy). Univerzální sadou jsou image.I25 (Interleaved 2 of 5, běžné u přepravních štítků), image.CODABAR (používané v knihovnách a krevních bankách), image.CODE39, image.CODE93 a image.CODE128 (alfanumerické symbologie s proměnnou délkou pro libovolný text). Seznam doplňuje skupina pro hrany regálů image.DATABAR (RSS-14) a image.DATABAR_EXP (RSS-Expanded).

Každá detekce nese slovník ohraničujícího rámečku – x, y, w, h, rect, corners – a dekódovanou payload jako řetězec. type je konstanta symbologie ze seznamu výše, kterou aplikace kontroluje, když jí konkrétně záleží na tom, která skupina byla dekódována (např. přijetí pouze EAN13 pro aplikaci pokladního skeneru).

Dvě pole, na kterých záleží při filtrování, jsou rotation a quality. rotation je úhel čárového kódu v rovině obrazu v radiánech: dekodér si poradí s libovolnými rotacemi, ale navazující kód, který chce detekci zobrazit čistě, může chtít odfiltrovat kódy, které se vrátí nakloněné za nějaký práh.

quality je počet dekódování: počet skenovacích řádků, které úspěšně dekódovaly tutéž datovou zátěž. Dekodér probíhá přes každý řádek (a sloupec) snímku, který protíná čárový kód, a pokaždé, když dekódování uspěje, zvyšuje počítadlo. Vytištěný čárový kód v ostrém zaostření a dobrém osvětlení dává quality v desítkách; částečně zakrytý nebo rozmazaný čárový kód se může dekódovat jen na jednom či dvou skenovacích řádcích a hlásit quality 1 – 2. Odfiltrování detekcí pod quality > 5 zahodí přechodná chybná dekódování z jediného skenovacího řádku bez újmy na skutečných detekcích.

Aplikace pro 1D čárové kódy je malá. Zachyťte snímek, zavolejte find_barcodes(), projděte vrácený seznam, filtrujte podle c.type a c.quality a předejte c.payload přes UART nebo USB do jakékoli navazující fáze, která sken zaznamenává nebo účtuje.

5.29.2. Data Matrix

Kód Data Matrix je 2D symbol, který kóduje svou datovou zátěž jako mřížku černých a bílých buněk, stejně jako to dělá QR kód. Od QR kódu se liší ve dvou praktických ohledech: je menší při stejné velikosti datové zátěže (kódování je hustší) a je zaměřen na průmyslové použití spíše než na spotřebitelské použití (kde dominují QR kódy). Vzory laserem vyleptané do kovových dílů na výrobní hale, štítky vytištěné na pouzdrech integrovaných obvodů, značky umístěné na lékařských injekčních stříkačkách – to všechno jsou typicky kódy Data Matrix, nikoli QR kódy.

find_datamatrices() prohledává snímek na kódy Data Matrix a vrací seznam výsledkových objektů 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 omezuje hledání obvyklým způsobem. Jediným ladicím ovladačem specifickým pro dekodér je effort, celé číslo, které řídí, jak tvrdě dekodér pracuje na nalezení shody. Vyšší hodnoty zlepšují detekci slabých, poškozených nebo šikmých kódů za cenu snímkové frekvence; nižší hodnoty běží rychleji, ale mohou zmeškat kódy, které by vyšší úsilí našlo. Hodnoty pod přibližně 160 fakticky selhávají v detekci; hodnoty nad přibližně 240 přinášejí klesající výnosy. Výchozí hodnota 200 je rozumnou rovnováhou pro čistý obraz a správným výchozím bodem pro novou aplikaci je výchozí hodnota plus minus 20 podle toho, zda jsou cíle čisté (nižší) nebo poškozené (vyšší).

Každá detekce nese slovník ohraničujícího rámečku a čtyři detekované rohy, dekódovanou payload a rotation v rovině obrazu v radiánech. Metadata rozvržení popisují velikost a hustotu symbolu, který dekodér přečetl: rows a columns jsou počty buněk datové mřížky; capacity je maximální počet znaků datové zátěže, který by symbol mohl při dané velikosti nést; padding je počet těchto slotů, které zůstaly nevyužité (capacity - len(payload)).

Pole rozvržení jsou užitečná pro aplikace, které potřebují validovat formát vyleptané značky spíše než její obsah. Systém sledování dílů může vyžadovat, aby všechny značky byly kódy 12 krát 12 s nejvýše dvěma znaky výplně; detekce, která se vrátila jako 8 krát 8 (menší symbol, než specifikace vyžaduje) nebo s 10 znaky výplně (převážně prázdná), je označena k novému značení.

5.29.3. Kdy zvolit který

Zatímco QR oproti AprilTag se rozhodovalo podle druhu datové zátěže (libovolná data oproti malému ID), čárové kódy oproti kódům Data Matrix se rozhodují podle fyzické hustoty a odvětví.

Když je aplikace zaměřená na spotřebitele a kódy v terénu již existují – potraviny, knihy, přepravní štítky, knihovní knihy – správným detektorem je find_barcodes(). Kódy, které aplikace čte, byly vytištěny ke čtení jiným systémem a standardizované maloobchodní symbologie jsou tím, co tento systém očekával.

Když je aplikace průmyslová a kódy jsou tištěny pro tuto aplikaci – sledování zásob na výrobní hale, kódy šarží vyleptané na dílech, značky vysledovatelnosti na zdravotnických prostředcích – správným detektorem je find_datamatrices() nebo find_qrcodes(), podle toho, zda aplikace potřebuje vyšší hustotu Data Matrix nebo širší nástrojovou podporu QR.

Hrstka aplikací kombinuje všechny čtyři detektory v jednom řetězci. Kamera pro kontrolu balíků může spustit průchod find_barcodes() pro vytištěný UPC, průchod find_qrcodes() pro přepravní QR kód na téže krabici a průchod find_datamatrices() pro vyleptaný kód dílu, vše na témže zachyceném snímku; tři výsledkové seznamy jsou korelovány podle pozice ohraničujícího rámečku a hlášeny jako jediný záznam detekce. Náklady každého detektoru se sčítají, takže aplikace, které toto dělají, obvykle zužují každý průchod vhodným roi namísto prohledávání celého snímku na každý druh kódu.