Python ve OpenCV Kullanarak Barkod Okuyucu Uygulaması

4 2.716

Bu yazımızda Python ve OpenCV kullanarak barkod okuyucu uygulaması geliştireceğiz. Daha önce Python kullanarak karekod (qrcode) oluşturma ve karekod okuma uygulamaları geliştirmiştik. Bu yazımız da tüm ticari ürünlerin üzerinde olan barkodların okuma işlemini Python ve  OpenCv kullanarak nasıl yapabileceğimizi anlatacağız.

Barkod Nedir?

 

Barkodçubuk kod ya da çizgi im, verilerin görsel özellikli makinelerin okuyabilmesi için çeşitli kodlama yöntemleriyle sunulmasıdır.

Orijinal olarak barkod, veriyi paralel çizgilerin genişlikleri ve boşlukları arasında saklardı, ama günümüzde noktasal şekiller, iç içe daireler ve görüntü içinde gizli şekiller gibi farklı türlerde de görülebiliyorlar.

barkod örneği

Üstte Code-128 tekniğiyle kodlanmış bir barkod örneği görüyorsunuz. Code-128 tekniğiyle kodlanmış barkodlara yazılar kodlanabilirken, Code-11, Code-39 gibi daha eski tekniklerde sadece sayısal bilgiler saklanabilir.

Barkod okuyucu Uygulaması İçin Gerekli Kütüphaneler

Bu yazımızda , bir görüntüdeki barkodun nasıl algılanacağını ve kodunun nasıl çözüleceğini kontrol edeceğiz. Bunun için pyzbar kütüphanesini kullanacağız. Ayrıca görüntüyü dosyasını okuyup, ekranda göstermek için OpenCV kütüphanesini kullanacağız.

Pyzbar kütüphanesini kolayca kurmak için aşağıdaki komutu kullanabilirsiniz:

pip install pyzbar

Bu eğitim Python’un 3.7.2 sürümü ile test edilmiştir.

Barkod Uygulaması Kodları

Cv2 modülünü içe aktararak başlayacağız , böylece test görüntümüzü numpy dizi olarak okuyabiliriz . Ayrıca, kod çözme işlevini barkodu algılamak ve kodunu çözmek için kullanacağımız pyzbar modülünden de içe aktaracağız .

import cv2
from pyzbar.pyzbar import decode

Bundan sonra dosya sisteminden test görüntüsünü okuyacağız. Bunu, imread fonksiyonuna bir çağrı ile yapacağız ve dosya yoluna sahip bir dize girdi olarak geçeceğiz .

Buradaki siteden ücretsiz olarak online barkod oluşturmak için kullanabilirsiniz. Bu makalemiz için “Jn7.net” verisiyle bir barkod oluşturduk. Uygulamamızı test etmek için alttaki barkod görüntüsünü kullanabilirsiniz.

barkod örneği

İmread fonksiyonu, çıktı olarak, görüntüyü sayısal ndarray olarak döndürür .

image = cv2.imread('barcode.jpg')

Ardından, görüntüdeki barkodun kodunu çözmek için içe aktardığımız kod decode fonksiyonunu çağırmamız ve görüntüyü girdi olarak geçmemiz gerekir.

Bu işlev, Decoded sınıfında bir dizi nesne döndürür . Dizinin her öğesi algılanan bir barkodu temsil eder. Bu, kütüphaneyi birden çok barkodlu görüntülerle kullanabileceğimiz anlamına gelir.

detectedBarcodes = decode(image)

Bizim durumumuzda, resmimizin sadece bir barkodu var, bu nedenle bu dizinin sadece tek bir öğe içermesi bekleniyor. Bununla birlikte, daha sağlam bir kod için, bir for in döngüsü ile dizi üzerinden tekrarlayacağız , yani bir, birden fazla veya hiç barkod bulunmadığında çalışacaktır.

for barcode in detectedBarcodes:
     # handling each barcode

Barkod nesnemizden elde edebileceğimiz özelliklerden birine rect denir . Barkodun karşılık geldiği çokgenin sınırlayıcı kutusunu içerir.

Bu basit örnek için, barkodun herhangi bir dönüşü olmadığı ve bu nedenle bir dikdörtgen oluşturduğu bir görüntü kullanıyoruz. Bunu göz önünde bulundurarak, barkodun etrafına bir şekil çizmek için rect özelliğini kullanabiliriz .

Bununla birlikte, daha karmaşık senaryolar için, Barcode nesnesi , barkodun etrafında çokgeni oluşturan noktaları içeren çokgen özelliğine de sahiptir . Burada barkod döndürüldüğünde rect özelliğinin çokgene nasıl davrandığını kontrol edebilirsiniz .

Burada rect niteliğini kullanacağımızdan, onu analiz edeceğiz. Temel olarak, dikdörtgenin sol üst köşesinin x ve y koordinatlarını, genişliğini ve yüksekliğini içeren bir sınıftır . Bunları 4 farklı değişken olarak elde edeceğiz.

(x, y, w, h) = barcode.rect

Bu koordinatları kullanarak , cv2 modülünden dikdörtgen işlevini çağırarak görüntüdeki dikdörtgeni çizeceğiz .

cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 5)

Ayrıca, kodu çözülen içeriği barkoddan ( veri özelliği) ve barkod türünü ( tür özelliği) yazdıracağız . Test görüntüsünde Kod 128 barkodu kullandım .

 

print(barcode.data)
print(barcode.type)

Dolu döngü aşağıda görülebilir.

for barcode in detectedBarcodes:
     
    (x, y, w, h) = barcode.rect
    cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 5)
  
    print(barcode.data)
    print(barcode.type)

Sonlandırmak için, zaten barkodun çevresinde dikdörtgen bulunan görüntüyü bir pencerede görüntüleriz.

cv2.imshow("Image", image)
  
cv2.waitKey(0)
cv2.destroyAllWindows()

Son kod aşağıda görülebilir.

import cv2
from pyzbar.pyzbar import decode




image = cv2.imread('C:/Users/N/Desktop/barcode.png')


detectedBarcodes = decode(image)


for barcode in detectedBarcodes:
     
    (x, y, w, h) = barcode.rect
    cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 5)
  
    print(barcode.data)
    print(barcode.type)




cv2.imshow("Image", image)
  
cv2.waitKey(0)
cv2.destroyAllWindows()

Kodu test etme

Önceki kodu test etmek için, sadece seçtiğiniz bir ortamda çalıştırın. Bir Python IDE olan IDLE’yi kullandım.

Şekil 2’ye benzer bir sonuç elde etmelisiniz. Görüldüğü gibi görüntüde barkod tespit edildi ve doğru verilerin kodu çözüldü ve piton kabuğuna yazdırıldı.

Sitemizde Python ve OpenCV kullanarak hazırladığımız birçok ders içeriği bulunmaktadır.

Yorumlarınızı bekliyoruz.

4 Yorumlar
  1. Erdem diyor

    Merhaba
    Bu konuda basit bir program yapmak istiyorum ama bir yerde tıkandım kaldım. Hem MacBook da hem PC de aynı hatayla karşılaşıyorum. Pythonla ilgili çok yeniyim. Bilgisayarıma python.org dan 3.10 sürümünü kurudum. Daha sonra pycharm kurup pycharm da opencv-python, numpy ve pyzbar ı kurdum. Hepsi başarı ile install oldu fakat pyzbar da hata veriyor. opencv komutlarını kullanıp webcamı açtırıyorum görüntü yakalıyorum ama from pyzbar.pyzbar import decode komutunu ekleyince hata ile karşılaşıyorum. Modül bulunamadı diyor. Birşeyleri eksik yapıyorum ama soracak kimse olmayınca 2 gündür tıkandım kaldım. Acaba python versiyonu ile mi alakalı. Kurulumu pis ile de yaptım ama sonuç aynı.

    1. Halil İbrahim K. diyor

      Kesinlikle sürümle alakalıdır. pip install pyzbar komutunu tekrar deniyin. Olmazsa pip uninstall pyzbar deyip tekrar kurun. Python içinde daha eski bir sürüm 3.7 gibi deneyin.

  2. Fatih diyor

    Hocam merhaba ben barkod ve QR kod algılama işlemini sorunsuz gerçekleştirdim ancak kameradan algılanan QR kod yada barkod linklerini ( barkoda ait metin bilgilerini ) bir text dosyasında depolamak istiyorum ama bunu henüz başarabilmiş değilim bu konuda önerebileceğiniz bir site video var mıdır şimdiden çok teşekkür ederim

    1. Halil İbrahim K. diyor

      Metinleri dosyaya kaydetmek python ile çok basittir.
      tahsilat_dosyası = open(“tahsilat_dosyası.txt”, “w”)
      bu komut bir metin dosyasını yazma modunda açar.
      dosya.write(yazılacak_şeyler)
      üstteki komut ile de dosyaya istediğiniz yazıyı ekleyebilirsiniz.
      ths = open(“tahsilat_dosyası.txt”, “w”)
      ths.write(“Halil Pazarlama: 120.000 TL”)
      ths.close()
      Örnek koldar bunlar. En son dosyayı kapaman gerek.
      https://python-istihza.yazbel.com/temel_dosya_islemleri.html burada Python ile dosya işlemleri ayrıntılı anlatılmıştır. Oradan daha detaylı bilgi alabilirsin.

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bununla iyi olduğunuzu varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul etmek Mesajları Oku