Önceki ilk 3 makalede, HALCON görüntü işleme kütüphanesinin kurulması ve örneklerin çalıştırılmasını anlatmıştık. Şimdi sıfırdan görüntü işleme temellerine giriş yaparak, basit bir uygulama geliştirmeye başlayabiliriz. Uygulamayı Visual Studio içinde derlemeden önce, HALCON kendi geliştirme ortamı olan HDevelop üzerinde geliştireceğiz. Uygulamayı HDevelop ile geliştirip, test ettikten sonra, herşey tam istediğimiz gibi çalışıyor ise, HDevelop bizim için kod üretecektir. (.NET C# vs…) son aşama olarak, bu üretilmiş kodu biraz süsleyerek, formlar, butonlar, menüler vb. kendi tasarımımız, çalışan bir uygulamaya sahip olacağız.
Burada tekrar değinmekte fayda var, HDevelop, HALCON görüntü işleme kütüphanesinin geliştirme ortamıdır. Kod yazabildiğimiz editör, görüntü işlemede yardımcı olacak tüm araçlar ve sihirbazlar barındırır. Görüntü işlemeye ilişkin neredeyse tüm işimizi HDevelop içinden yaparız.
Şimdi temel görüntü işleme bilgilerine, kaldığımız yerden devam edelim.
Görüntü işleme uygulamalarında, sanılanın aksine renkli kameralardan çok daha fazla oranda monochrome kameralar kullanılır. (Eğer renk ile ilintili bir analiz yapılmayacak ise) (Bu linkte, monokrom kameraların tercih edilme sebepleri kısaca anlatılıyor.)
8 bit, monochrome bir kamera ile alınan görüntüde,
0 : Tamamen Siyah
255 : Tamamen Beyaz
olarak kodlanacaktır. 1 Mega pixel tamamen siyah bir görüntü, pratik olarak 1 MByte 0 demektir. (jpg, bmp gibi dosyalarda, dosyanın / paketlerin başında özel header / başlık bilgileri vb. olabilir)
Özet olarak bilinmesi gereken, 0=siyah, 255=beyaz, ara değerler = gri tonlamalar şeklinde özetlenebilir.
(Eğer webcam, cep telefonu kamerası vb. kameralar ile çalışıyorsanız, haliyle renkli fotoğraflar alacaksınız demektir. Bu durumda, şimdilik bilmeniz gereken, renkli fotoğraf Kırmızı, Yeşil ve Mavi (R G B) olmak üzere 3 kanaldan oluşmaktadır. Ve her bir kanalda yine 0:tam siyah, 255:tam beyaz olarak kullanılabilir. Biz HALCON a alışmak ve temel görüntü işleme fonksiyonları hakkında biraz bilgi sahibi olabilmek için, HALCON ile yüklü gelen örnek resimler ile devam edeceğiz.)
Şimdi bu kadar basit bir bilgi ile, en önemli görüntü işleme fonksiyonu olan Threshold üzerine konuşalım. Threshold, bir görüntüde, pixelleri renklerine bakarak seçme işlemidir. (Tekrar edelim : 0= siyah, 255=beyaz)
Şimdi HDevelop isimli HALCON geliştirme ortamını açıp, ilk uygulamamızı yazmaya başlayalım. Önce HDevelop’u çalıştıralım. Hadi Bismillah.
HDevelop ortamı aşağıdaki şekilde yüklenecektir. Dilerseniz yardım dosyalarından ya da MVTec web sayfasından HDevelop ile ilgili daha fazla bilgi alabilirsiniz. Ya da, yolumuza devam edelim, ileride aklınıza geldikçe yardım dosyalarına göz atabilirsiniz.
HDevelop, 4 pencereden oluşan MDI bir uygulamadır. Genellikle sağ alt köşede, editör yer alır. Burası, kod yazdığımız alandır. HDevelop kod yazma dili, kendisine özgü bir script dilidir. Syntax olarak, pascal a benzer. Biraz programlama becerisi olanlar, kolayca uyum sağlar.
Artık ilk kodumuzu yazmaya hazırız. (Not : HDevelop başlarken lisans ile ilgili bir hata vermiş ise, demek ki geçerli bir HALCON lisansınız yok. Bu durumda bizden deneme lisansı istemeniz gerekmektedir.)
Ve işte ilk komutumuz : read_image. Adı üstünde, bir dosyadan resim okur/yükler. HALCON ve HALCON örnek resimleri düzgün yüklendi ise, HDevelop editöründe yazacağınız
read_image(Image, ‘rings_and_nuts’)
kodunu, F5 ile çalıştırdığınızda, ekran görüntüsü aşağıdaki gibi olmalıdır.
Resimden de görüldüğü gibi, HDevelop 4 kısımdan (pencere) oluşmaktadır. Kod yazdığımız editör, Operatör penceresi, Grafik penceresi ve değişkenlerin değerlerini gözlemlediğimiz Değişken penceresi.
yazdığımız kod satırının üzerine 2 kez tıkladığımızda, o satırdaki görüntü işleme fonksiyonu operatör penceresinde açılır (parametrelerini inceleyip değiştirebilmemiz için)
Bu operatör penceresi, yeni başlayanların çok sık kullanacağı, profesyonelleştikçe, daha az ihtiyaç duymakla birlikte, sürekli elinizin altında olması gerekli bir yardımcıdır. Parametreleri seçebilmeniz için değerler önerir, parametreler bir listeden seçilebilir ve çok daha hızlı kod yazmanıza olanak sağlar.
Burada, read image dediğimizde, hemen bir liste sundu ve ben listeden istediğimi seçerek, yazma zahmetinden kurtuldum. Operatör penceresine biraz daha yakından bakarsak, oradaki şekillerin bize bazı bilgiler verdiğini görürüz.
Programcılıkla ilgilenenlerin kolaylıkla anlayacağı şekilde;
read_image(Image, ‘fabric’)
ifadesi, fabric isimli bir resmin okunup, sonucun Image isimli bir değişkene koyulacağı anlamına gelir. Eğer bunu C# ile kodlayacak olsaydık,
void read_image(out Image, “fabric.jpg”);
gibi bir eşdeğeri olacaktı. HDevelop, read_image fonksiyonunda dosya uzantısını yazmazsak, geçerli tüm resim formatlarını (bmp, jpg, png.. arar)
sonuçta, ekranın sol üst penceresinde, (Graphics Window) resim yüklenecektir.
Artık ilk görüntü işleme uygulamamıza geçelim. Uygulamamız şöyle olsun : rings_and_nuts isimli resim dosyasında, kaç adet nesne (somun, dişli) var?
Bunun cevabı, ekranda siyah ya da siyaha yakın (gri tonlarda) kaç adet nesne var?
programımız basitçe şu şekildedir.
read_image(Image, ‘rings_and_nuts’)
threshold(Image, Region, 0, 128)
F5 e basarak çalıştırdığımızda, aşağıdaki gibi bir ekran görüntüsü oluşacaktır. (F2 ile başa dönebilirsiniz, F6 ile adım adım çalıştırabilirsiniz)
Görüldüü gibi, ekranda verdiğimiz aralığa uyan pixeller, kırmızı ile boyandı. gözle saydığımda 7 nesne (somun, dişli) görüyorum. Bunu HALCON a saydıralım.
Connection komutu :
Connection threshold sonucu seçilmiş pixellerden oluşan kümeyi (region) birbirine değmeyen bağımsız nesneler dizisine ayırır.
programıma 1 satır daha eklersem;
read_image(Image, ‘rings_and_nuts’)threshold
(Image, Region, 0, 128)
connection(Region, ConnectedRegions)
şeklini alır, ve çalıştırdığımda da ekran görüntüsü aşağıdaki gibi olur.
HDevelop, belli olsun diye, her nesneyi ayrı bir renge boyadı (ilk başta hepsi kırmızı idi ve tek bir nesne idi)
şimdi nesne sayısını veren komut count_obj ile sonucu öğrenebiliriz.
Programımı;
read_image(Image, ‘rings_and_nuts’)
threshold(Image, Region, 0, 128)
connection(Region, ConnectedRegions)
count_obj(ConnectedRegions, Number)
set_tposition(3600, 220, 180)
write_string(3600, Number)
şekline uyarlayıp çalıştırırsam, ekranda row:220, column:180 pozisyonuna gidip, nesne adedini yazacaktır. Buradaki 3600, grafik penceresinin ID sidir. Tek bir grafik penceresi var ise 3600, 2 si 3601 … ID numarasını alır. İleride daha detaylı değinilecektir. Şimdilik bilmemiz gereken, ekrana (3600 nolu pencereye) “Merhaba Dünya!” yazmak istiyorsak write_string(3600, ‘Merhaba Dünya!’) şeklinde bir kod yazmamız gerektiğidir.
Ekrana 8 yazdırdıysanız, buraya kadar başarıyla geldiniz demektir. Bir yerlerde takıldıysanız, mail ya da yorum ile yardım isteyebilirsiniz.
Bir sonraki derste, select_shape fonksiyonunu göreceğiz ve buradan C# uygulamasına geçeceğiz.
Sonraki Bölüme geçmek için tıklayınız…