C# Webcam Kullanımı

Bu yazımda, şu an projemde de kullandığım, WebCam üzerinden görüntü alma, kaydetme işlemlerinin nasıl yapıldığını AForge kütüphanesi ile açıklayacağım.

Öncelikle kütüphaneyi buradan indirelim ve sıkıştırılmış dosyayı çıkartalım.

Projede sağ tıklayıp, sırasıyla Ekle > Başvuru ve pencereden Release klasöründeki Aforge.Video.DirectShow.dll ve Aforge.Video.dll dosyalarını ekledik.

Form alanında kullanacağımız araçları ekliyoruz; kamerayı görüntüsü için pictureBox, kaydetmek için saveFileDialog, kamera seçimi için comboBox ve başlat, durdur ve kaydet için 3 tane de buton ekledik.

Şimdi açıklamalarla kodumuzu yazalım.

Uygulamamızda kullanabilmek için Aforge.Video.DirectShow.dll ve Aforge.Video.dll, ayrıca dosya sistemi için using System.IO referanslarını ekledik.

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

Burada değişkenler sırasıyla; webcamsayisi, kaç kamera bağlı olduğunu tutan dizi, birden fazla kamera da olabilir usb kamera gibi, kamera ise, bizim kullanacağımız cihaz.

private FilterInfoCollection webcamsayisi;
private VideoCaptureDevice kamera;

Burada, form yüklendiğinde, webcamsayisi dizisine, mevcut kameraları ekliyoruz. Ardından comboBox’a da ekliyoruz. Combobox’taki ilk kameranın ekranda görünmesi için 0 yazıyoruz.

 private void FormWebCam_Load(object sender, EventArgs e)
        {
            webcamsayisi = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            foreach (FilterInfo videocapturedevice in webcamsayisi)
            {
                comboBoxKameralar.Items.Add(videocapturedevice.Name);
            }
            comboBoxKameralar.SelectedIndex = 0;
        }

Kullanılacak cihaz metodunu oluşturuyoruz.

private void kullanilacakcihaz_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            Bitmap bit = (Bitmap)eventArgs.Frame.Clone();
            pictureBoxKamera.Image = bit;
        }

Kamerayı başlatmak için btnkamerabaslat bloğuna gidiyoruz ve oluşturduğumuz metodu da ekliyoruz.

private void btnkamerabaslat_Click(object sender, EventArgs e)
        {
            kamera = new VideoCaptureDevice(webcam[comboBoxKameraSec.SelectedIndex].MonikerString);
            kamera.NewFrame += new NewFrameEventHandler(kullanilacakcihaz_NewFrame);
            kamera.Start();
        }

Kamerayı durdurmak için btnkameradurdur bloğuna gidiyoruz, kamera açıksa kapatıyoruz.

private void btnkameradurdur_Click(object sender, EventArgs e)
        {
            if (kamera.IsRunning) //kamera açıksa kapatıyoruz.
            {
                kamera.Stop();
            }

        }

Ekran görüntüsü olarak kaydetmek için btnkamerakaydet bloğuna gidiyoruz.

private void btnkamerakaydet_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Filter = "Jpeg Resmi|*.jpg|Bitmap Resmi|*.bmp|Gif Resmi|*.gif";
            saveFileDialog1.Title = "Resmi Kaydet";
            saveFileDialog1.ShowDialog();

            if (saveFileDialog1.FileName != "")
            {
                FileStream DosyaAkisi = (FileStream)saveFileDialog1.OpenFile();

                switch (saveFileDialog1.FilterIndex)
                {
                    case 1:
                        pictureBoxKamera.Image.Save(DosyaAkisi, System.Drawing.Imaging.ImageFormat.Jpeg);
                        break;

                    case 2:
                        pictureBoxKamera.Image.Save(DosyaAkisi, System.Drawing.Imaging.ImageFormat.Bmp);
                        break;

                    case 3:
                        pictureBoxKamera.Image.Save(DosyaAkisi, System.Drawing.Imaging.ImageFormat.Gif);
                        break;
                }
                DosyaAkisi.Close();
            }
        }

Form kapatılırken, kamera açıksa, kamerayı da kapatalım.

private void FormWebCam_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (kamera.IsRunning)
            {
                kamera.Stop();
            }
        }

Elimde iki kamera daha vardı, ikisini de bağladım. Bilgisayarın kendi kamerası ile birlikte üç tane kamera aktif.

Bu da çok uzun hikayesi olan telefonum.

Kaydet butonuna bastıktan sonra, dosyaya izin vermedikçe işlemi tamamlamıyor.

Kodları tek bir yerde toplayalım ve sonraki yazıda görüşmek üzere.

Ideone:

Github: