5.28. QR-kódok és AprilTag-ek¶
Az eddigi detektorok – foltok, vonalak, körök, téglalapok – geometriai jellemzőket találnak: pozíciókat és körvonalakat, amelyeket egy későbbi feldolgozási lépés értelmez. A hátralévő detektorok szimbolikus jellemzőket találnak: olyan nyomtatott mintázatokat, amelyek vizuális szerkezete kifejezetten egy adattartalom kódolására szolgál. A kamera megtalálja őket, a dekódoló kiolvassa a biteket, és ami visszakapunk, az nem pozíció, hanem egy karakterlánc (vagy egy azonosító), amelyet a szimbólum nyomtatója szándékosan választott meg.
Két ilyen család uralja a kis kamerás alkalmazásokat. A QR-kódok tetszőleges szöveget, URL-eket, névjegykártyákat vagy bináris adattartalmat hordoznak – ezek a fogyasztóknak szánt 2D-s kódok, amelyek plakátokon, csomagolásokon és beszállókártyákon jelennek meg. Az AprilTag-ek egyetlen numerikus azonosítót hordoznak egy kis, rögzített készletből, gyorsan dekódolhatók még nagy távolságból is, és (ha az objektív belső paramétereit megadjuk) egy 6-DoF pózt jelentenek a kamera képkockájában – ezek a robotikának szánt 2D-s kódok, amelyek drónokat, kalibrációs célpontokat és viszonyítási pontokat jelölnek. Mindkét detektor olyan eredményobjektumokat ad vissza, amelyek ugyanazt a határoló doboz szókészletet használják, mint a folt- és téglalap-detektorok, de az adattartalom valóban megkülönbözteti őket bármitől, amit eddig tárgyaltunk.
5.28.1. QR-kódok¶
A find_qrcodes() átvizsgálja a képkockát QR-kódok után, és QRCode eredményobjektumok listáját adja vissza:
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)
A detektor egyetlen opcionális roi paramétert fogad a keresés korlátozására. Szürkeárnyalatos bemenetre van szüksége – egy színes képkockát belsőleg alakít át a dekódolás előtt.
Minden észlelés hordozza a határoló dobozt (x, y, w, h, rect), a négy észlelt sarkot (corners, a projektív négyszög, amelyet a QR-kód kereső mintázatai rajzolnak ki), és a dekódolt adattartalmat karakterláncként. A sarkok a megfelelő dolog, amit rajzolni érdemes az észlelés annotálásakor – egy ferdén nézett QR-kód nem tengelyhez igazított, és a határoló doboz csak egy laza körvonalat ad.
A dekódoló metaadatok mindent lefednek, amit a QR-dekódoló útközben megtudott. A version a QR-kód verziója, 1 – 40, amely meghatározza a modulrács méretét (egy 1-es verziójú kód 21 modul széles, egy 40-es verziójú kód 177). Az ecc_level a hibajavítási szint (0 – 3 az L / M / Q / H számára); a magasabb szintek több kódszót tartanak fenn a hibajavításra, és több sérülést viselnek el, kevesebb adathely árán. A mask a maszkmintázat (0 – 7), amelyet a kódoló a dekódoló összezavarodásának minimalizálására választott. A data_type a kódolás, amelyet a dekódoló jelentett – numerikus, alfanumerikus, bináris vagy Kanji –, és az is_numeric / is_alphanumeric / is_binary / is_kanji jelzők ugyanazt az értéket tárják fel barátságosabb logikai értékként.
Az eci az Extended Channel Interpretation értéke, amely azonosítja a bájtok szövegkódolását (UTF-8, ISO-8859-1 és így tovább). Egy tetszőleges nyomtatott anyagról származó QR-kód nem feltétlenül garantáltan UTF-8; egy alkalmazás, amelynek helyesen kell dekódolnia a bájtokat, ellenőrzi az eci értéket, és annak megfelelően dekódol. Különösen a Kanji eset esetében: a MicroPython nem értelmezi a Kanji kódolást, így egy is_kanji adattartalmat bájttömbként kell kezelni, és az alkalmazásnak kell dekódolnia.
Egy tipikus felhasználás: egy kamera QR-kódokat olvas le egy szállítószalagról, és jelenti a dekódolt adattartalmat egy hosztnak. A kamera képkockánként egyszer futtatja a find_qrcodes() metódust, végigjárja a visszaadott listát, kiválasztja azokat a kódokat, amelyek data_type értéke megfelel annak, amit az alkalmazás vár, és továbbítja a c.payload értéket UART-on vagy USB-n. A határoló doboz és sarokadatok hasznosak az IDE előnézetéhez, de nem ezek érdeklik a hosztot.
5.28.2. AprilTag-ek¶
A find_apriltags() átvizsgálja a képkockát AprilTag-ek után, és AprilTag eredményobjektumok listáját adja vissza:
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)
Az AprilTag-ek tervezési céljaikban különböznek a QR-kódoktól. Egy QR-kódot úgy építenek, hogy tetszőleges adatot kódoljon egyetlen sűrű szimbólumban, amelyet a felhasználó egyszer olvas le közelről. Egy AprilTag-et úgy építenek, hogy egy kis azonosítót kódoljon egy ritka szimbólumban, amelyet a kamera folyamatosan olvas távolból, annyi hibatűréssel, amennyit a családja Hamming-kódja megenged. A kompromisszum mindkét irányban megmutatkozik: egy QR-kód több száz bájtot hordozhat, de közelről kell leolvasni; egy AprilTag csak néhány száz egyedi azonosítót hordoz, de méterekről megbízhatóan olvasható.
A families kulcsszó a dekódolandó tag-családok bitmaszkját fogadja. Az elérhető családok: image.TAG16H5, image.TAG25H9, image.TAG36H10, image.TAG36H11, image.TAGCIRCLE21H7, image.TAGCIRCLE49H12, image.TAGCUSTOM48H12, image.TAGSTANDARD41H12 és image.TAGSTANDARD52H13. Minden család az azonosítók számát mérlegeli a robusztussággal szemben. A névben szereplő H szám a család bármely két kódja közötti minimális Hamming-távolság – hány bitnek kell átfordulnia, mielőtt egy érvényes kód egy másikká válna – a TAG16H5 30 azonosítóval rendelkezik 5-ös távolságon, a TAG25H9 35 azonosítóval 9-es távolságon, a TAG36H11 pedig (az alapértelmezett és a leggyakoribb) 587 azonosítóval 11-es távolságon. A detektor a családtól függetlenül legfeljebb két bithibát javít, így a távolság dönti el, mennyire kockázatos ez a javítás: egy zajos képkockában lévő véletlenszerű mintázatnak csak egy érvényes kód két bitjén belülre kell esnie ahhoz, hogy téves észlelésként dekódolódjon, és a nagyobb távolságú családok annyira sokkal ritkábban szórják szét kódjaikat, hogy az ilyen ütközések ritkává válnak – ez az oka annak, hogy a TAG36H11 az ajánlott választás. A detektálási idő az engedélyezett családok számával skálázódik, így egy alkalmazás csak azt engedélyezi, amit ténylegesen nyomtat. A bitmaszk a család-konstansok bitenkénti OR-ja, ha egy híváson belül több családra van szükség.
Minden észlelés hordozza a határoló doboz szókészletet – x, y, w, h, rect, area, egész és szubpixeles súlypontok (cx, cy, cxf, cyf) – és a négy észlelt sarkot (corners). Az azonosító mezők következnek: az id a numerikus azonosító a családon belül (0 – 586 a TAG36H11 esetében), a family a numerikus család-konstans, a name pedig a család neve karakterláncként.
A találatminőség mezők azok, amelyeket egy alkalmazás az észlelések szűrésére használ. A decision_margin egy 0.0 – 1.0 közötti megbízhatósági pontszám; a magasabb jobb, és a decision_margin > 0.1 alatti észlelések kiszűrése a legtöbb hamis találatot költségmentesen kitisztítja. A hamming megszámolja a bithibákat, amelyeket a dekódoló elfogadott ehhez a taghez – az alacsonyabb jobb, a 0 tökéletes dekódolást jelent. A goodness egy korábbi képminőségi metrika, amelyet a jelenlegi dekódoló már nem számít ki; mindig 0.0, és figyelmen kívül hagyható.
5.28.3. Póz a belső paraméterekből¶
A find_apriltags() átalakító jelentőségű funkciója, az, amely az AprilTag-eket a robotika választott viszonyítási pontjaként igazolja, az, hogy a metódus képes visszanyerni a tag 6-DoF pózát a kamera képkockájában közvetlenül az észlelt sarkokból és egy kis kalibrációs belső paraméterkészletből. A belső paraméterek a kamera X és Y fókusztávolságai képpontban (fx, fy) és az optikai középpont képpontban (cx, cy), amely négy értéket az alkalmazás egyszer mér meg egy kalibrációs eljárással, és ezután fixen beépít.
Ha a belső paramétereket megadjuk, a visszaadott AprilTag feltölti az x_translation, y_translation, z_translation mezőit a tag kamerához viszonyított pozíciójával, valamint az x_rotation, y_rotation, z_rotation (és a szimmetria kedvéért a duplikált rotation) mezőit a tag tájolásával. Belső paraméterek nélkül mind a hat mező 0.0, és az alkalmazás felelős minden szükséges pózbecslésért.
Az eltolási mezők tag-szélességekben vannak megadva: a dekódoló a taget 1 egység szélesnek tekinti, így az alkalmazás minden eltolást megszoroz a nyomtatott tag fizikai szélességével a metrikus távolságok megszerzéséhez. Egy 100 mm széles nyomtatott tag, amely z_translation = 8.3 értéket jelent, 830 mm-re van a kamerától; ugyanaz a tag 50 mm szélesre nyomtatva ugyanazon a távolságon z_translation = 16.6 értéket jelentene. Az elforgatási mezők radiánban vannak, és nem igényelnek skálázást.
A pózbecslés a robotikai alkalmazások széles körének alapja: egy robot dokkolása egy taggel jelölt töltőállomáshoz, egy nyomtatott útpontnyom követése, a kamera saját pózának visszanyerése a környezetben lévő több ismert tagből. Egy kamera, amely ismeri a belső paramétereket, lát egy taget, és valós helyzettel rendelkezik a tag számára, ugyanazzal a számítással valós helyzettel rendelkezik önmaga számára is.
5.28.4. Mikor melyiket válasszuk¶
A QR-kódok és AprilTag-ek különböző problémákat oldanak meg. A köztük lévő választás azon múlik, hogy mit hordoz a nyomtatott szimbólum.
Amikor az alkalmazásnak tetszőleges adatot kell hordoznia a nyomtatott szimbólumon keresztül – egy URL-t, egy sorozatszám-karakterláncot, egy névjegyrekordot –, a QR-kód a megfelelő választás. Több száz bájt elfér egy mérsékelt méretű kódban, a kódolás nyilvános és minden okostelefonon támogatott, és a dekódoló megbirkózik az elforgatással, a mérsékelt sérüléssel és a ferde szögekkel.
Amikor az alkalmazásnak egy kis azonosítóra van szüksége, amelyet folyamatosan, távolból olvas, opcionális pózzal – egy viszonyítási pont egy mozgó roboton, egy kalibrációs célpont egy szobában, egy dokkolójelölő egy töltőállomáson –, az AprilTag a megfelelő választás. Több száz azonosító bőven elég a felhasználási esethez, a Hamming-kód helyreáll az olyan bithibákból, amelyek egy QR-kódot legyőznének, és a pózbecslés ingyenes, ha a belső paraméterek kalibrálva vannak.
Néhány alkalmazás mindkettőt használja: egy AprilTag egy ismert helyet jelöl, és egy hozzá tartozó QR-kód (mellé nyomtatva) hordozza a metaadatokat arról, hogy az a hely mit jelent. A két detektor egymástól függetlenül fut ugyanazon a képkockán, és az alkalmazás korrelálja a határoló dobozaikat, hogy minden taget a társkódjához illesszen.