Visual Studio 2015 & OpenCvSharp3 - WebCam Görüntüsünü PictureBox'ta Göstermek

Bu yayını, OpenCV hakkında bilginiz olduğunu varsayarak hazırladım. Yayının amacı, OpenCvSharp3 alanında örnek bir Türkçe kaynak oluşturmaktır.

Başlangıç için bir WindowsFormsApplication projesi açın.

Öncelikle, eğer Visual Studio 2015'e OpenCv 3.1.0 versiyonunun wrapper'ını yüklemeyi bilmiyorsanız diye kolayca yüklemeyi görelim:
1) Üstteki menüden Project > Manage NuGet Packages seçin.
2) Browse sekmesini açıp opencvsharp3 yazın.
3) OpenCvSharp3-AnyCPU yazanı seçip yükleyin. OpenCv için wrapper kurulumumuz bu kadar...

Form tasarımını ayarlayayım. Form ekranınıza şunları ekleyin ve Properties'ten de bu ayarları yapın:
1) Bir adet PictureBox ekleyin. Size: 640;480 olsun. Name: pictureBox1 olsun.
2) Bir adet Button ekleyin. Name: button1 olsun.
3) Bir adet Timer ekleyin. Name: timer1 olsun. Interval: 33 olsun. Enabled: false olarak kalsın.
4) Tasarım bölümünde butona çift tıklayıp button1_click() metodunun oluşmasını sağlayın.
5) Tasarım bölümünde timer'e de çift tıklayıp timer1_Tick() metodunun oluşmasını sağlayın.

Kod sayfasına geçelim. Öncelikle class'ımız içine birkaç global değişken tanımlayalım:
private VideoCapture capture;
private Mat frame;
private Bitmap bitmapFrame;
private bool durum_Kamera;

Form'umuzun Load olayında bu değişkenlerimizin başlangıç değerlerini belirleyelim:
capture = new VideoCapture(0);
frame = new Mat();
durum_Kamera = false;

Senaryomuza göre başlangıçta kameramız görüntü vermeyecek. Biz butona tıkladığımızda görüntü vermeye başlayacak. Butona tekrar tıkladığımızda da görüntü donacak. Bunun için butonumuzun click olayına şunları yazalım:
if(durum_Kamera) // Kameranın durumu true ise, yani kamera açıksa...
{
    durum_Kamera= false; // Kameranın durumunu false yap, yani görüntü akışını durdur.
    button1.Text = "Başlat"; // Butonun Text'ini "Başlat" yap.
    timer1.Enabled = false; // Timer nesnesini durdurursak görüntü akışını da durdurmuş olacağız.
}
else // Yok efendim kameranın durumu false ise, yani kamera kapalıysa...
{
    durum_Kamera= true; // Kameranın durumunu true yap, yani görüntü akışını sürdür.
    button1.Text = "Durdur"; // Butonun Text'ini "Durdur" yap.
    timer1.Enabled = true; // Timer nesnesini çalıştırırsak görüntü akışını da sağlamış olacağız.
}

Butonumuz artık durum_Kamera adlı değişkenimizin true veya false oluşunu belirliyor. Timer'imizin Tick olayında da bu değişkeni kontrol edeceğiz. Eğer bu değişken true ise görüntü akışı sürecek, false ise hiçbir şey yapılmayacak. Timer'in Tick olayına şunları yazalım:
// Görüntünün o anki karesini yakalayıp frame'ye alalım:
capture.Read(frame);

// Görüntünün Y ekseninde ayna yansımasını alalım:
Cv2.Flip(frame, frame, FlipMode.Y);

// Bir Mat nesnesi olan frame'yi Bitmap türüne çevirip bitmapFrame'ye atayalım:
bitmapFrame = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(frame);

// Artık PictureBox'umuza Bitmap formatındaki resmimizi atayabiliriz...
pictureBox1.Image = bitmapFrame;


Bitmap ve Mat türleri arasındaki dönüştürmeleri merak edenler için:

Bitmap bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat); // Mat->Bitmap

Mat mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap); // Bitmap->Mat


Başka bir yayında görüşmek üzere...

Yorumlar