EMGUCV Örnek Proje

| 24 Aralık 2014 | 15 Comments

Merhaba arkadaşlar;

   Bir önceki makalemde EMGUCV için bir başlangıç yaparak, sizlere EMGUCV kurulumunu anlatmıştım. Bu makale ile EMGUCV ile ilk örneğimizi yapalım. Bunun için tabi ki öncelikle Visual Studio 2010 yada 2012 IDE’mizi açalım.

 

   1 – Öncelikle yeni bir proje dosyası oluşturalım. Ben projemin adını EMGUCV olarak verdim. Siz istediğinizi seçebilirsiniz.

01

 

   2 – Proje dosyamızı oluşturduktan sonra formumuza kontrollerimizi eklememiz gerekiyor. Normal şartlarda standart kontrolleri kullanabiliriz. Ancak bu makaleyle birlikte EMGU kontrollerini nasıl ekleyeceğimizi de öğrenmiş olalım. Bunun için yapmamız gereken Toolbox içerisinden “General” menüsüne Sağ tıklayarak “Choose Items…” seçeneğine tıklıyoruz.

02

   3 – Açılan sayfamıza “.NET Framework Components” sekmesinde “Browse” düğmesine tıklıyoruz.

03

   4 – Arama formumuzda resimdeki işaretli alanda gördüğünüz EMGCV yüklemiş olduğumuz klasöre geliyoruz. Buradan Emgu.CV.UI.dll dosyasını seçerek aç düğmesine tıklıyoruz.

04

   5 – Filtre kutusuna “EMGU” yazdığımız zaman gördüğünüz gibi EMGU kontrolleri listelenecektir. Hepsinin işaretlermiş olduğundan emin olarak “OK” düğmesine tıklıyoruz.

05

   6 – Yukarıdaki işlemleri tamamladıktan sonra EMGU kontrolleri Toolbox’da resimdeki şekilde listelenecektir.

06

7 – Şimdi listeden ImageBox kontrolünü Formumuza ekleyelim.

07

   8 – “Başla”, “Dur” ve “Kaydet” kontrollerimizi de formumuza ekleyip isimlendirdikten sonra küçük bir ayar daha yapıyoruz.

08

   9 – “ImageBox” kontrolümüzün “Size Mode” seçeneğini “StretchImage” olarak ayarladıktan sonra başlamaya hazır sayılırız.

09

   10 – Projemize iki adet referans dosyası eklememiz gerekiyor. Bunun için “Solution Explorer” üzerinde “References” klasörüne sağ tıklayıp açılan menüden “Add Reference…” seçeneğine tıklıyoruz.

10

11 – Açılan formdan “Browse” düğmesine tıklıyoruz.

11

   12 – Açılan seçim formunda yine EMGU klasörümüze gelerek “Emgu.CV.dll” ve “Emgu.Util.dll” dosyalarını seçerek “Add” düğmesine tıklıyoruz.

12

   13 – Eklenecek referanslarımızın işaretli olduğundan emin olarak “OK” düğmesine tıkladığımızda…..

13

   14 – Referans dosyalarımızın eklenmesi tamamlanmış olacak. Ancak halen daha kütüphane dosyalarımıza ihtiyacımız olmakta.

14

   15 – Kütüphane dosyalarımızı eklememiz için Solution Explorer dan Proje adımıza sağ tıklayarak “Add” menüsü altından “Existing Item…” seçeneğine tıklıyoruz.

15

   16 – Açılan arama formundan yine EMGU yüklemiş olduğumuz klasöre gidiyoruz. Ancak bu sefer x86 klasörü altından kütüphanelerimizi alacağız. “cudart32_55.dll”, “cvextern.dll”, “opencv_contrib290.dll”, “opencv_core290.dll”, “opencv_ffmpeg290.dll”, ”opencv_flann290.dll”, “opencv_gpu290.dll”, “opencv_gpuimgproc290.dll”, “opencv_highgui290.dll”, “opencv_imgproc290.dll” ve “opencv_video290.dll” dosyalarını seçerek “Add” düğmesine tıklıyoruz.

16

   17 – Kütüphane dosyalarımız projemize eklendi ancak dosyalarımızı derleme klasöründe bulundurmamız gerekiyor. Bunu elle yapmak yerine her seferinde otomatik yapmasını sağlayalım. Bunun için eklemiş olduğumuz kütüphane dosyalarının hepsini seçerek sağ tıklayıp “Properties” seçeneğine geçiyoruz.

17

18 – Buradan “Copy to Output” seçeneğini “Copy always” olarak değiştiriyoruz.

18

   19 – Son işlem olarak projemizin çalışma sistemini ayarlamalıyız. Eklemiş olduğumuz kütüphane dosyaları x86 düzeninde çalışmakta ancak projemiz bu şekilde değil. Bunun için “Solution Explorer” üzerinde projemize sağ tıklıyoruz ve açılan menüden “Properties” seçeneğine tıklıyoruz. (genelde en alt sıralarda bulunur Mouse ile scroll yapmanız gerekebilir)

19

   20 – Proje ayarlarımızı “Build” sekmesinden “Platform target” olarak “Any CPU” yerine “x86” şeklinde değiştiriyoruz.

20

   21 – Artık geriye kodlama işlemimiz kaldı. Kodlamaya başlayalım. Öncelikle 2 adet namespace ekleyeyeceğiz. “Emgu.CV” ve “Emgu.CV.Util”  isim alanlarını ekleyerek kodlamamıza başlıyoruz.

21

   22 – Şimdi iki adet değişken tanımlayarak devam edelim. Capture class’ından türetmiş olduğum “KPT” nesnesi görüntümüzü yayın yapan cihazımızdan alan bir nesnedir. “Yayin” adında tanımladığım değişken ise yayının açık olup olmadığını manuel olarak kontrol ettiğim değişkendir.

22

   23 – Daha sonra formun load eventinde aşağıdaki tanımlamaları yapalım. “KPT” nesnemiz bu şekilde tanımlandığında bilgisayarımıza bağlı olan “0” nolu index’e sahip olan görüntüleme cihazını seçecektir. Şayet bilgisayarınıza 1’den fazla webcam bağlı ise bu numarayı değiştirmeniz gerekecektir. Yani Capture(1) şeklinde yapabilirsiniz. Ancak bu konuda emin değilseniz, bilgisayara bağlı olan kameraları tespit edebileceğiniz bir yöntem de mevcut. Ufak bir araştırma ile bunu bulabileceğinize inanıyorum.

23

   24 – Şimdi almış olduğumuz yayını formumuzdaki “ImageBox” nesnemize aktaralım. Bunun için “Başlat” düğmemizi aşağıdaki şekilde kodlayalım. Burada dikkat edilmesi gereken en önemli hususlardan biri “KPT” nesnemizin “ImageGrabbed” eventini register etmemiz. Ben bu event’i “GoruntuAl” adında bir metod oluşturarak buraya atadım. Bu eventi “Application.Idle” eventi ile değiştirmeyi düşünenler olabilir. Bu metod kullanılabilir bir metoddur ancak verimli bir metod olmayacaktır. Çünkü “Application.Idle” eventi “KPT” nesnemize bağlı bir event değildir. Tümüyle uygulamamızın çalışmasına bağlı bir eventtir. Ancak “ImageGrabbed” eventi kısaca “KPT” nesnesinden görüntü alındığında çalışmaktadır diye özetleyebilirim. Zaten iki eventin de kullanım şekli farklıdır. Burada ImageGrabbed’i anlatıyoruz.

24

   25 – Şimdi görüntülemeyi durdurma işlemini gerçekleştiren “Dur” düğmemizin kodlarını yazalım. Kaydetmiş olduğumuz eventi siliyoruz ve “ImageBox” nesnemizin görselini boşaltıyoruz.

25

   26 – Son buttonumuz olan “Kaydet” buttonumuzun kodlamasını da alaşağıdaki şekilde yapıyoruz. “KPT.RetrieveBgrFrame().Save()” metodu ile öncelikle KPT nesnemize gelen kareyi alıyor sonra da bunu bir dosya olarak kaydediyoruz. Unutmamanız gereken bir olay; normalde Windows kontrollerini kullanırken renk uzayımız RGB düzenindedir. Yani “Red, Green, Blue” şeklinde ancak EMGU bunun tam tersini uygulamaktadır. “Blue, Green, Red” bu düzene alışmak çok vaktinizi almayacaktır. Zaten arama yaptığınızda da çok sayıda örnek bulabilirsiniz.

27

   27 – Son olarak da “GoruntuAl” metodumuzun kodlamasını aşağıdaki gibi yapalım. Gördüğünüz gibi hiç de karmaşık bir kod düzeni yok. Aslında biraz dikkatli incelerseniz olayın mantığını da çözeceksinizdir. Mantığı bir kere çözdükten sonra gerisi gelecektir.

29

28 – Artık projemizi derleyip çalıştırıp meyvemizin olgunlaşıp olgunlaşmadığına bir bakalım 🙂

26

29 – Görüntümüzü resim dosyası olarak kaydetmeyi bir deneyelim.

28

   30 – Gördüğünüz gibi sağlıklı bir şekilde kayıt işlemimiz de tamamlanmıştır. Burada görselimizin ölçeklendirilmesi kameramızın yapmış olduğu yayına göre ayarlanmaktadır. Ancak siz isterseniz bunu kayıt esnasında da ayarlayabilirsiniz.

30

   Evet arkadaşlar gördüğünüz gibi EMGUCV ile işlemlerimiz bu kadar kısa sürdü. Şu kadarcık projeyi hazırlamak şayet ekran görüntülerini almayı saymaz isek yaklaşık 2 dakikamı aldı. Aslına bakarsanız görüntü işleme kod dünyasında tamamen apayrı bir dünya, ne kadar çok kurcalarsanız o kadar çok keşif hatta buluşa imza atarsınız. Ancak size benden bir öneri; şayet böyle bir doküman oluşturacaksanız, yanınızda kimse olmasın yoksa sizde benim gibi kafanızın üstünde işaretler görmeye başlayabilirsiniz. Şimdilik sağlıcakla kalın. Hepinize kolay gelsin…

dasdas

Tags: , , , , , ,

Category: C#

About the Author ()

Comments (15)

Trackback URL | Comments RSS Feed

  1. Murat dedi ki:

    hocam şu kodları bastan aşagıya bütün halde yollarmısın

  2. Emrah Ipekyol dedi ki:

    Hocam Çok Teşekkür ederim. Sorunsuz ve güzel bir şekilde çalışıyor. ellerinize sağlık.

  3. KAAN dedi ki:

    Merhaba hocam elinize saglık ;

    son surumunu kurdum emgunun fakar /bin/x64 altında
    “cudart32_55.dll”, “cvextern.dll”, “opencv_contrib290.dll”, “opencv_core290.dll”, “opencv_ffmpeg290.dll”, ”opencv_flann290.dll”, “opencv_gpu290.dll”, “opencv_gpuimgproc290.dll”, “opencv_highgui290.dll”, “opencv_imgproc290.dll

    dosyaları yok EMGU yu build mi etmem gerek bilemedim. Yardımcı olur musunuz ?

  4. Faruk KAKŞİ dedi ki:

    emgucv da son sürümde bazı değişiklikler olması sebebi ile belirtmiş olduğum dosyaları bulamamanız mümkün. Bu konuda size benim burada kullanmış olduğum sürümü tavsiye edeceğim. Henüz son sürüm ile ilgili bir doküman hazırlamadım. buradan eski sürümü indirebilirsiniz… 511mb olanı .zip dosyası halinde, 214mb olanı ise .exe dosyası halindedir.

  5. mesut dedi ki:

    RetrieveBgrFrame() bu kodd hata veriyor. sebebi ne olabilir

  6. emre coşgun dedi ki:

    Merhaba, çok güzel bir çalışma yapmışsınız, bunun için teşekkür ederiz.

    Ben kodları derlediğim zaman ekranda
    1-Error 1 The type ‘Emgu.CV.IImage’ is defined in an assembly that is not referenced. You must add a reference to assembly ‘Emgu.CV.World, Version=3.1.0.2282, Culture=neutral, PublicKeyToken=7281126722ab4438’.

    2-Error 2 Cannot implicitly convert type ‘Emgu.CV.Image’ to ‘Emgu.CV.IImage’

    hataları alıyorum.

    Sorun neden kaynaklanıyor olabilir? Lütfen yardımı olur musunuz?

  7. kg dedi ki:

    Hocam, Video içinde bir sahnenin fotoğrafını alıp o fotonun video içinde kaçıncı snyede olduğunu buldurabilirmiyiz.nasıl yapabiliriz. yardımcı olabilirmisiniz

  8. Faruk KAKŞİ dedi ki:

    Referanslarınızın projeye eklenmediği konusunda bir hata almışsınız. Referansları projeye eklerseniz bir sorun yaşamayacaksınız. Referanstan kasıt aynı zamanda projeye dahil etmiş olduğumuz DLL dosyalarıda olabilmektedir.

  9. Abdullah dedi ki:

    Cannot implicitly convert type ‘Emgu.CV.Image’ to ‘System.Drawing.Image’

    Merhaba, bu hatanın sebebi nedir acaba?

  10. ebru dedi ki:

    Hocam kodun tamamını yazdım ama pbGoruntu kısmı hata verıyor pek defa kontrol ettım ama gozden kacırdıgım bıseymı var acaba? yardımcı olurmusunuz?

  11. crazy dedi ki:

    Hocam kodun tamamını yazdım ama pbGoruntu kısmı hata verıyor pek defa kontrol ettım ama gozden kacırdıgım bıseymı var acaba? yardımcı olurmusunuz?
    Görüntünün yükleneği ımageBox1 name:pbGoruntu yapmalısın.Yada
    ımageBox1.Image = KPT.RetrieveBgrFrame(); şeklinde

  12. Faruk KAKŞİ dedi ki:

    Merhaba,
    Burada uygulanan proje şu anki güncel sürüme göre eski bir versiyon kütüphane dosyaları kullanılarak yapılmış durumdadır. Sizde projede kullanılan 2.9.0.1922 versiyonunu indirirseniz bir sorun yaşamayacağınızı tahmin etmekteyim…

  13. badboy dedi ki:

    hocam pbGoruntu yü algılamıyor neden olabilir?

  14. badboy dedi ki:

    Error 1 The type ‘Emgu.CV.IImage’ is defined in an assembly that is not referenced. You must add a reference to assembly ‘Emgu.CV.World, Version=3.1.0.2282, Culture=neutral, PublicKeyToken=7281126722ab4438’. C:\Users\aaaaa\Desktop\C#\c# örnekleri 2016\WindowsFormsApplication11\WindowsFormsApplication11\Form1.cs 69 17 WindowsFormsApplication11

    böyle bir hata alıyorum.

  15. ısık dedi ki:

    Hocam bu paylaştığınız bilgi önemli ve çok yararlı. teşekkür ederiz. bu arada ip kamera ile ilgili imagabox ı autosize alırsanız kamera çözünürlü ile oynamadan akışkanlık normale dönüyor selamlar

Bir cevap yazın

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