Barcode Nasıl Okunur ?

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Barcode Nasıl Okunur ?

Mesaj gönderen mrmarman »

Merhaba.

- Günümüzde yaygın olarak kullanılan BARCODE üzerine bilgi sahibi olmak isteyenlere minik bir perspektif sunmak için bu başlığı açtım. :)

- Geçtiğimiz günlerde Internet üzerinde dolaşırken Barcode okuma üzerine bir bilgiye rastladım. Basite indirgeyerek resimlerle destekleyip güzelce anlatmışlar.

- Biz yazılımcılara sunulmuş ZBAR gibi açık kaynaklı çözümler var. Buradaki amacım, barcode okuma tekniğin nasılı konusunun anlaşılmasına katkı sağlayabilmek. :idea:

- Buraya tıklayarak erişeceğiniz "How to Read 12 Digit UPC Barcodes" başlıklı sitede resimli olarak bir barcode'u gözle okuma üzerine bir yöntem anlatılmış. Ben de kolları sıvadım ki ilgilenenlere yönelik iyi bir başlangıç noktası olarak değerlendirdiğimden paylaşmak istedim. :)

Resim - Resim - Resim

:arrow: Resimdeki çubuklardan en soldaki görülen ilk dikey siyah ve beyaz çubuk genişliği bize referans olacaktır. Tüm satır boyunca aynı genişlikte ne kadar beyaz ve siyah aralık olduğunu ölçmeyi sağlayacaktır.

- Resim üzerinde canvas operasyonları ile ortadan sadece 1 pixellik height kadarlık kısımdan ölçümleme yapacağız. Bunu soldan baştan adım adım sağa doğru giderek yapacağız.

- İlk referans çubukların genişliğini kullanmak kafidir demiştik. Özetle kalın bir çizgi veya kalın bir beyaz boşluk aslında 7'şer birimden oluşan bütünün birer parçasıdır.

- Adımlarımız en soldaki bu dikey çubuk kadarlık width değerinde olacak ve boş dolu hesabı yapılarak satır sonunda işlem sona erecektir.

Resim
- Göreceğiniz gibi yanyana en fazla 4 siyah veya 4 beyaz alan doluluk gösteriyor. Bunu hata düzeltme fonksiyonlarımızda kullanabiliriz. :!:
- Bu Barcode içeren resmin ortasından, bir pixel height ölçülü bütün bir yatay satırı alıp örneklediğimizde aşağıdaki gibi bir açılım elde ediyoruz. :idea:
(B olanlar siyah, W olanlar beyaz)
Resim

Kod: Tümünü seç

    // Gözle takip edin, resimdeki barcode'da görülen çubukların dönüşüm sonuçlarıdır.
    // BWBWBWBBBBWBWWWBBWWWWBWBWWBWWBBWWWWBWBWBBBWWBWBWBWBWBWWWWBWWBBBWBBWWBBWBBWWBBWBBWWBBWBWBBBWWBWB
:arrow: Bu dizilimi en aşağıdaki DuzSayisalOkuma fonksiyonuna verdiğimizde, fonksiyon önce "yan yana kaçar tane B ve W olduğunu" sayacak aşağıdaki şekle dönüştürecek, ardından da bu 4'lükleri ayırarak karşılığı rakamsal ifadeye dönüştürdüğünü göreceksiniz.

Kod: Tümünü seç

    // 11111141132411121224111132111111111412312221222122211132111
- Geriye elde edilen bitişik rakamların aşağıdaki şekilde sayısal karşılığa dönüştürülmesi kalıyor.
- Başta 111 ortada 11111 sonda 111 dikkate almıyoruz bu çizgiler separator/belirteç olarak yer alıyorlar.

Kod: Tümünü seç

    // (111)-1114-1132-4111-2122-4111-1321-(11111)-1114-1231-2221-2221-2221-1132-(111)
:!: Unutmadan, bu 4'lükleri aşağıdaki listeden hem düz hem de ayna halindeki ters olarak arıyoruz. Çubukların yerleşiminin farklı oluşu barcode tekniği ile alakalı.

Kod: Tümünü seç

3211 = 0
2221 = 1
2122 = 2
1411 = 3
1132 = 4
1231 = 5
1114 = 6
1312 = 7
1213 = 8
3112 = 9
:bravo: Sizi aşağıdaki fonksiyonla baş başa bırakıyorum. Basit bir canvas operasyonu ile bir image satırını okumak kolay. Daha önce OCR makalesinde nasıl yapıldığını anlatmıştım. Burada başka bir optical recognition örneğini ele almış olduk.

Kod: Tümünü seç

function DuzSayisalOkuma( strSatir: String ): String;
Var
  iDigit, iSay  : Integer;
  strRakamsal   : String;
begin
  With TStringList.Create do
  begin
    Delimiter       := ',';
    StrictDelimiter := True;
                     //  0    1    2    3    4    5    6    7    8    9
    DelimitedText   := '3211,2221,2122,1411,1132,1231,1114,1312,1213,3112'
                     // Ayna Halleri
                     +',1123,1222,2212,1141,2311,1321,4111,2131,3121,2113';

    // Şimdi yan yana kaçtane B / W varsa onları sayıp rakamsal ifadeye dönüştürüyoruz.
    // Örnek Dönüşüm
    // BWBWBWBBBBWBWWWBBWWWWBWBWWBWWBBWWWWBWBWBBBWWBWBWBWBWBWWWWBWWBBBWBBWWBBWBBWWBBWBBWWBBWBWBBBWWBWB
    // 11111141132411121224111132111111111412312221222122211132111
    strRakamsal := '';
    iSay        := 1;
    while strSatir <> '' do begin
      if Length(strSatir) > 1 then begin
        if strSatir[1] = strSatir[2]
        then inc(iSay)
        else begin
          strRakamsal := strRakamsal + IntToStr(iSay);
          iSay := 1;
        end;
      end
      else strRakamsal := strRakamsal + IntToStr(iSay); // son 1'i de ekledik...
      System.Delete(strSatir,1,1);
    end;
    strSatir := strRakamsal;
    System.Delete(strSatir, 1, 3);                       // 111 LeftGuide silindi
    system.Delete(strSatir, Pos('11111', strSatir), 5 ); // Center Separator silindi
    system.Delete(strSatir, Length(strSatir)-2, 3);      // 111 RightGuide silindi

    Result    := '';
    while strSatir <> '' do
    begin
      iDigit := IndexOf( Copy(strSatir, 1, 4) );
      // İkinci sıra reverse hali.
      if iDigit > 9 then Dec(iDigit,10);
      if iDigit < 0
      then Result := Result + '?'
      else Result := Result + IntToStr( iDigit );
      system.Delete(strSatir, 1, 4);
    end;
    Free;
  end;
end;
EDIT : İmla düzeltmeleri
En son mrmarman tarafından 07 Ara 2015 05:49 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Barcode Nasıl Okunur ?

Mesaj gönderen xozcanx »

Elinize Sağlık Hocam, Güzel bir makale olmuş :bravo:
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
mehmetantalya
Üye
Mesajlar: 189
Kayıt: 30 Eyl 2013 10:17

Re: Barcode Nasıl Okunur ?

Mesaj gönderen mehmetantalya »

elinize saglik
Cevapla