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.

C, C++, C#, VB, Delphi ile Profesyonel Görüntü İşlemeye Giriş – V” üzerine 14 düşünce

  1. Geri izleme: C, C++, C#, VB, Delphi ile Profesyonel Görüntü İşlemeye Giriş – IV | Mavis Kameralı Kontrol Projeleri

  2. Bir kaç hatayla da olsa uygulamayı gerçekleştirdik, kaleminize sağlık. Kendi uygulamalarımızda direk yöntem ile HALCON desteği almak için uğraşmaya başladık bile 🙂 Yeni yazınızda görüşmek üzere.

  3. Merhaba halcon 11için yazdığınız Photometric Stereo uygulaması için yazdıgınız kod da Metal pul üzerinde yüzey kontrolü için verdiğiniz örnek halcon 10 için nasıl derleye bilirim birde pul üzerindeki hatayı kırmızı göstermek istiyorum ama başarılı olamadım

  4. HALCON 10 için yaptığınız çalışmaları paylaşırsanız, üzerinde birlikte fikir yürütebiliriz. Photometric stereo HALCON 10 da phot_stereo adı altında var sanırım ama HALCON11 de daha iyi destekleniyor. HALCON 10, nereden tedarik ettiğinizi falan belirtirseniz, HALCON 11 e geçiş önerebilirim…

  5. Hocam emeğinize sağlık gerçekten çok faydalı ve güzel anlatımlı bir çalışmanız olmuş. Aradan 2 yıl geçmiş ama acaba bu paylaşımlarınızın devamı gelir mi?

  6. Müthiş makaleler serisi, devamını sabırsızlıkla bekliyorum.
    Zamanınız ayırıp bizlere bunu öğrettiğiniz için teşekkürler.
    Gerçekten belki de ticari kaygılarla olsa gerek kimse Türkçe kaynak paylaşmamış.

    Teşekkürler Mustafa Bey.

  7. Çok teşekkürler, güzel bir içerik hazırlamışsınız. Olayları özetler nitelikle tüm makalelerinizi okudum devam ettirirseniz çok daha iyi olacağı görüşündeyim. Tekrardan teşekkürler.

  8. Merhaba Visual Studio HOperatorSet.GenEmptyObj(out ho_Image); kısmında aşağıdaki hatayı veriyor, sebebi ne olabilir acaba. Teşekkürler.

    An unhandled exception of type ‘System.DllNotFoundException’ occurred in halcondotnet.dll

    Additional information: DLL ‘halcon’ yüklenemedi: Belirtilen modül bulunamadı. (HRESULT özel durum döndürdü: 0x8007007E)

  9. HALCON yükledikten sonra pc yi yeniden başlat. halcondotnet.dll dosyasını programın çalıştığı klasöre (Debug ya da Release) kopyala. 64 ya da 32 bit durumuna dikkat et. Muhtemelen çözülecektir.

  10. Makalelerinizi okudum. Bu güzel bilgileri bizim ile paylaştığınız için çok teşekkür ederim. Halcon için lisans nasıl temin edebilirim. Mail attım. Dönüş bekliyorum. Teşekkürler

Bir Cevap Yazın

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