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

Ö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…

HALCON 9.0.2

HALCON 9.0.2 versiyonunu yayımladı. Yeni versiyonda yapılan iyileştirmelerden ana başlıklar

  1. HDevelop için Geliştirilmiş Resim Alma Sihirbazı (Image Acquisition Assistance)
  2. 1D ve 2D barkod lar için geliştirilmiş okuma desteği
  3. Yüksek kontrastlı (High contrasts) resimlerde artırılmış doğrulukta ölçüm
  4. GigEVision arabiriminde kayda değer geliştirmeler
  5. Rapor edilmiş (bilinen) bug lar için düzeltmeler…

2009 Stuttgart Vision fuarında, MVTec tarafından verilen yemek sırasında özellikle 3. madde üzerinde durulmuştu. Benim de şahsen yoğun olarak kullanmayı düşüneceğim bir özellikti (Sadece bu özellikten dolayı 9.0.2 yi bekliyordum desem yeridir) Hassas ölçüm uygulamalarımızda, sıklıkla kullandığım edges_subpix yapıları, bundan sonra çok daha kesin sonuçlar verecek.  Bilindiği gibi, contour_processing işlemlerinde, foundation modülünde olduğu gibi threshold, var_threshold vb. fonksiyonlar kullanarak, kontrolü programcıya bırakmak yerine, üst düzey fonksiyonlar, programcıya fazla iş düşürmeden kendi hesabını yapmaktaydı. Ölçüm uygulamalarımızda özellikle vurguladığımız subpixel precision hassasiyeti, 9.0.2 versiyonu ile birlikte, kenar çizgisinin çok belirgin olmadığı durumlarda bile kesin sonuçlar verecek. Eski versiyonda, edges_subpix fonksiyonunda sobel_fast filtresine ait resmin gray değeri (byte tabanlı resimler için) 127 nin üzerindeyse (uint tabanlı resimlerde 32767 nin üzerindeyse),  kesinlik azalıyordu. Yeni versiyonda bu durum giderildi. Gerçi bu durum, kenar bulunmadan önce (edges_subpix işlemi yapılmadan önce) boundary ile resmi çevreleyen sınır bulunup, dilation_circle ile sınırlar bir parça genişletilip, elde edilen yeni sınır değerlerinin yapay olarak (artificially) koyulaştırılması (emphasize vb. fonksiyonlar ile) ve son olarak koyulaşmış kesin sınır alanına edges_subpix uygulanması ile giderilebiliyordu. Mavis olarak, sıklıkla kullandığımız yöntem de bu doğrultudaydı. 9.0.2 versiyonu bu konuda, biraz daha sade kod dizilimi kazandıracak bize. Son kullanıcı tarafında hassas ölçüm sonuçlarının bu anlamda değişeceğini beklemiyoruz. (Burada yeniden belirtmek isteriz ki, Mavis Kameralı Hassas Ölçüm uygulamaları, piyasada var olan en hızlı ve kesin kameralı online ölçüm uygulamalarıdır)

HALCON 9.0.2 hakkında daha detaylı bilgi için

http://www.mvtec.com/halcon/download/common/release-notes-9.0.2.html#Features_9_0_2

adresine bakabilirsiniz.