QR Kod Okutma İşlemi

Bu yazımda da WEBCam veya USB kamera kullanarak QR code okuma işlemine ilişkin bir örnek yapacağım. Windows form projesi açıp ismini QRKodOkuma verdim. Aşağıdaki araçları formuma sürüklüyorum:

  • 2 Adet Label
  • 1 adet combobox
  • 1 adet richtextbox
  • 1 adet picturebox
  • 1 adet buton
  • 1 adet timer

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

QR Kod Csharp design

Araçlarımın isimleri:

Combobox: cmbKamera

RichTextBox: rchQRKodIcerik

Buton: btnQRKodOku

Label text özelliklerini, buton text özelliğini, form text özelliğini görseldeki gibi değiştirdim. Picturebox için isim değişmedim, PictureBox için BorderStyle özelliğini Fixed3D yaptım. Timer’in ismini değiştirmedim. Özelliklerinden intervali 1000 milisaniye yani 1 saniye yaptım.

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

nuget

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.

zxing install

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

zxing

Zxing aslında java tarafından çalıştırılan, açık kaynak kodlu 1D/2D QR code 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.Video.DirectShow seçiyor ve install diyerek yüklüyorum.

QR code C#

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

QR code Csharp
QR Kod Okutma Kodları:

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.

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 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;
using AForge;
using AForge.Video.DirectShow;


namespace QRKodOkuma
{
    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 btnQRKodOku_Click(object sender, EventArgs e)
        {
            kameram = new VideoCaptureDevice(Cihazlar[cmbKamera.SelectedIndex].MonikerString);

            kameram.NewFrame += CaptureDevice_NewFrame;
            kameram.Start();
            timer1.Start();

        }

        //Kullanılan cihazın metodunu oluşturuyorum
        private void CaptureDevice_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
        }

        //Form kapanırken kameramı kapatıyorum.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (kameram.IsRunning)
            {
                    kameram.Stop();
            }           

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (pictureBox1.Image != null)
            {
                //BarcodeReader sınıfı ile QR Barkodumu çözüyorum.
                BarcodeReader qrBarkodOkuyucu = new BarcodeReader();
                Result sonuc = qrBarkodOkuyucu.Decode((Bitmap)pictureBox1.Image);

                //Eğer okuma işlemi başarılı ise timer ve kameramı durduruyorum.
                if(sonuc != null)
                {
                    rchQRKodIcerik.Text = sonuc.ToString();
                    timer1.Stop();
                    if (kameram.IsRunning)
                    {
                        kameram.Stop();
                    }
                }
            }
        }
    }
}

Sonuç başarılı:

QR Kod C#

1 Yorum

  1. peki resim için görsel arama yaptırabilir miyim?

Bir cevap yazın

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