C, C++, C#, VB, Delphi ile Profesyonel Görüntü İşlemeye Giriş – V

Yazı dizisinin ilk IV bölümünü takip edenler HALCON hakkında bilgi sahibi olup HDevelop ile uygulama geliştirmeye başlamışlardı. Şimdi merak edilen, yazılan HDevelop kodlarının Visual Studio içine aktarılıp, uygulamaya dönüştürülmesi işlemidir. Bu makalede bunu anlatacağım. Yaygın kullanıldığı için Visual Studio 2008 versiyonu üzerinden gideceğim fakat daha yeni versiyonlarda da mantık tamamen aynı.

Metodolojik olarak 2 farklı yöntem ile kendi uygulamalarımıza HALCON desteği verebiliriz.

  1. Klasik Yöntem : Bu yöntemde HDevelop içinde yazılan kodlar Export edilir, Visual Studio içinden bu export edilmiş kodlar yüklenir ve uygulama oluşturulur.
  2. Direk Yöntem : Bu yöntemde, HDevelop içinde yazılmış kodlar hiç bir yere export edilmez, Visual Studio ile geliştirdiğimiz program, gidip direk HDevelop program ya da programcığını çalıştırır.

Bu sayfada her 2 yöntem de resmedilmiş.

Biz, öncelikle Klasik Yöntem ile başlayacağız. HALCON.NET nesne modeline hakim olabilmek, HDevelop değişkenlerini, Visual Studio içinden görebilmek, değiştirebilmek vb. amaçlar için daha doğru bir başlangıç noktası. Gerçekte (mesela bizim uygulamalarımız) 2. yöntemi kullanmaktadır. Yazı dizimizin ilerleyen bölümlerinde, bu yönteme de yeri gelirse değiniriz. Şimdilik 1. yöntem ile devam edelim.

Visual Studio 2008 konfigüre edilmesi

Visual Studio ile sıfırdan herhangi bir uygulamaya başladığınız gibi, yeni bir Windows uygulaması oluşturun. Ben projenin adını HALCONTest koydum. (.NET Framework 3.5 kullanıyorum)

Sol taraftaki Toolbox üzerine HDevelop görsel bileşeni olan HWindowControl isimli komponenti eklemeliyiz. Bu komponent, HDevelop içindeki Graphics Windows gibi, görsel çıktıları göstermemize yardımcı olacaktır. .NET içindeki PictureBox bileşenine benzer. Toolbox a yeni bir bileşen eklemek istediğimizde yaptığımız gibi, ToolBox üzerinde ike sağ tuşa tıklayıp, “Choose Items…” seçeneğini seçerek aşağıdaki ekranlardaki gibi yüklemeyi yapabiliriz.

.NET FrameWork componenleri arasında, Browse butonuna basarak, HALCON11 in yüklendiği klasörün, bin\dotnet35 alt klasöründeki halcondotnet.dll dosyasını seçmemiz gerekir.

OK leyip kaydettiğimizde HWindowControl bileşenini artık araç çubuğunda görebilmemiz lazım.

 

Şimdi bu bileşeni formumuza çekip, bir buton ekleyelim. Benim Formum şu şekilde oldu.

Bu form üzerindeki Çalıştır butonuna bastığımızda, 4. bölümde anlattığımız programın çalışmasını isteyeceğiz. Dolayısıyla, şimdi HDevelop’a dönüp, bu kısa programı yazıp export edelim.

HDevelop içindeki Araç çubuğunda, export butonuna bastığımda, yukarıdaki diyalog penceresi gelir. Buradan, dil olarak C# HALCON/.NET seçtim. Export dediğimde, Export File olarak belirtilmiş dosyayı oluşturacaktır.

Export edilmiş dosyayı (benim örneğimde unnamed.cs) Visual Studio ile açtığımda, HALCONun benim için, son derece profesyonel bir C# kodu oluşturduğunu gözlemleyeceğim.

Şimdi hem HALCON nesne modeline, hem de ortama biraz ısınmak için, adım adım bu kodu irdeleyeceğiz. Öncelikle, bu kodun en çok action() ile başlayan kısmı ile ilgileniyoruz. Bunun dışındaki tanımlamalar vs. şimdilik ilgimiz dışında. action() yapısı içindeki kod bloğunu alıp, bizim butonumuzun altına taşıyacağız.

Şimdi kendi formumuza (Form1) dönelim. Kod yazdığımız sayfada,

using HalconDotNet;

tanımlamasını yapalım. (Böylece, asıl formumuz çinden HALCON kütüphanesini kullanabilelim)

Projem basitçe yukarıdaki gibi oldu. Şimdi Form görünümüne geçip, Çalıştır butonuna basıldığında yapması gerekenleri, action() içinden kopyalayıp, buraya yapıştırabilirim.

 

 

        private void button1_Click(object sender, EventArgs e)
        {
            // Local iconic variables 

            HObject ho_Image, ho_Region, ho_ConnectedRegions;

            // Local control variables 

            HTuple hv_Number = null;

            // Initialize local and output iconic variables
            HOperatorSet.GenEmptyObj(out ho_Image);
            HOperatorSet.GenEmptyObj(out ho_Region);
            HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);

            ho_Image.Dispose();
            HOperatorSet.ReadImage(out ho_Image, "rings_and_nuts");
            ho_Region.Dispose();
            HOperatorSet.Threshold(ho_Image, out ho_Region, 0, 128);
            ho_ConnectedRegions.Dispose();
            HOperatorSet.Connection(ho_Region, out ho_ConnectedRegions);
            HOperatorSet.CountObj(ho_ConnectedRegions, out hv_Number);
            HOperatorSet.SetTposition(3600, 220, 180);
            HOperatorSet.WriteString(3600, hv_Number);
            ho_Image.Dispose();
            ho_Region.Dispose();
            ho_ConnectedRegions.Dispose();

        }

Ve ilk programımız için hepsi bu kadar. F5 e bastığımzda programımızın derlenip, hiç hata vermeden çalışması lazım. İşte ilk programımızın ekran görüntüsü :

Siyah bir pencere ve ortada bir yerde 8 rakamı. Eğer gördüğünüz bundan ibaret ise, herşey yolunda demektir. Peki neden siyah ekran? Çünkü HALCON biz neyi ekranda göster dersek onu gösterir. Eğer, okuduğu resmi (ho_Image isimli bir değişkene atamış), bulduğu tüm bileşenleri (ho_ConnectedRegions isimli bir değişkene atamış) göstermesini istersek, ayrıca ekranda 12 farklı renk kullansın istersek, bir de, daha önceden bahsi geöen 3600 nolu grafik penceresi yerine, bizim koyduğumuz hWindowControl isimli bileşen üzerinde göstersin istersek,

aşağıdaki kodları araya eklememiz gerekecektir.

HOperatorSet.SetColored(hWindowControl1.HalconID, 12);            HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconID);            HOperatorSet.DispObj(ho_ConnectedRegions, hWindowControl1.HalconID);

bu son durumda, bütün kod bloğu :

 

        private void button1_Click(object sender, EventArgs e)
        {
            // Local iconic variables 

            HObject ho_Image, ho_Region, ho_ConnectedRegions;

            // Local control variables 

            HTuple hv_Number = null;

            // Initialize local and output iconic variables
            HOperatorSet.GenEmptyObj(out ho_Image);
            HOperatorSet.GenEmptyObj(out ho_Region);
            HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);

            ho_Image.Dispose();
            HOperatorSet.ReadImage(out ho_Image, "rings_and_nuts");
            ho_Region.Dispose();
            HOperatorSet.Threshold(ho_Image, out ho_Region, 0, 128);
            ho_ConnectedRegions.Dispose();
            HOperatorSet.Connection(ho_Region, out ho_ConnectedRegions);
            HOperatorSet.CountObj(ho_ConnectedRegions, out hv_Number);
            HOperatorSet.SetColored(hWindowControl1.HalconID, 12);
            HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconID);
            HOperatorSet.DispObj(ho_ConnectedRegions, hWindowControl1.HalconID);
            HOperatorSet.SetTposition(3600, 220, 180);
            HOperatorSet.WriteString(3600, hv_Number);
            ho_Image.Dispose();
            ho_Region.Dispose();
            ho_ConnectedRegions.Dispose();

        }

şeklinde olacaktır. Ve haliyle ekran çıktısı da, HDevelop ta gördüğümüz şekle iyice yaklaşmış olacaktır. (Yeniden F5)

Artık, kendi başına çalışabilen, güçlü ve son derece hızlı bir C# uygulaması edindik. Üstelik form üzerine istediğiniz bileşenleri ekleyerek zenginleştirebilir, tamamen kendi tsarımlarınızı yapabilirsiniz. Artık hiçbir sınırınız yok. Bu uygulamayı herhangi bir bilgisayarda çalıştırabilmek için, o bilgisayarda HALCON Runtime kurulu olmalıdır unutmayın. Kendi bilgisayarınızda zaten HALCON development kurlu olduğundan, sorunsuz çalışacaktır.

(Not : Eğer derleyici hata verirse, Project menüsü, App Properties seçerek, gelen dialog penceresinde Platform Target olarak Any CPU seçiniz. Kullandığınız .NET Framework versiyonuna uygun Halcondotnel.dll dosyasını yükleyip yeniden deneyiniz)

Programın tamamını buradan indirebilirsiniz.

Konuya daha detaylı olarak devam edeceğiz. İlgilenenlere bir sonraki makalede tekrar görüşmek dileğiyle kolay gelsin diyorum. Görüşmek üzere.