HImage Bitmap, Bitmap HImage dönüşümleri

HALCON içinde resim tipi dosyaların iconic değişken olarak eşdeğeri HImage dir. grab_image, read_image gibi fonksiyonlar direk olarak HImage tipi değişken döndürür. Bazı durumlarda (genelde windows ile programlama yaparken) HALCON HImage nesnesini Bitmap olarak dönüştürmeye ya da Windows Bitmap nesnesini HImage olarak dönüştürmeye ihtiyacımız olabilir.

HALCON içinden grab işlemi yukarıdaki şemaya göredir.

Eğer HALCON image acquisition interface yerine, kameradan Bitmap olarak görüntü almak ve bunu proses etmek gibi işlemlere gereksinim varsa Bitmap to HImage türü fonksiyona ihtiyacımız olabilir. HALCON .net kütüphanesindeki HImage in overload edilmiş yöntemlerinden biri, tam da bu iş için geliştirilmiştir.

            Bitmap bmp = new Bitmap("C:\\Projects\\1.bmp");
            IntPtr pval = IntPtr.Zero;
            BitmapData bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
            pval=  bd.Scan0;
            HImage img = new HImage("byte", bmp.Width, bmp.Height, pval);
bmp.Unlock...

gibi bir kodlama, bitmap nesnemizden direk olarak HImage üretmeye yarar.

Projeyi daha derli toplu hale getirmek için ise;

            Bitmap bImage, bImage32;
            System.Drawing.Imaging.BitmapData bmData = null;
            Rectangle rect;
            IntPtr pBitmap;
            IntPtr pPixels;

            HImage hi_Image = new HImage();

            bImage = new Bitmap("C:\\Users\\Public\\Documents\\MVTec\\HALCON-11.0\\examples\\images\\mreut.png");
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = bImage;

            // Convert 24 bit bitmap to 32 bit bitmap in order to ensure
            // that the bit width of the image (the Stride) is divisible by four.
            // Otherwise, one might obtain skewed conversions.
            bImage32 = new Bitmap(bImage.Width, bImage.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            Graphics g = Graphics.FromImage(bImage32);
            g.DrawImage(bImage, new Point(0, 0));
            g.Dispose();

            // Obtain the image pointer.
            rect = new Rectangle(0, 0, bImage.Width, bImage.Height);
            bmData = bImage32.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            pBitmap = bmData.Scan0;
            pPixels = pBitmap;
            unsafe
            {
                // Create HALCON image from the pointer.
                hi_Image.GenImageInterleaved(pPixels, "bgrx", bImage.Width, bImage.Height, -1, "byte", bImage.Width, bImage.Height, 0, 0, -1, 0);
            }
            // Don't forget to unlock the bits again. 😉
            bImage32.UnlockBits(bmData);
            hWindowControl1.HalconWindow.SetPart(0, 0, bImage.Height - 1, bImage.Width - 1);
            hi_Image.DispObj(hWindowControl1.HalconWindow);

gibi daha güvenli bir kod geliştirilebilir. C# formu üzerine koyduğum HWindowControl ve PictureBox bileşenleri ile birlikte, tam çözüm halindeki C#.NET uygulaması ise buradan indirilebilir. Bu çalışan Visual Studio 2008 uygulamasında hem Bitmap ten HImage dönüşümü, hem de HImage den Bitmap dönüşümü kodlanmıştır.

Daha fazla bilgi veya destek için info@mavis.com.tr adresi ile iletişime geçebilirsiniz.

 

Bir Cevap Yazın

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