5.29. Barkodlar ve Data Matrix kodları

İki kod ailesi daha kameranın çözücülerini tamamlar. Tek boyutlu barkodlar – bir mısır gevreği kutusunun yanındaki çizgiler, bir hastane bilekliği, bir kargo etiketi – hâlâ günlük kullanımda olan en eski makine tarafından okunabilir simgelerdir. Data Matrix kodları QR kodları gibi iki boyutludur, ancak aynı veri yükü boyutunda daha yoğundur ve endüstriyel işaretlemeye yöneliktir – duvardaki bir poster yerine bir devre kartına lazerle kazınmış üretici işareti. image modülünde her biri için, tüketici 2B kodlarının hiçbir zaman tam olarak ulaşamadığı endüstriyel, perakende ve envanter uygulamalarını kapsayan özel bir çözücü vardır.

5.29.1. 1B barkodlar

Bir tek boyutlu barkod, veri yükünü değişen genişlikte dikey çubuklar dizisi olarak kodlar ve soldan sağa (veya dikey yönlendirilmiş kodlar için yukarıdan aşağıya) okunur. Genişlikler küçük bir değer kümesinden birine niceliklenir ve genişlik dizisi, yazıcının seçtiği simgelemede (symbology) karakterleri oluşturur: bir UPC ürün kodu için sayısal, bir depo parça numarası için alfasayısal veya bir Code 128 etiketi için keyfi metin.

find_barcodes(), çerçeveyi desteklenen simgelemelerden herhangi birindeki 1B barkodlar için tarar ve bir BarCode sonuç nesneleri listesi döndürür:

codes = img.find_barcodes()

for c in codes:
    img.draw_rectangle(c.rect, color=(0, 255, 0))
    print(c.payload, c.type, c.quality)

Çözücü, çerçeveyi tek bir çağrıda hem yatay hem dikey olarak tarar, böylece herhangi bir açıda basılmış bir barkod, uygulamanın girişi döndürmesine gerek kalmadan tek geçişte bulunur. roi aramayı sınırlandırır; başka ayar parametresi yoktur – çözücü kendi içinde tamdır.

Desteklenen simgelemeler, yaygın tüketici ve endüstriyel aileleri kapsar. Perakende kümesi image.EAN2, image.EAN5, image.EAN8, image.UPCE, image.UPCA, image.EAN13 (çoğu tüketici ambalajındaki sayısal sabit uzunluklu kodlar), image.ISBN10 ve image.ISBN13‘tür (kitaplar için yeniden amaçlandırılmış aynı aileler). Genel amaçlı küme image.I25 (Interleaved 2 of 5, kargo etiketlerinde yaygın), image.CODABAR (kütüphanelerde ve kan bankalarında kullanılır), image.CODE39, image.CODE93 ve image.CODE128‘dir (keyfi metin için değişken uzunluklu alfasayısal simgelemeler). Raf kenarı ailesi image.DATABAR (RSS-14) ve image.DATABAR_EXP (RSS-Expanded) listeyi tamamlar.

Her tespit, sınırlayıcı kutu sözlüğünü – x, y, w, h, rect, corners – ve kodu çözülmüş payload değerini bir dizgi olarak taşır. type, yukarıdaki listeden gelen simgeleme sabitidir; bir uygulama, özellikle hangi ailenin kodunun çözüldüğüyle ilgilendiğinde bunu kontrol eder (ör. bir market tarayıcı uygulaması için yalnızca EAN13 kabul etmek).

Filtreleme için önemli olan iki alan rotation ve quality‘dir. rotation, barkodun radyan cinsinden görüntü düzlemi içi açısıdır: çözücü keyfi dönüşlerle başa çıkar, ancak tespiti temiz bir şekilde görüntülemek isteyen aşağı akış kodu, belirli bir eşiğin ötesinde eğik dönen kodları filtrelemek isteyebilir.

quality, kodu çözme sayısıdır: aynı veri yükünü başarıyla çözen tarama satırı sayısı. Çözücü, çerçevenin barkodla kesişen her satırını (ve sütununu) tarar ve kod çözme her başarılı olduğunda sayacı artırır. Net odakta ve iyi aydınlatmada basılmış bir barkod, onlu seviyede bir quality verir; kısmen örtülmüş veya bulaşmış bir barkod yalnızca bir veya iki tarama satırında çözülebilir ve 1 – 2 quality bildirir. quality > 5 altındaki tespitleri filtrelemek, gerçek tespitlere hiçbir maliyet getirmeden geçici tek tarama satırlı hatalı çözümleri eler.

Bir 1B barkod uygulaması küçüktür. Bir çerçeve yakalayın, find_barcodes() çağırın, döndürülen listeyi yineleyin, c.type ve c.quality üzerinde filtreleyin ve c.payload değerini UART veya USB üzerinden, taramayı kaydeden veya kasaya işleyen hangi aşağı akış aşaması varsa ona iletin.

5.29.2. Data Matrix

Bir Data Matrix kodu, veri yükünü bir QR kodunun yaptığı gibi siyah ve beyaz hücrelerden oluşan bir ızgara olarak kodlayan bir 2B simgedir. Bir QR kodundan iki pratik açıdan farklıdır: aynı veri yükü boyutunda daha küçüktür (kodlama daha yoğundur) ve tüketici kullanımı yerine (QR kodlarının baskın olduğu) endüstriyel kullanıma yöneliktir. Bir fabrika zemininde metal parçalara lazerle kazınmış desenler, entegre devre paketlerine basılmış etiketler, tıbbi şırıngalara yerleştirilmiş işaretler – bunların hepsi tipik olarak QR kodları değil Data Matrix’lerdir.

find_datamatrices(), çerçeveyi Data Matrix kodları için tarar ve bir DataMatrix sonuç nesneleri listesi döndürür:

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 aramayı her zamanki şekilde sınırlandırır. Çözücüye özgü tek ayar düğmesi, çözücünün bir eşleşme bulmak için ne kadar çok çalışacağını kontrol eden bir tam sayı olan effort‘tur. Daha yüksek değerler, çerçeve hızı pahasına soluk, hasarlı veya eğik kodların tespitini iyileştirir; daha düşük değerler daha hızlı çalışır ancak daha yüksek effort’un bulacağı kodları kaçırabilir. Yaklaşık 160’ın altındaki değerler etkili bir şekilde tespiti başaramaz; yaklaşık 240’ın üzerindeki değerler azalan getiri sağlar. Varsayılan olan 200, net bir görüntü için makul bir dengedir ve yeni bir uygulama için doğru başlangıç noktası, hedeflerin temiz (daha düşük) mi yoksa yıpranmış (daha yüksek) mı olduğuna bağlı olarak varsayılanın artı veya eksi 20’sidir.

Her tespit, sınırlayıcı kutu sözlüğünü ve tespit edilen dört köşeyi, kodu çözülmüş payload değerini ve radyan cinsinden görüntü düzlemi içi rotation açısını taşır. Düzen meta verisi, çözücünün okuduğu simgenin boyutunu ve yoğunluğunu tanımlar: rows ve columns, veri ızgarasının hücre sayılarıdır; capacity, simgenin o boyutta taşıyabileceği maksimum veri yükü karakteri sayısıdır; padding, bu yuvalardan kaç tanesinin kullanılmadığıdır (capacity - len(payload)).

Düzen alanları, kazınmış bir işaretin içeriğini değil biçimini doğrulaması gereken uygulamalar için kullanışlıdır. Bir parça takip sistemi, tüm işaretlerin en fazla iki dolgu karakterine sahip 12’ye 12 kodlar olmasını isteyebilir; 8’e 8 olarak dönen (spesifikasyonun gerektirdiğinden daha küçük bir simge) veya 10 dolgu karakterine sahip (çoğunlukla boş) bir tespit yeniden işaretleme için işaretlenir.

5.29.3. Hangisinin ne zaman seçileceği

QR ile AprilTag karşılaştırması veri yükü türüne (keyfi veri ile küçük kimlik) dayanırken, barkodlar ile Data Matrix kodları karşılaştırması fiziksel yoğunluk ve sektöre dayanır.

Uygulama tüketiciye yönelikse ve kodlar zaten sahada mevcutsa – bakkaliye, kitaplar, kargo etiketleri, kütüphane kitapları – doğru dedektör find_barcodes()‘tur. Uygulamanın okuduğu kodlar farklı bir sistemin okuması için basılmıştır ve standartlaştırılmış perakende simgelemeleri o sistemin beklediği şeydir.

Uygulama endüstriyelse ve kodlar uygulama için basılıyorsa – bir fabrika zemininde envanter takibi, parçalara kazınmış parti kodları, tıbbi cihazlardaki izlenebilirlik işaretleri – doğru dedektör, uygulamanın Data Matrix’in daha yüksek yoğunluğuna mı yoksa QR’nin daha geniş araç desteğine mi ihtiyaç duyduğuna bağlı olarak find_datamatrices() veya find_qrcodes()‘tur.

Az sayıda uygulama, tek bir hatta dört dedektörü de karıştırır. Bir paket denetim kamerası, basılı UPC için bir find_barcodes() geçişi, aynı kutu üzerindeki bir kargo QR kodu için bir find_qrcodes() geçişi ve kazınmış bir parça kodu için bir find_datamatrices() geçişi çalıştırabilir, hepsi aynı yakalanan çerçeve üzerinde; üç sonuç listesi sınırlayıcı kutu konumuna göre ilişkilendirilir ve tek bir tespit kaydı olarak raporlanır. Her dedektörün maliyeti eklenir, bu nedenle bunu yapan uygulamalar genellikle her geçişi, her tür kod için tüm çerçeveyi taramak yerine uygun bir roi ile daraltır.