Barkod Okutma İşlemi

Bu yazımda c# vasıtası ile bilgisayarınızın kamerasını kullanarak bir barcode tarayıcı yapmaya çalışalım.

Bir windows form projesi açıp, formuma aşağıdaki araçları ekliyorum:

  • 2 Adet Label
  • 1 Adet Combobox
  • 1 Adet Picturebox
  • 1 Adet TextBox
  • 1 Adet Buton

Bu araçları kullanarak bilgisayarımızın kamerasını kullanacağız ve barcode okuttuğumuzda bu veriyi formumuza yazdıracağız. Tasarımım aşağıdaki gibi oldu:

Barkod Okutma İşlemi
Barkod Okutma İşlemi

Araçlarımın isimleri:

  • Combobox: cmbKamera
  • TextBox: txtBarcode
  • Buton: btnBasla

Label text özelliklerini, buton text özelliğini, form text özelliğini görseldeki gibi değiştirdim. Picturebox için isim değişmedim, BorderStyle özelliğini Fixed3D yaptım.

Sonra sağ tarafta projem üstünde sağ tıklıyorum ve Manage Nuget Packages diyorum.

Barkod Okutma İşlemi
Barkod Okutma İşlemi

Daha sonra çıkan alanda Browse seçiyorum (eğer daha önceden yükledi iseniz aramanıza gerek yok) ZXing .net kütüphanesini arıyorum ve projeme yüklüyorum.

Barkod Okutma İşlemi
Barkod Okutma İşlemi

Yüklendiğinde solution explorer alanında projeme ait references tıkladığımda Zxing referanslarını görebilmeliyim.

Barkod Okutma İşlemi
Barkod Okutma İşlemi

Zxing aslında java tarafından çalıştırılan, açık kaynak kodlu 1D/2D barcode image işleme kütüphanesidir.

Ek olarak bir de Aforge.Video.DirectShow kütüphanesini eklemem lazım. Yine Arama kısmında bu sefer Aforge yazıyorum.

Aforge.Vide.DirectShow seçiyor ve install diyerek yüklüyorum.

Barkod Okutma İşlemi
Barkod Okutma İşlemi

Yüklendiğinde solution explorer alanında projeme ait references tıkladığımda Aforge referanslarını görebilmeliyim.

Barkod Okutma İşlemi
Barkod Okutma İşlemi

Aforge.NET kütüphanesi yine açık kaynaklı bir c# frameworküdür. Program geliştiriciler, bilimsel araştırma yapan kişier için özellikle görüntüleme işleme de veyapay zeka uygulamalarında kullanılması amacı ile geliştirilmiş bir kütüphanedir. Sadece bu iki alanda değil tabi, nöral ağlarda yani insan beyni ve sinir sistemini taklit eden yapay zeka uygulamalarında, genetik algoritmasında, fuzzy lojikte yani bulanık mantıkta, machine learning dediğimiz makine öğrenmesinde ve robotikte de çok kullanılır.

Aforge.Video.DirectShow kütüphanesinde DirectShow arayüzü vasıtası ile video kaynaklarına erişim sağlayan classlar mevcuttur. Bunlara örnek verirsek; usb web kameralar, görüntü yakalama aygıtları, video dosyaları örneklendirilebilir.

Barkod Okuyucu Kodlama Bölümü:

Yavaş yavaş kodlamaya geçelim.

Formun yüklendiğinde öncelikle bilgisayarda webcam var mı bunu tespit edip, akabinde webcami comboboxa ekleyeceğim. Bu işlem formun load olayında olacak.

Daha sonra butonun click eventine kodları yazacağım. Burada webcam tarafından çekilen fotoğrafların alınması işlemi olacak.

Şimdi burada tabi Aforge.Video.DirectShow içinde yer alan classlar ve onlara ilişkin metotları kullanacağım için kodlar biraz karışık gelebilir. Elimden geldiğince ne nereye ait belirteceğim, ancak tabi Aforge.Video.DirectShow kütüphanesinin detayını vermem bu yazıda mümkün değil.

FilterInfoCollection: Belirtilen kategorideki DirectShow filtrelerini numaralandırma için kullanılır. Yani benim bilgisayarımda kaç kamera var bunu bulmak için kullanıyorum.

VideoCaptureDevice: Bu class bilgisayarımızda bulunan DirectShow arayüzünü destekleyen harici veya dahili bağlanmış kamera, görüntü yakalama cihazı v.b aygıtlardan video verilerini yakalar. Deklanşör düğmesi olan veya bir tetikleme için yazılıma ihtiyaç duyan anlık grüntü kaydetme cihazlarından da görüntü yapılmasına izin verir. Hem video boyutu hem de anlık görüntü boyutu yapılandırılabilir. Yani cihazımdaki kameram burada tanımlanıyor.

FilterCategory: Filtreleme kategorisi için kullanılan bir classtır.

VideoInputDevice: Bağlı olan video aygıtlarını tutar.

FilterInfo: Kullanılabilir video aygıtları hakkında bilgi sağlar.

Bitmap: Piksel verilerinden oluşan görüntüler üzerinde çalışmak için kullanılan bir sınıftır.

Şimdi kodlara geçelim:

using AForge.Video.DirectShow;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ZXing;

namespace BarcodeOkuyucu
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //FilterInfoCollection ve VideoCaptureDevice sınıfından nesnelerimi türettim. FilterInfoCollection cihazımdaki tüm kameraları, yakalama cihazlarını vs bulur. VideoCaptureDevice ise benim kullanacağım kamera için değişkenim olacak.
        FilterInfoCollection Cihazlar;
        VideoCaptureDevice kameram;


        //Formun load olayında bilgisayarıma bağlı olan dahili ve harici kameraları tarıyorum ve comboboxa ekliyorum.
        private void Form1_Load(object sender, EventArgs e)
        {
            Cihazlar = new FilterInfoCollection(FilterCategory.VideoInputDevice);

            //FilterInfo cihazdaki görüntü yakalama cihazları hakkında bilgi tutar.
            foreach (FilterInfo cihaz in Cihazlar)
            {
                cmbKamera.Items.Add(cihaz.Name);
            }
            //İlk bulduğu kamera ismi görünsün diye ilk atamayı yaptık, 0 verdik.
            cmbKamera.SelectedIndex = 0;
        }


        //Kamerayı başlatmak için yazılan kodlar. NewFrame Her bir görüntü için yeni bir frame başlatır. 
        private void btnBasla_Click(object sender, EventArgs e)
        {
            kameram = new VideoCaptureDevice(Cihazlar[cmbKamera.SelectedIndex].MonikerString);

            kameram.NewFrame += VideoCaptureDevice_NewFrame;
            kameram.Start();
        }


        //Kullanılan cihazın metodunu oluşturuyorum
        private void VideoCaptureDevice_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap GoruntulenenBarkod = (Bitmap)eventArgs.Frame.Clone();
            BarcodeReader okuyucu = new BarcodeReader();
            var sonuc = okuyucu.Decode(GoruntulenenBarkod);

            if(sonuc != null)
            {
                txtBarcode.Invoke(new MethodInvoker(delegate ()
                {
                    txtBarcode.Text = sonuc.ToString();
                }
                ));
            }

            pictureBox1.Image = GoruntulenenBarkod;
        }

        //Form kapatma esnasında da kamera durdurma işlemim.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if(kameram != null)
            {
                if (kameram.IsRunning)
                {
                    kameram.Stop();
                }
            }
        }
    }
}


Tabi benim bu uygulamam da ben tek bir kod okutuyorum yeni bir kod okutma için programı baştan başlatmak veya ona göre kodlarda revize etmek gerek. Artık başka bir zaman da buna ilişkin örnekler, veritabanına kaydetme, depo stok gibi örnekleri de yaparız.

Barkod Okutma İşlemi
Barkod Okutma İşlemi
Barkod Okutma İşlemi
Barkod Okutma İşlemi

Şimdilik bu kadar 🙂

3 Yorumlar

  1. İsmail bey merhaba,
    Projeyi dediğiniz gibi yaptım ama çalıştırdığımda kameranın ışığı yanıyor ama picturebox’ a görüntü gelmiyor.
    windows10 pro vs2017 kullanıyorum.

  2. Merhaba kodlarınızı paylaşır mısınız?

  3. merhabaa hocam bunu webformda nasıl yapabiliriz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir