uEye SDK kullanarak görüntünün Bitmap olarak alınması

iDS uEye Kameraları, güçlü bir SDK ile gelmektedir. Bu SDK, görüntünün kameradan düzgün bir şekilde alınabilmesi içindir. uEye Cockpit programında elle yapılan tüm işlemlerin kod ile (program) yapılabilmesi içindir. (Pozlama, kazanç, pixel clock, frame rate vs…)

Eğer uEye SDK düzgün olarak yüklenmişse, makinanızda IDS klasörü altında resimdeki gibi, tüm gerekli dosyalar klasörler olacaktır. Buradaki örneklere ve yardım dosyalarına göz atmakta fayda vardır. Unutulmamalıdır ki, uEye SDK, bir görüntü işleme kütüphanesi değildir. (bir HALCON değil mesela)

Bize .NET, Directshow, ActiveX ve yaygın görüntü işleme kütüphaneleri için interface ler sunar. Yani ben sana görüntüyü veririm, sen al ne yaparsan yap der.

Bazı iDS uEye kullanan müşterilerimiz, görüntüyü bitmap olarak almak ve bu bitmap olarak alınmış görüntüde pixel-pixel kendi algoritmalarını geliştirmek istemektedirler. Her ne kadar iç içe for döngüleri ile pixel-pixel çalışmak hayli zahmetli ve ilkel bir yöntem olsa da, çok basit ve zaman sorunu olmayan görüntü işleme uygulamalarında iş görüyor olabilir. Dolayısıyla, tüm bu yazının özeti, bize sık sorulan, iDS uEye kameralar kullanarak görüntüyü bitmap olarak nasıl alırım sorusuna bir cevap yazalım.

1 .NET interface kullanmak

Object Oriented mantığına göre geliştirilmiş .NET interface kullanmak en doğru yöntemdir.

Başlangıç olarak, uEye_DotNet_Simple_Live isimli C# uygulamasını açın. En temel fonksiyonları ve kullanımını basitçe göstermektedir.  Bunu çalıştırın. Herşey yolunda ise, çok küçük bir ekleme yapalım.

Bir PictureBox komponeti koyalım. (Bitmap nesnesini bunun üzerine atayacağız)

Şimdi Freeze butonuna aşağıdaki kodları ekleyelim.

            uEye.Defines.Status statusRet = 0;

            // Get last image memory
            Int32 s32LastMemId;
            Int32 s32Width;
            Int32 s32Height;
            statusRet = Camera.Memory.GetLast(out s32LastMemId);
            statusRet = Camera.Memory.Lock(s32LastMemId);
            statusRet = Camera.Memory.GetSize(s32LastMemId, out s32Width, out s32Height);

            Bitmap MyBitmap;
            statusRet = Camera.Memory.ToBitmap(s32LastMemId, out MyBitmap);

            // unlock image buffer
            statusRet = Camera.Memory.Unlock(s32LastMemId);

            pictureBox_bmp.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox_bmp.Image = MyBitmap;

Görüldüğü gibi, Freeze() ile kamerayı video modundan çıkartıp stil image (sabit görüntü alma) moduna getirdim, ve kamera üzerindeki aktif görüntüyü bir bitmap değişkenine aldım. Sonra da onu pictureBox1 nesnesine atadım (siz dilediğiniz gibi kullanabilirsiniz)

Freeze() ile görüntüyü durdurabilir, Freeze(100) gibi bir komutla, 100 ms bekletebilirsiniz.

Ethernet kamera kullanıyorsanız, GetActive() , GetLast() vs deneyebilirsiniz. (Aktif olan görüntüyü değil de en sonuncusunu ver vs.)

ya da, henüz yeni görüntü oluşmamışsa (frame_rate 10 ise, 100 ms. de 1 yeni görüntü oluşacaktır gibi) bu durumda

Camera.Acquisition.Freeze(100)

gibi bir komutla, 100 ms beklemesini isteyebilirim. Uygulamaya göre değişir. sonuçta elimde Bitmap türünden görüntü mevcuttur artık.

2. dll kullanarak Bitmap olarak alma

(.NET çıkmadan önce yazdığım eski bir makaleydi bu. Orijinal haliyle bırakıyorum, .NET varken kullanılmasını çok da tavsiye etmem ama hala iş görür)

SDK ve uEye_api dll kullanımı için, Program Files altındaki IDS klasöründeki yer alan uEye_CSharp_Demo güzel bir örnek oluşturmaktadır. Burada, kameradan alınan görüntü (canlı ya da tek bir kare) .NET PictureBox bileşeni üzerinde gösterilmektedir. görüntüyü direk olarak PictureBox bileşeninin Handle ına atamak yerine Bitmap nesnesi olarak almak (ve işlemek) için, aşağıdaki kod kullanılabilir.

        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap MyBitmap;

            // get geometry of uEye image buffer
            int width = 0, height = 0, bitspp = 0, pitch = 0, bytespp = 0;
            long imagesize = 0;
            m_uEye.InquireImageMem(m_pCurMem, GetImageID(m_pCurMem), ref width, ref height, ref bitspp, ref pitch);
            bytespp = (bitspp + 1) / 8;
            imagesize = width * height * bytespp; // image size in bytes

            // bulit a system bitmap
            MyBitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);

            // fill the system bitmap with the image data from the uEye SDK buffer
            BitmapData bd = MyBitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            m_uEye.CopyImageMem(m_pCurMem, GetImageID(m_pCurMem), bd.Scan0);
            MyBitmap.UnlockBits(bd);

            //picShow.Image = MyBitmap;
            pictureBox2.Image = MyBitmap;

            //Bitmap may be saved to file if necessary
            MyBitmap.Save("uEyeImage.bmp");
        }

3. ActiveX kullanmak

ActiveX, VB6 ya da Delphi kullanıcısı iseniz mantıklı olabilir .Her ne kadar 2014 sonundan itibaren desteklenmese de (yeni versiyon ve bug fix vs gelmeyecektir),  iDS tarafından hala yürürlüktedir. En iyisi görüntüyü Save etmek, sonra Bitmap olarak load etmektir.

4. Görüntü İşleme Kütüphanesi kullanmak

Eğer HALCON kullanıyorsanız, kamerayı direk tanıyacak ve grab_image() komutu kameradan görüntüyü alıp size verecektir.