5.28. QR kodları ve AprilTag’ler

Şimdiye kadarki tespit ediciler – noktalar, çizgiler, daireler, dikdörtgenler – geometrik öznitelikleri bulur: bir alt aşamanın yorumladığı konumları ve ana hatları. Geriye kalan tespit ediciler sembolik öznitelikleri bulur: görsel yapısı özellikle bir yük (payload) kodlamak için var olan basılı desenler. Kamera onları konumlandırır, kod çözücü bitleri okur ve geri dönen şey bir konum değil, sembolü basanın bilinçli olarak seçtiği bir dizedir (ya da bir ID).

Küçük kamera uygulamalarında bu tür iki aile öne çıkar. QR kodları keyfi metin, URL, kişi kartı veya ikili yükler taşır – posterlerde, ambalajlarda ve biniş kartlarında görünen, tüketiciye yönelik 2D kodlardır. AprilTag’ler küçük sabit bir kümeden tek bir sayısal ID taşır, uzak mesafelerden bile hızlıca çözülür ve (mercek iç parametreleri verildiğinde) kamera çerçevesinde 6-DoF bir poz bildirir – drone’ları, kalibrasyon hedeflerini ve referans işaretlerini işaretleyen, robotiğe yönelik 2D kodlardır. Her iki tespit edici de nokta (blob) ve dikdörtgen tespit edicilerinin kullandığıyla aynı sınırlayıcı kutu kelime dağarcığına sahip sonuç nesneleri döndürür, ancak yük onları şimdiye kadar ele alınan her şeyden gerçekten farklı kılar.

5.28.1. QR kodları

find_qrcodes() çerçeveyi QR kodları için tarar ve bir QRCode sonuç nesnesi listesi döndürür:

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)

Tespit edici, aramayı kısıtlamak için tek bir isteğe bağlı roi alır. Gri tonlamalı girdiye ihtiyaç duyar – bir renkli çerçeve kod çözmeden önce dahili olarak dönüştürülür.

Her tespit, sınırlayıcı kutuyu (x, y, w, h, rect), tespit edilen dört köşeyi (corners, QR kodunun bulucu desenlerinin oluşturduğu izdüşümsel dörtgen) ve çözülen yükü bir dize olarak taşır. Tespiti işaretlerken çizilmesi gereken doğru şey köşelerdir – eksen dışından görülen bir QR kodu eksene hizalı değildir ve sınırlayıcı kutu yalnızca gevşek bir ana hat verir.

Kod çözücü meta verileri, QR kod çözücüsünün süreç boyunca öğrendiği her şeyi kapsar. version, modül ızgara boyutunu belirleyen QR kodu sürümüdür, 1 – 40 (sürüm-1 kodu 21 modül genişliğinde, sürüm-40 kodu 177’dir). ecc_level, hata düzeltme seviyesidir (L / M / Q / H için 0 – 3); daha yüksek seviyeler hata düzeltme için daha fazla kod sözcüğü ayırır ve daha az yük alanı pahasına daha fazla hasara dayanır. mask, kodlayıcının kod çözücü karışıklığını en aza indirmek için seçtiği maske desenidir (0 – 7). data_type, kod çözücünün bildirdiği kodlamadır – sayısal, alfasayısal, ikili veya Kanji – ve is_numeric / is_alphanumeric / is_binary / is_kanji bayrakları aynı değeri daha kullanıcı dostu mantıksal değerler olarak sunar.

eci, baytların hangi metin kodlamasında olduğunu belirleyen Genişletilmiş Kanal Yorumlama (Extended Channel Interpretation) değeridir (UTF-8, ISO-8859-1 vb.). Keyfi basılı malzemeden gelen bir QR kodunun UTF-8 olacağı garanti edilemez; baytları doğru çözmesi gereken bir uygulama eci değerini kontrol eder ve buna göre kod çözer. Özellikle Kanji durumu: MicroPython Kanji kodlamasını ayrıştırmaz, bu nedenle bir is_kanji yükü bir bayt dizisi olarak ele alınmalı ve uygulama tarafından çözülmelidir.

Tipik bir kullanım: bir kamera bir konveyörden QR kodları okur ve çözülen yükü bir ana bilgisayara bildirir. Kamera, çerçeve başına bir kez find_qrcodes() çalıştırır, döndürülen listeyi yineler, data_type değeri uygulamanın beklediğiyle eşleşen kodları seçer ve c.payload değerini UART veya USB üzerinden iletir. Sınırlayıcı kutu ve köşe verileri IDE önizlemesi için yararlıdır ancak ana bilgisayarın umursadığı şey değildir.

5.28.2. AprilTag’ler

find_apriltags() çerçeveyi AprilTag’ler için tarar ve bir AprilTag sonuç nesnesi listesi döndürür:

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)

AprilTag’ler tasarım hedefleri açısından QR kodlarından farklıdır. Bir QR kodu, kullanıcının yakın mesafede bir kez okuduğu tek yoğun bir sembolde keyfi veriyi kodlamak için yapılmıştır. Bir AprilTag ise kameranın uzaktan sürekli olarak okuduğu seyrek bir sembolde, ailesinin Hamming kodunun izin verdiği kadar hata toleransıyla küçük bir ID’yi kodlamak için yapılmıştır. Ödünleşim her iki yönde de ortaya çıkar: bir QR kodu yüzlerce bayt taşıyabilir ancak yakından okunması gerekir; bir AprilTag yalnızca birkaç yüz benzersiz ID taşır ancak metrelerce uzaktan güvenilir biçimde okunur.

families anahtar sözcüğü, çözülecek etiket ailelerinin bir bit maskesini alır. Mevcut aileler şunlardır: image.TAG16H5, image.TAG25H9, image.TAG36H10, image.TAG36H11, image.TAGCIRCLE21H7, image.TAGCIRCLE49H12, image.TAGCUSTOM48H12, image.TAGSTANDARD41H12 ve image.TAGSTANDARD52H13. Her aile ID sayısı ile sağlamlık arasında bir ödünleşim yapar. İsimdeki H sayısı, ailedeki herhangi iki kod arasındaki minimum Hamming mesafesidir – geçerli bir kodun başka bir kodu dönüşmesi için kaç bitin değişmesi gerektiği – TAG16H5 mesafe 5’te 30 ID’ye, TAG25H9 mesafe 9’da 35 ID’ye ve TAG36H11 (varsayılan ve en yaygın olanı) mesafe 11’de 587 ID’ye sahiptir. Tespit edici, aile ne olursa olsun en fazla iki bit hatasını düzeltir, dolayısıyla mesafe bu düzeltmenin ne kadar riskli olduğunu belirler: gürültülü bir çerçevedeki rastgele bir desenin yanlış bir tespit olarak çözülmesi için yalnızca geçerli bir kodun iki biti içine düşmesi yeterlidir ve daha yüksek mesafeli aileler kodlarını çok daha seyrek dağıttığından bu tür çakışmalar nadir hale gelir – TAG36H11 ailesinin önerilen seçim olmasının nedeni budur. Tespit süresi etkin aile sayısıyla ölçeklenir, bu nedenle bir uygulama yalnızca gerçekten bastığını etkinleştirir. Bit maskesi, bir çağrıda birden fazla aileye ihtiyaç duyulduğunda aile sabitlerinin bit düzeyinde OR işlemidir.

Her tespit, sınırlayıcı kutu kelime dağarcığını – x, y, w, h, rect, area, tam sayı ve alt-piksel ağırlık merkezleri (cx, cy, cxf, cyf) – ve tespit edilen dört köşeyi (corners) taşır. Tanımlama alanları bunu izler: id, aile içindeki sayısal ID’dir (TAG36H11 için 0 – 586), family sayısal aile sabitidir ve name aile adının bir dize olarak halidir.

Eşleşme kalitesi alanları, bir uygulamanın tespitleri filtrelemek için kullandığı şeylerdir. decision_margin 0.0 – 1.0 arası bir güven puanıdır; daha yüksek olması daha iyidir ve decision_margin > 0.1 altındaki tespitleri filtrelemek, çoğu sahte isabeti bedelsiz olarak temizler. hamming, kod çözücünün bu etiket için kabul ettiği bit hatalarını sayar – daha düşük olması daha iyidir, 0 mükemmel bir çözüm anlamına gelir. goodness, mevcut kod çözücünün artık hesaplamadığı tarihsel bir görüntü kalitesi metriğidir; her zaman 0.0’dır ve göz ardı edilebilir.

5.28.3. İç parametrelerden poz

find_apriltags() yönteminin dönüştürücü özelliği, AprilTag’leri tercih edilen robotik referans işareti olarak haklı çıkaran şey, yöntemin etiketin kamera çerçevesindeki 6-DoF pozunu tespit edilen köşelerden ve küçük bir kalibrasyon iç parametreleri kümesinden doğrudan geri kazanabilmesidir. İç parametreler, kameranın piksel cinsinden X ve Y odak uzaklıkları (fx, fy) ve piksel cinsinden optik merkezidir (cx, cy); bu dördü de uygulamanın bir kalibrasyon prosedürüyle bir kez ölçtüğü ve ardından sabit kodladığı değerlerdir.

İç parametreler sağlandığında, döndürülen AprilTag nesnesi x_translation, y_translation, z_translation alanlarını etiketin kameraya göre konumuyla ve x_rotation, y_rotation, z_rotation (ve simetri için yinelenen rotation) alanlarını etiketin yönelimiyle doldurur. İç parametreler olmadan, altı alanın tümü 0.0’dır ve ihtiyaç duyulan herhangi bir poz kestiriminden uygulama sorumludur.

Öteleme alanları etiket genişlikleri cinsinden bildirilir: kod çözücü etiketi 1 birim genişliğinde olarak ele alır, bu nedenle uygulama metrik mesafeler elde etmek için her ötelemeyi basılı etiketin fiziksel genişliğiyle çarpar. 100 mm genişliğinde basılan ve z_translation = 8.3 bildiren bir etiket kameradan 830 mm uzaktadır; aynı mesafede 50 mm genişliğinde basılan aynı etiket z_translation = 16.6 bildirir. Dönüş alanları radyan cinsindendir ve herhangi bir ölçeklemeye ihtiyaç duymaz.

Poz kestirimi geniş bir robotik uygulama yelpazesinin temelidir: bir etiketle işaretlenmiş bir şarj istasyonuna bir robotun yanaşması, basılı bir yol noktası izini takip etme, ortamdaki birden fazla bilinen etiketten kameranın kendi pozunu geri kazanma. İç parametreleri bilen, bir etiket gören ve etiket için gerçek dünya konumu olan bir kamera, aynı aritmetikle kendisi için de bir gerçek dünya konumuna sahiptir.

5.28.4. Hangisini ne zaman seçmeli

QR kodları ve AprilTag’ler farklı sorunları çözer. Aralarındaki seçim, basılı sembolün ne taşıdığına dayanır.

Uygulamanın basılı sembol aracılığıyla keyfi veri taşıması gerektiğinde – bir URL, bir seri numarası dizesi, bir kişi kaydı – doğru seçim QR kodudur. Mütevazı boyutlu bir koda yüzlerce bayt sığar, kodlama herkese açıktır ve her akıllı telefonda desteklenir, ayrıca kod çözücü dönmeyle, orta düzey hasarla ve eğik açılarla başa çıkar.

Uygulamanın isteğe bağlı poz ile uzaktan sürekli okunan küçük bir ID’ye ihtiyacı olduğunda – hareket eden bir robottaki referans işareti, bir odadaki kalibrasyon hedefi, bir şarj istasyonundaki yanaşma işareti – doğru seçim AprilTag’dir. Yüzlerce ID bu kullanım durumu için fazlasıyla yeterlidir, Hamming kodu bir QR kodunu yenecek bit hatalarından kurtarır ve iç parametreler kalibre edildiğinde poz kestirimi bedelsizdir.

Bazı uygulamalar her ikisini de kullanır: bir AprilTag bilinen bir konumu işaretler ve ilişkili bir QR kodu (yanına basılmış) o konumun ne anlama geldiğine dair meta verileri taşır. İki tespit edici aynı çerçevede bağımsız olarak çalışır ve uygulama, her etiketi eşlik eden koduyla eşleştirmek için sınırlayıcı kutularını ilişkilendirir.