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ş

Görüntü işleme gün geçtikçe daha çok uygulama alani bulmaktadır. Bunun bir sonucu olarak, profesyonel veya amatör görüntü işlemeye ilgi duyan insan sayısı da artmaktadır. Bir yerlerden başlamak isteyenler için, boş vakitlerimde bu makaleler dizisini yazmaya karar verdim.

Görüntü işleme uygulamalarını, 2 ana başlık altında toplayabiliriz.

  1. Akıllı Kameralar (Smart Camera) ile yapılan görüntü işleme uygulamaları
  2. PC tabanlı görüntü işleme uygulamaları.

Akıllı kameralar ile yapılan uygulamalar, daha çok PLC programlama mantığına yakındır. Kamera üzerindeki işlemcide gömülü (embedded) bir yazılım ve çeşitli giriş – çıkış arabirimleri mevcuttur. Programcı, PLC programlar gibi kamerayı programlar ve programlanmış kamera bir nevi sensör gibi çalışarak, önceden belirlenmiş görevleri gerçekleştir. Daha çok önde gelen sensör firmaları tarafından üretilirler. (Festo, Cognex, Keyence, Sick, Omron, Banner … ilk aklıma gelen yaygın bilinen akıllı kamera / smart camera markalardır) Basit uygulamalarda, pratikliğinden dolayı tercih edilebilir olsalar da bu makalelerin konusu olmayacaklardır.

Biz burada, PC tabanlı, C, C++, C# veya VB ile profesyonel görüntü işleme uygulamaları geliştirmeye yönelik bilgiler vereceğiz. Tek başına çalışabilen (exe), istediğiniz yere kurulum yapabileceğiniz (dağıtılabilir) kendi yazılım kodunuz ile geliştirebileceğiniz görüntü işleme uygulamaları için yol göstereceğiz. Amaç, herhangi bir kamera kullanarak, o kameranın nitelikleri ile (bir yere kadar) bir şeyler yapmak değil, tamamen bağımsız çalışabilen kendi çözümünüzü geliştirebilmeniz olacaktır. Üstelik çoğu kez, akıllı kameralar ile yapılabilenden, çok daha fazlasını hedefleyeceğiz.

Profesyonel görüntü işleme uygulamaları, hemen her koşulda çalışabilecek, son derece hızlı ve tutarlı, belirli bir müşterisi olan (ya da paraya çevirilebilecek bir değer katan) uygulamalardır. İnternette, C# ya da VB ile görüntü işleme üzerine çeşitli fonksiyonların, bitmap işlemlerinin vb. anlatıldığı pek çok makale vardır. Bunlar, ya öğrenciler ya da konuya meraklı yazılım geliştiricileri içindir. Burada anlatılacak olanlar, bu gibi fonksiyonlar değildir. (Dolayısıyla bitirme projesi, dönem ödevi vb. bir amaçla bu makaleden yararlanmayı umuyorsanız, muhtemelen işinize yaramayacaktır.) Örneğin bir resimdeki dairenin alanını, iç içe for döngüleri ile vs. bulmaya kalkışmayacağız. Hemen her sektör için, endüstriyel ve profesyonel görüntü işleme uygulamaları geliştirebilmeyi anlatacağız.

Bu makaleler kimin için uygundur

  • Kendisine ait bir görüntü işleme uygulaması (exe) yapmak isteyenler
  • Akıllı kameralar ile yapılandan çok daha fazlasını yapmak isteyenler
  • İşyerinde / fabrikasında belirli işleri kendi geliştireceği sistemler ile kontrol etmek isteyenler
  • Yazılım bilgisi / tecrübesi olup, görüntü işleme konusunda yeni olanlar
  • Halihazırda geliştirdiği cihaz / elektronik aygıt vb. için akıllı görme yeteneği eklemek isteyenler vb.

Neye gereksinimiz var?

Neredeyse sadece bir PC. Muhtemelen Visual Studio (geliştirme ortamınıza göre) ya da en azından Visual Studio Express edition kurulu olmalıdır. Teknik bilgi olarak, temel yazılım bilgisi yeterlidir. (örneğin bir telefon defteri uygulaması yapabilecek düzeyde programlama bilginiz varsa, bu bilgi yeterlidir. Aksi halde, öncelikle programlama bilgisi edinmelisiniz.) Sanılanın aksine, herhangi bir kameraya gereksiniminiz yoktur. (İlerleyen makalelerde, kamera tavsiyesinde yeri geldikçe bulunacağım) Başlangıç için gerek yoktur ya da webcam bile olur.

Ne Tür Uygulamalar Yapabiliriz?

Hemen hemen her tür. Robotik, OCR, Ölçüm, Var-Yok, Bulma, Eşleştirme… Aklınıza ne geliyorsa.

Geliştireceğim Uygulama Nerelerde Çalışır?

PC ortamında. Genellikle Windows yüklü tüm PC lerde.

İleride, yazı dizisine devam edeceğim. Görüşleriniz/istekleriniz için yorum yapabilir ya da info@mavis.com.tr ye mail atabilirsiniz.

Yazı dizisinin 2. bölümü için tıklayınız…