5.28. QR kodovi i AprilTagovi

Detektori obrađeni do sada – mrlje, linije, kružnice, pravokutnici – pronalaze geometrijske značajke: položaje i obrise koje neka kasnija faza tumači. Preostali detektori pronalaze simboličke značajke: tiskane uzorke čija vizualna struktura postoji upravo zato da bi kodirala neki sadržaj. Kamera ih locira, dekoder čita bitove, a ono što se vraća nije položaj nego niz znakova (ili ID) koji je tvorac simbola namjerno odabrao.

Dvije takve obitelji dominiraju aplikacijama s malim kamerama. QR kodovi nose proizvoljan tekst, URL-ove, kontaktne kartice ili binarne sadržaje – to su 2D kodovi okrenuti potrošaču koji se pojavljuju na plakatima, ambalaži i ukrcajnim kartama. AprilTagovi nose jedan numerički ID iz malog fiksnog skupa, dekodiraju se brzo čak i s velike udaljenosti te (kada se dostave intrinzični parametri leće) izvještavaju o pozi sa 6 stupnjeva slobode u okviru kamere – to su 2D kodovi okrenuti robotici koji označavaju dronove, kalibracijske mete i fiducijalne oznake. Oba detektora vraćaju objekte s rezultatima koji koriste isti rječnik graničnog okvira kao i detektori mrlja i pravokutnika, ali ih sadržaj čini istinski drugačijima od svega što je dosad obrađeno.

5.28.1. QR kodovi

find_qrcodes() pretražuje sličicu za QR kodovima i vraća popis objekata s rezultatima tipa QRCode:

codes = img.find_qrcodes()

for c in codes:
    img.draw_rectangle(c.rect, color=(0, 255, 0))
    for corner in c.corners:
        img.draw_circle((corner[0], corner[1], 4),
                        color=(0, 255, 0))
    print(c.payload)

Detektor prima jedan neobavezni roi za ograničavanje pretraživanja. Treba ulaz u sivim tonovima – sličica u boji interno se pretvara prije dekodiranja.

Svaka detekcija nosi granični okvir (x, y, w, h, rect), četiri otkrivena kuta (corners, projektivni četverokut koji ocrtavaju uzorci za pronalaženje QR koda) te dekodirani sadržaj kao niz znakova. Kutovi su ono što treba crtati pri označavanju detekcije – QR kod gledan iz kuta nije poravnat s osima i granični okvir daje samo grub obris.

Metapodaci dekodera obuhvaćaju sve što je QR dekoder usput saznao. version je verzija QR koda, 1 – 40, koja određuje veličinu mreže modula (kod verzije 1 širok je 21 modul, kod verzije 40 širok je 177). ecc_level je razina ispravljanja pogrešaka (0 – 3 za L / M / Q / H); više razine rezerviraju više kodnih riječi za ispravljanje pogrešaka i preživljavaju veće oštećenje uz cijenu manje prostora za sadržaj. mask je uzorak maske (0 – 7) koji je koder odabrao kako bi smanjio zabunu dekodera. data_type je kodiranje koje je dekoder prijavio – numeričko, alfanumeričko, binarno ili Kanji – a zastavice is_numeric / is_alphanumeric / is_binary / is_kanji izlažu istu vrijednost kao prijateljskije booleane.

eci je vrijednost proširene interpretacije kanala (Extended Channel Interpretation), koja identificira kodiranje teksta u kojem se nalaze bajtovi (UTF-8, ISO-8859-1 i tako dalje). QR kod s proizvoljnog tiskanog materijala ne mora biti zajamčeno UTF-8; aplikacija koja treba ispravno dekodirati bajtove provjerava eci i dekodira u skladu s tim. Posebno slučaj Kanjija: MicroPython ne raščlanjuje Kanji kodiranje, pa se sadržaj s is_kanji mora tretirati kao polje bajtova i dekodirati od strane aplikacije.

Tipična uporaba: kamera čita QR kodove s pokretne trake i prijavljuje dekodirani sadržaj domaćinu. Kamera jednom po sličici pokreće find_qrcodes(), prolazi kroz vraćeni popis, bira kodove čiji data_type odgovara onome što aplikacija očekuje i prosljeđuje c.payload preko UART-a ili USB-a. Podaci o graničnom okviru i kutovima korisni su za pregled u IDE-u, ali nisu ono do čega je domaćinu stalo.

5.28.2. AprilTagovi

find_apriltags() pretražuje sličicu za AprilTagovima i vraća popis objekata s rezultatima tipa AprilTag:

tags = img.find_apriltags(families=image.TAG36H11)

for t in tags:
    img.draw_rectangle(t.rect, color=(0, 255, 0))
    img.draw_cross(t.cx, t.cy, color=(0, 255, 0))
    print(t.id, t.decision_margin)

AprilTagovi se od QR kodova razlikuju po svojim ciljevima dizajna. QR kod je izrađen da kodira proizvoljne podatke u jedan gusti simbol koji korisnik pročita jednom iz blizine. AprilTag je izrađen da kodira mali ID u rijetki simbol koji kamera neprekidno čita s udaljenosti, uz onoliko tolerancije na pogreške koliko dopušta Hammingov kod njegove obitelji. Kompromis se pokazuje u oba smjera: QR kod može nositi stotine bajtova, ali ga treba čitati izbliza; AprilTag nosi samo nekoliko stotina jedinstvenih ID-ova, ali se pouzdano čita s nekoliko metara udaljenosti.

Ključna riječ families prima bitnu masku obitelji oznaka koje treba dekodirati. Dostupne obitelji su image.TAG16H5, image.TAG25H9, image.TAG36H10, image.TAG36H11, image.TAGCIRCLE21H7, image.TAGCIRCLE49H12, image.TAGCUSTOM48H12, image.TAGSTANDARD41H12 i image.TAGSTANDARD52H13. Svaka obitelj razmjenjuje broj ID-ova za otpornost. Broj H u nazivu je minimalna Hammingova udaljenost između bilo koja dva koda u obitelji – koliko bitova mora promijeniti vrijednost prije nego što jedan valjani kod postane drugi – TAG16H5 ima 30 ID-ova na udaljenosti 5, TAG25H9 ima 35 ID-ova na udaljenosti 9, a TAG36H11 (zadani i najčešći) ima 587 ID-ova na udaljenosti 11. Detektor ispravlja do dvije pogreške u bitovima bez obzira na obitelj, pa udaljenost odlučuje koliko je taj ispravak riskantan: nasumični uzorak u šumovitoj sličici mora se samo naći unutar dva bita od valjanog koda da bi se dekodirao kao lažna detekcija, a obitelji s većom udaljenošću raspoređuju svoje kodove toliko rjeđe da takvi sudari postaju rijetki – razlog zašto je TAG36H11 preporučeni izbor. Vrijeme detekcije raste s brojem omogućenih obitelji, pa aplikacija omogućuje samo ono što zapravo tiska. Bitna maska je bitovni OR konstanti obitelji kada je u jednom pozivu potrebno više obitelji.

Svaka detekcija nosi rječnik graničnog okvira – x, y, w, h, rect, area, cjelobrojne i subpikselne centroide (cx, cy, cxf, cyf) – i četiri otkrivena kuta (corners). Slijede polja za identifikaciju: id je numerički ID unutar obitelji (0 – 586 za TAG36H11), family je numerička konstanta obitelji, a name je naziv obitelji kao niz znakova.

Polja kvalitete podudaranja su ono što aplikacija koristi za filtriranje detekcija. decision_margin je ocjena pouzdanosti od 0.0 – 1.0; više je bolje, a filtriranje detekcija ispod decision_margin > 0.1 uklanja većinu lažnih pogodaka bez ikakvih troškova. hamming broji pogreške u bitovima koje je dekoder prihvatio za ovu oznaku – niže je bolje, pri čemu 0 znači savršeno dekodiranje. goodness je povijesna metrika kvalitete slike koju trenutni dekoder više ne izračunava; uvijek je 0.0 i može se zanemariti.

5.28.3. Poza iz intrinzičnih parametara

Transformativna značajka metode find_apriltags(), ona koja opravdava AprilTagove kao odabranu fiducijalnu oznaku u robotici, jest da metoda može oporaviti pozu oznake sa 6 stupnjeva slobode u okviru kamere izravno iz otkrivenih kutova i malog skupa kalibracijskih intrinzičnih parametara. Intrinzični parametri su X i Y žarišne duljine kamere u pikselima (fx, fy) i optičko središte u pikselima (cx, cy), a sva četiri aplikacija jednom izmjeri kalibracijskim postupkom i nakon toga zapiše kao fiksne vrijednosti.

Kada se dostave intrinzični parametri, vraćeni AprilTag popunjava svoja polja x_translation, y_translation, z_translation položajem oznake u odnosu na kameru te x_rotation, y_rotation, z_rotation (i duplikat rotation radi simetrije) orijentacijom oznake. Bez intrinzičnih parametara svih šest polja iznosi 0.0 i aplikacija je odgovorna za bilo kakvu procjenu poze koja joj treba.

Polja translacije izvještavaju se u širinama oznake: dekoder tretira oznaku kao 1 jedinicu širine, pa aplikacija svaku translaciju množi fizičkom širinom tiskane oznake kako bi dobila metričke udaljenosti. Oznaka tiskana širine 100 mm koja prijavljuje z_translation = 8.3 udaljena je 830 mm od kamere; ista oznaka tiskana širine 50 mm na istoj udaljenosti prijavila bi z_translation = 16.6. Polja rotacije su u radijanima i ne trebaju skaliranje.

Procjena poze osnova je za širok raspon robotičkih aplikacija: pristajanje robota na stanicu za punjenje označenu oznakom, praćenje tiskane putanje s međutočkama, oporavak vlastite poze kamere iz više poznatih oznaka u okolini. Kamera koja zna intrinzične parametre, vidi oznaku i ima stvarni položaj te oznake ima, istom aritmetikom, stvarni položaj i za samu sebe.

5.28.4. Kada odabrati koji

QR kodovi i AprilTagovi rješavaju različite probleme. Izbor između njih svodi se na ono što tiskani simbol nosi.

Kada aplikacija treba kroz tiskani simbol nositi proizvoljne podatke – URL, niz sa serijskim brojem, kontaktni zapis – QR kod je pravi izbor. Stotine bajtova stanu u kod umjerene veličine, kodiranje je javno i podržano na svakom pametnom telefonu, a dekoder se nosi s rotacijom, umjerenim oštećenjem i kosim kutovima.

Kada aplikacija treba mali ID koji se neprekidno čita s udaljenosti uz neobaveznu pozu – fiducijalnu oznaku na pokretnom robotu, kalibracijsku metu u prostoriji, oznaku za pristajanje na stanici za punjenje – AprilTag je pravi izbor. Stotine ID-ova dovoljno je za tu primjenu, Hammingov kod oporavlja se od pogrešaka u bitovima koje bi pobijedile QR kod, a procjena poze je besplatna nakon što su intrinzični parametri kalibrirani.

Neke aplikacije koriste oboje: AprilTag označava poznatu lokaciju, a pridruženi QR kod (tiskan pokraj) nosi metapodatke o tome što ta lokacija znači. Dva detektora pokreću se neovisno na istoj sličici, a aplikacija povezuje njihove granične okvire kako bi uparila svaku oznaku s njezinim pratećim kodom.