Kameralı Hız Belirleme

Kamera ile hız belirlemek (bir tür radar) konusunda öğrenciler ya da meraklılar için basit bir HALCON kodu ile yardımcı olmak istedim. Kameralı hız belirleme konusunda bir çok yaklaşım olabilir. En sık kullanılan yaklaşım, ardışıl olarak alınan 2 görüntü arasında, farklılıkları belirlemek, (bu farklılıklar genellikle yer değiştiren nesneler, yani araçlardır) ve bu farklılıktan kaynaklanan yer değiştirme mesafesini bulup, arada geçen zamana bölmek suretiyle hızın elde edilmesidir.

Örnek olması açısından, şirketimizin balkonundan cep telefonumla sokaktan geçen araçlarn resimlerini çektim. (Normalde, kullanılan endüstriye kameralar, resim ile birlikte resmin alındığı hassas zaman bilgisini de verirler. Konuyla ciddi ilgilenenler o tür kameralar bulmalıdır. örneğin iDS imaging ürünleri)  Ben cep telefonumla çektiğim için, ortalama 2 sn bekledim. (Yani, umarım) Tabii elim sabit olmadığı için kamera biraz titredi 🙂 Yine de tüm bunlar, yoldan geçen güzelim twingonun hızını iyi kötü belirlemem için engel teşkil etmedi.

İşte aldığım resimler ve işte bunları işleyen HALCON kodu.

Aslında buradan rar dosyasını da indirebilirsiniz.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Programın çalıştırılması ile oluşan ekran görüntüsü ise

 

 

 

 

 

 

 

 

Programın çalışma şekli.

Program aslında thresholding ile, lacivert renkli nesneleri arar. Görüntü renkli kamera ile alındığı için, önce RGB kanallarına ayırıyor resmi. Sonra HSV değerlerini buluyor. Threshold işlemlerini HSV kanallarında yapıyor.

Bir kere aracı bulduktan sonra, gerisi zaten 4 işlem. Anlatmaya gerek yok.

İdealde, bunun gibi sadece özel bir renge göre radar yapılmaz tabii 🙂

İdealde olması gereken, iki resmin karşılaştırılıp, aradaki farkı oluşturan noktalardan araçlar bulunup hız belirleme yapılmasıdır. check_difference isimli HALCON örneği incelemeye değer güzel bir çalışmadır mesela.

Konuyla ilgilenenlere kolay gelsin diyorum. İlgi alaka olursa, daha profesyonel olarak konuya yaklaşımları da irdeleyebiliriz.

Kirli İşler için Classifier Kullanın

Görüntü işleme uygulamalarında, bazen göze çok basit görünen işler, içinden çıkılmaz hale gelebilir. Threshold seçimi bunların başında gelir. Uygun bir threshold seçersiniz Diyelim ki var_threshold. 3-5 örnekte mükemmel çalışır, 1-2 örnekte teklemeye başlar, sonunda -öyle resimler çıkar ki- hiç çalışmaz 🙁 Neyse ki, HALCON var, moral bozmaya gerek yok. “Bir çok alternatif thresholding yöntemi sunuyor ne de olsa” özgüveniyle, hemen başka bir threshold seçilir. Mesela dynamic threshold. Sonuçlar baştan kontrol edilir. Eh, biraz daha iyi. Ama hala yakalanamayan örnekler var. İşin kötüsü, bazı resimlerde var_threshold iyi sonuç verirken, bazen de dyn_yhreshold iyi sonuç veriyor. Hangi durumda hangisini kullanalım? İkisinin sonucunu union yapıp denesek, bu kez de bazı istenmeyen durumlar çıkıyor. İstenmeyen durumları opening_circle vb. fonksiyonlarla elesek, sonra dilate etsek… derken bir bakmışsınız, yüzlerce satır HALCON kodu ile boğuşuyorsunuz.

Bu durum hemen hemen tüm görüntü işlemecilerin başına sık sık gelmektedir. Böyle bir durumla karşılaştıysanız, yanlış yoldasınız demektir, en iyisi önce bir mola verip şu klibi izleyin.

http://www.youtube.com/watch?v=y14_nLOi7YU

“Dirty deeds done dirt cheap”. Demek istediğimiz tam da bu. Kirli işler öyle kastırarak değil, (bizde) ucuz ve kolay yoldan halledilir.

Classifier Kullanımı :

Classifier belirgin 1 ya da 1 den fazla ortak özelliği bulunan nesneleri, bu ortak özelliklerine göre sınıflayarak seçmek için kullanılır. Örneğin bir resimdeki nesneleri, renklerine göre sınıflamak isteyebiliriz. HALCON a, bana bu resimdeki yeşilleri, mavileri, sarıları ver diyebilirim. Aksi halde, tek tek, farklı renklerin farklı threshold değerleri ile ilgilenmek zorunda kalacaktım. Ve bence işin en güzel yanı, bir örnek resim üzerinde, nesneleri tek tek göstrerek, mavi bu, yeşil bu, sarı bu, hadi bunları öğren, ve diğer resimleri verdiğimde, bana bu renkleri bu diyebilme kolaylığı.

Özetle, classifier yaygın olarak kullanılmalıdır. Çok düzgün ve güvenilir sonuçlar verir. Hızlı çalışır, iyi optimize edilmiştir. Sonuçlar kaydedilebilir / okunabilir vs.

 

Threshold seçimi ile uğraşıp 100 lerce satır HALCON kodunu silip, classifier kullanarak 3-5 satırla halledebileceğinizi görünce, ofisin içinde baştan sona Angus Young yürüyüşü yapacağınıza eminim. (yukarıdaki klibin ilk saniyelerinde. Angus Young yürüyüşü yapmayı bilmiyorsanız, buradan öğrenebilirsiniz. http://www.youtube.com/watch?v=MPBSKl9TpO8 (hayatımda böyle saçma video görmedim) )

Şimdi GMM classifier kullanan bir örnek verelim.

Bronz renkli metal plakanın üzerindeki kırmızı renkli çizgileri yakalayan bir görüntü işleme programı yazmamız isteniyor.
Klasik thresholding yöntemlerine göre elde ettiğimiz sonuçlar :

Yukarıdaki örnekte, yakalamak istediğimiz kırmızı çizgiler gayet başarıyla yakalanmış. (Etrafı yeşil ile çizilerek gösterilmiş). Fakat, kırmızı çizginin kalınlığı azaldıkça, kırmızı boyanın etkisi de azalmakta ve threshold kırmızıyı yakalamakta biraz zorlanmaktadır.

Yukarıdaki örnekte, uygulamamızın kırmızı çizgiyi kısmen yakaladığını ama tam istediğimiz gibi olmadığını görüyoruz.

Sonuçta, yukarıdaki gibi bazı örnekler için ise, kırmızı çizginin hiç yakalanamadığını görüyoruz. Kırmızı çizginin bazen yakalanıp, bazen yakalanamaması,

  • plaka yüzeyinde ışık şiddetinin değişken olması (sağ ve sol iyi aydınlanıyor, orta taraf iyi aydınlanmıyor)
  • Çizgi kalınlığının değişken olması (dolayısıyla ince çizgilerde kırmızı rengin belirsizleşmesi)
  • Zeminde lekeler açık koyu bölgeler olması
  • Bronz zeminin kendi içinde kırmızılık içermesi

gibi sebeplerden olabilir.

 

 

 

 

 

 

 

 

Yukarıdaki resim, yanlış threshold denemeleri ile boğuşurken, farketmeden hızlıca artmış HALCON kodlamasını gösteriyor.

GMM classifier kullanılarak yazılan aşağıdaki kod ise, tüm durumlarda %100 çalışarak istenen sonucu almamızı sağlamıştır.

 

set_display_font (3600, 16, 'mono', 'true', 'false')

list_files ('C:/Projects/Bronz/R', ['files','follow_links'], ImageFiles)
* list_files ('C:/Projects/SahinMotor/deneme 2/çapraz ışık/nok', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima)$','ignore_case'], ImageFiles)

* Red Region seçimi
read_image (Image, 'Reddic.jpg')
gen_rectangle1 (ROI_0, 198.172, 226.049, 485.801, 901.164)
reduce_domain(Image, ROI_0, ImageReduced)
decompose3(ImageReduced, R, G, B)
bin_threshold(G, RedRegion)
*

create_class_gmm (3, 1, 1, 'full', 'none', 3, 42, GMMHandle)
add_samples_image_class_gmm (Image, RedRegion, GMMHandle, 0)
train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.001, Centers, Iter)
create_class_lut_gmm (GMMHandle, ['bit_depth','rejection_threshold'], [6,0.03], ClassLUTHandle)
clear_class_gmm (GMMHandle)

dev_set_color('blue')
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    reduce_domain(Image, ROI_0, ImageReduced)
    classify_image_class_lut (ImageReduced, ClassRegions, ClassLUTHandle)
    closing_circle(ClassRegions, RegionClosing, 3.5)
    area_center(RegionClosing, Area, Row, Column)
    if (Area > 500)
        disp_message(3600, 'KIRMIZI', 'image', 12, 12, 'red', 'true')
    endif
    stop()
endfor

Yazılımımız artık MODBUS uyumlu

Kameralı kontrol yazılımımız VYP, artık %100 Seri ve TCP modbus uyumlu.

Hem ModBus Slave, hem de ModBus TCP protokollerini tam destekleyen arabirimimiz ile, ModBUS protokolü üzerinden her tür çevre birim ile hızlı ve güvenli haberleşmek mümkün.

ModBus, Robot haberleşmesi, SCADA sistemleri, HMI, PLC, OPC vb. üniteler ile haberleşmek için geliştirilmiş bir endüstri standardıdır ve Mavis tarafından artık tam olarak desteklenmektedir.

Vibrasyonlu Besleme Sistemleri ve Okeymatik

Endüstride vibrasyonlu besleme sistemleri sık sık kullanılır. Dizmek, sıralamak, ayıklamak, belirli bir yere yönlendirmek vb. amaçlarla bir çok işletmede kullanılırlar.

Bir arkadaşım bana otomatik okey masasından (okeymatik) bahsettiğinde, bu işin vibrasyonlu besleme sistemi ile basit bir şekilde yapılabileceği hiç aklıma gelmemişti. Okey oynamadığımdan (ve masayı gözümle görmediğimden) youtube da birkaç video buldum. (okeymatik, otomatik okey masası ya da benim yaptığım gibi “automatic mahjong table” ifadeleri ile aratabilirsiniz. )

Aşağıdaki linkte verdiğim videoda görüldüğü gibi, son derece hızlı bir şekilde diziyordu.

http://www.youtube.com/watch?feature=player_embedded&v=FJx9n-Itl8

Peki, sistem nasıl çalışıyor.
Sistem, 2 farklı set kullanıyor. Daha önceden dizilmiş 1. set hemen masaya çıkartılırken, 2. set, vibrasyonlu besleme sistemi ile diziliyor, kullanıma hazırlanıyor. Böylece bekleme hemen hemen hiç olmuyor.

İşte bu da, sistemin nasıl çalıştığını gösteren video .

http://www.youtube.com/watch?feature=player_embedded&v=rnCgsty4_0o

İşin içine Çin işi seri üretim de girince, maliyetler çok ucuz rakamlara inebilmektedir. (Ülkemizdeki satış fiyatları genelde 2-3 bin TL mertebesinde)

TOF (Time Of Flight) Kameralar ve yeni Kinect

TOF (Time of Flight) kameralar, normal kameralara ilaveten işin içine mesafe ölçüm sensörlerinin de sokulduğu, dolayısıyla 3 boyutlu görüntü alınabilen kameralardır. Mesafe ölçüm sensörleri, genellikle infrared bir kaynaktan, hedef üzerine foton gönderir. Fotonlar hedeften yansıyıp geri gelir. Çok hassas bir zaman ölçümü ile, gelen foton gecikmesinden hedefin bulunduğu konum hassas olarak belirlenir. (Radar olarak bildiğimiz yöntem) Genellikle matris şeklinde dizilmiş binlerce sensör kullanıldığından, görüş alanındaki hedef 3 boyutlu olarak hızlı bir şekilde çıkartılmış olur.

Soldaki resim Panasonic D-Imager TOF sensörünün çalışma mantığını sembolize etmektedir. Yansıyan fotonların, günışığı ya da başka ışık kaynakları ile karışmaması için, dalga boyu bilinen IR aralığında seçilmesine özen gösterilir. Yine de gün ışığı spektrumu çok geniş olduğu için, özellikle arka plandan yansımalar bazen sonucu olumsuz etkileyebilir.

TOF konusunda, kesinlikle incelenmesi gereken bir diğer endüstriyel ürün ise MESA Imaging firmasının SwissRanger 4000 isimli ürünüdür. 4.000 USD civarında bir satış fiyatı vardır.

Daha ucuz bir alternatif için Microsoft yeni Kinect göze çarpmaktadır. Yakında piyasalarda olacak olan yeni xBox oyun konsolu için geliştirilmekle birlikte çok farklı sektörlerde sıkça karşımıza çıkacağı kesin gibidir. Yeni Kinect, eskisinin aksine TOF teknolojisine dayanmaktadır. (Eski Kinect Stereovision teknolojisine göre çalışmaktaydı.)

Microsoft, yeni Kinect için, İsrail Elron firmasının ZCam isimli ürününü kullanmaya karar verdi. Bunun için, öncelikle Elron firmasını, ortalama olarak 5 milyon USD gibi bir rakama satın aldı. Bununla da yetinmeyip, 3D konusunda öncül bir diğer sensör firması Canesta yı da (rakam açıklanmadı) bünyesine kattı. Bu satın almalar, 3D konusunda Microsoftun gözü kara bir şekilde yatırım yapmaya devam edeceği anlamına da gelmektedir. Diğer yandan, özellikle Amerikada çok sıkı olan patent ihlal davaları/mahkemeleri ile (Kinectin patenti PrimeSense firmasına aittir) uğraşmak istemediği anlamına da gelir.

Bu video http://youtu.be/Hi5kMNfgDS4?t=5m27s yeni Kinectin 3 boyutlu algılama ve yeni teknolojiler konusunda ne kadar başarılı olduğunu göstermektedir.

Bu video ise, https://www.youtube.com/watch?v=5_PVx1NbUZQ Canesta’nın yeni sensörünün yeteneklerini göstermektedir. Sensör boyutuna bakılırsa, Canesta’nın bu yeni tip 3D sensörünü mobil uygulamalar (cep telefonları) üzerinde göreceğimiz günler yakın demektir. (Videonun 3 yıl önce çekildiği düşünülürse, şu an gelinen noktanın çok daha ileride olduğunu tahmin etmeye gerek yok)

Tüm bu teknolojiler gelişirken, biz neredeyiz?

MAVIS olarak, piyasada var olan bir çok farklı ürünü denedik, SDK larını inceledik, Avantaj ve dezavantajlarını değerlendirdik. (Microsoft Kinect for Windows, Asus xTion Pro, Leuze LPS36 gibi…) Halihazırda, klasik RGB kameralar ile alınan görüntülerve HALCON 3D/Stereo Vision yöntemleri ile çalışmak daha makul gibi görünmektedir. Distribütörü olduğumuz iDS imaging firması, 3D Imaging konusunda Ensenso isimli ürününü geliştirmiştir. HALCON uyumu, iDS güvencesi ve daha makul fiyatları nedeniyle tercih edilebilir.

Bu makaleleri takip edenler için, TOF v.b. yeni nesil sensörler ve uygulama alanları hakkında yeri geldikçe bilgiler vermeyi ve yeni başladığımız bir projeyi sunmayı düşünüyorum.

Projeleriniz ve ilave bilgi için, bizimle iletişime geçebilirsiniz.

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

Yazı Dizimizin 3. bölümü ile tekrar merhaba;

HALCON bölüm II de anlatıldığı şekilde indirildi ise, bilgisayarınızda aşağıdaki resimde gösterdiğim gibi, 2 dosya olmalıdır. HALCON programı /halcon-11.0.1-windows.exe) ve örneklerin çalışması için gerekli olan resimler (halcon-11.0.1-images-windows.exe).

Şimdi halcon-11.0.1-windows.exe dosyasını çalıştırarak, HALCON u yüklemeye başlayabiliriz. Standart bir yükleme arayüzüne sahip HACON 11, sorunsuzca yüklenecektir. HALCON 11 yüklenirken, Full yüklemeyi seçebilirsiniz.

İleri dediğinizde, resimleri ayrı olarak yüklemeniz gerektiğini hatırlatan bir diyalog kutusu gösterecektir.

resimler, örneklerin çalışması için gereklidir. Daha önceden indirdiğiniz halcon-11.0.1-images-windows.exe programını, kurulum bitince çalıştırabilirsiniz.

aşağıdaki ekran geldiğinde, (dongle çin driver) hiçbir kutuya işaret koymayın.

 

Tüm kurulum bittikten sonra, resimleri de yükleyin. (halcon-11.0.1-images-windows.exe programını kurun) Bilgisayarınızda, C:\Program Files\MVTec\HALCON 11 klasörünün görünümü aşağıdaki gibi olmalıdır.

 

Şimdi, programın çalışması için lisansa ihtiyacınız olacaktır. Bizden temin edeceğiniz deneme lisansını (license_eval_halcon11_2013_07.dat gibi bir isimde, 670 byte uzunluğunda text dosya) buradaki license klasörüne kopyalayın. Artık HALCON çalışmaya hazırdır. Başlat menüsü görünümü aşağıdaki resimdeki gibi olacaktır.

 

Şimdi artık HALCON ile çalışmaya hazırız. Buradaki HDevelop isimli menü öğesini çalıştıracağız. HDevelop, HALCON geliştirme ortamıdır (IDE). Eğer lisans hatası yok ise, çalıştırdığımızda direk HDevelop IDE si karşımıza gelir.

Eğer, dil türkçe olarak gelmiş ve ingilizce ile çalışmak istiyorsanız, Düzenle menüsü –> Tercihler –> Dil sekmesinden ingilizceyi seçebilirsiniz. HDevelopu yeniden başlattığınızda bu yeni seçtiğiniz dil tercihi geçerli olacaktır.

HDevelop 4 ana pencereden oluşur

1. Graphics Window (Grafik Penceresi) Burada üzerinde çalışacağımız resim gösterilir. Büyültme, küçültme vb. araçlar ile.

2. Operator Window (Operatör Penceresi): Her bir görüntü işleme operatörünü ve parametrelerini gösteren penceredir.

3. Program window (Kod Penceresi) : program yazdığımız, HALCON kodu yazdığımız kod penceresidir.

4. Variable Window (Değişkenler penceresi) : Program çalışırken, her bir değişkeni görebileceğimiz penceredir.

Bu pencerelerin genelde hepsi sık sık kullanılır. Yanlışlıkla biri kapatılmışsa, Ana menüdeki Pencere menüsünden, kapatılmış olan seçilerek yeniden açılır. Artık buraya kadar gelinmiş ise, direk görüntü işleme uygulamaları geliştirmeye başlayabiliriz.

Program Editörde, sağ üstteki butonlardan 2. si, Use Full Text Editör olacak şekilde işaretli (yeşil çek) olsun. Bu durumda, tıpkı diğer programlama dillerinde aşina olduğumuz gibi, serbest olarak alt alta kod yazabiliriz. Aksi halde, diyalog penceresi yardımıyla kod yazılır. Başlangıçta, diyalog penceresi üzerinden kod yazmak daha mantıklı olsa da, ileri aşamalarda full text editör daha kullanışlı gelecektir.

Örneklerin Çalıştığını Teyit Etme

Ctrl-E tuşu ile, ya da araç çubuğundaki Browse Examples butonu ile, ya da Dosya menüsündeki Browse HDevelop Program Examples menü öğesi seçilerek, karşınıza aşağıdaki pencerenin çıkmasını sağlayın.

Yüzlerce HALCON örneğini inceleyebilirsiniz. Sağ taraftan herhangi birini seçip, Open butnuna bastığınızda, örnek HDevelop ekranında açılmış olmalıdır.

F5 tuşuna basarak, çalıştırabilirsiniz.

stop() komutunun olduğu yerde program sizden çalışabilmek için yeniden F5 tuşuna basmanızı bekler. Birkaç örneği incelemeniz, HALCON hakkında size fikir verecektir. Program penceresindeki kodlara genel bir göz atarak, HALCON kodlamasının neye benzediği konusunda fikir sahibi olabilirsiniz. Kodlar, gözünüzü korkutmasın. Zamanla aşina olacaksınız. Yapacağımız örnekler ile, kısa sürede siz de HALCON kodlamasına hakim olacaksınız. Örnekleri incelemek, çok iyi fikir verecektir. Bu yüzden sık sık örnekleri incelemenizi tavsiye ederim. Hemen hemen her konuda, her sektöre, her fikre uyan bir ya da daha çok örnek mevcuttur. Sırf bu örnekleri incelemek bile, size HALCON hakkında güçlü bir fikir verecektir. Tabi, biz sıfırdan başlayarak, HALCON kodu yazmayı, hemen arkasından bunu C#, VB gibi dillere export etmeyi ve kendi uygulamamızı geliştirmeyi adım adım göstereceğiz.

Eğer buaraya kadar geldiyseniz, bir sonraki makalede, kendi ilk özgün HALCON kodumuzu geliştireceğiz. Bir sorun yaşamışsanız, buradan bildirebilirsiniz.

Bir sonraki bölüme geçmek için tıklayınız…

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

Yazı dizimizin, yeni bölümünde tekrar merhaba.

İlk bölümde, üzerine basarak vurguladığımız, profesyonel PC tabanlı görüntü işleme uygulaması oluşturabilmek için, öncelikle profesyonel bir kütüphane kullanacağız. Bu makaleler dizisinde, bu kütüphanenin yüklenmesinden, kurulumuna, uygulama geliştirmeden, exe (çalışan kod üretmeye) kadar her şeyi detaylı olarak uzun uzun anlatılacaktır.

Şimdi bir yazılımcı olarak, neden kütüphane? diye bir soru geliyor insanın aklına. Hiç ticari (profesyonel) bir kütüphane kullanmasak, her şeyiyle kendimiz geliştirsek daha iyi olmaz mı? Bunun en kısa yanıtı : Olmaz. Bir veritabanı uygulaması geliştireceğimiz zaman, SQL, Oracle, MySQL, Acces vb. bir ürün (onlar da bir kütüphane / framework nihayetinde) kullanmamız gerektiğini sorgulamıyorsak, görüntü işleme uygulamamızda da bir kütüphane kullanmamız gerektiğini sorgulamamalıyız.

Ancak belki aşağıdaki durumlarda ticari bir kütüphane yerine kendi kütüphanemizi geliştirmemiz mantıklı olabilir;

  • ArGe desteği alan bir şirket vardır ve bu destek yazılacak bu yeni kütüphane için verilmiştir.
  • Üniversitede yüksek lisans / doktora v.b. bir çalışma yapılıyordur ve yapılacak çalışmanın özgün olması istenmektedir.
  • Ticari bir ürün gerekmiyordur. Yavaş / eksik vb. olsa bile, amaç kendi yaptığımız iy/kötü basit bir görüntü işleme uygulamasıdır ve bu yüzden detaylı bir kütüphane kullanmaya/öğrenmeye gerek duyulmamaktadır.
  • Geliştirilecek ürün binlerce adet satılacaktır ve binlerce defa başka kütüphanelere lisans ücreti ödenmek istenmemektedir.
  • Geliştirilecek ürün çerçevesi çok net belirlenmiş tek bir üründür (Plaka Tanıma / Yüz tanıma vb.) Bu durumda bir kütüphanenin yüzde 1 lik fonksiyonlarını kullanıp para ödemek yerine, hiç kullanmamak daha mantıklı olabilir.
  • Askeri ya da çok çok gizli bir proje vardır ve siyah giysili adamlar başka bir kütüphane kullanılmasına izin vermemektedirler…

Ülkemizde bu yolu izleyen (kendi görüntü işleme kütüphanesini geliştiren), bir (ençok iki) elin parmakları kadar şirket vardır. Bunlar genelde üniversite bünyelerinde ya da teknoparklarda kurulmuşlardır. Bir şekilde teşviklerle (personel ya da devletin sunduğu proje destekleri (TEYDEB, Tübitak, Kosgeb, Avrupa Birliği vb.)) ayakta kalmaktadırlar.

Eğer yukarıdaki maddelerden herhangi biri size uyuyorsa, ya da benim bilmediğim/saymadığım herhangi bir sebepten dolayı kendi görüntü işlem kütüphanenizi geliştirmek/kullanmak konusunda ısrarlı iseniz, bu yazı dizisi artık size hitap etmeyecektir. (Bir mail ile haklı gerekçelerinizi bana bildirirseniz, burada memnuniyetle paylaşmaya hazırım)

Bu arada, görüntü işleme kütüphanesi yazmaya hevesli olan arkadaşlara bu işin çok ta kolay olmadığını hatırlatmak isterim. Mesela sadece kenar bulma üzerine, 20 ye yakın yaygın algoritma vardır (canny, lanser, deriche, shen, sobel …) ve bunların tek birini bile implemente etmek pek kolay bir iş değildir. Örneğin bu PDF, canny edge detection algoritmasının mantığını anlatmaktadır.

Diğer yandan, her bir görüntü kaynağı (kamera, fotoğraf makinesi vb.) kendi SDK sı ile gelmektedir. USB2, USB3, Gigabit, CameraLink, GenICam vb. çeşitli yöntemler ile bilgisayara bağlanabilen bu cihazlardan görüntü almak, bu cihazlara hükmedebilmek (pozlama, kazanç, AOI işlemleri vb.) için, işi gücü bırakıp her bir ayrı üreticinin kamera/fotoğraf makinesi detaylarını öğrenebilmek gerekmektedir ki, yüzlerce marka/model ve yazılım sürümleri arasında kaybolmadan bunları yapabilmek te pek kolay değildir)

Özetle, (bana inanın dostlar), profesyonel bir görüntü işleme uygulaması geliştirmek istiyorsanız, en iyi yol, güçlü bir ticari kütüphane kullanmaktır.

Bu durumda soru şuna indirgeniyor. Peki hangi kütüphane? Önce cevabı vereyim, sonra sebeplerini anlatayım. cevap : HALCON.

Neden HALCON?

Burada, pazarlamacı/reklamcı ağzı ile ifadeleri bir tarafa bırakıp, gerçek dünyadan bir örnek vermek istiyorum.

1960 lı yıllardan beri, kendi görüntü işleme teknolojileri üzerine geliştirmeler yapan NASA, 2010 yılından itibaren HALCON kullanmaya karar vermiştir. Robotik görme ve 3D vision dediğimiz teknolojilerde HALCON kullanan R2 robotunu uzaya göndermiştir.

Gizliliği ve üst düzey teknolojisi ile bilinen NASA gibi bir kurumun, kendi görüntü işleme tekniklerini bir yana bırakıp, Alman malı bir görüntü işleme kütüphanesi kullanmaya karar vermesi yeterince etkileyici bir örnek. Buna rağmen, biz yine de birkaç makul gerekçe sunalım.

  • HALCON halihazırda var olan en güçlü ve en hızlı görüntü işleme kütüphanesidir.
  • Çok gelişmiş programlama desteği sunar. (.NET, Linux, MacOS..)
  • Kendi geliştirme ortamı vardır. (Sadece görsel bir tool değil, kendi programlama dili ile kod yazabildiğiniz Visual Studio benzeri bir IDE sunar)
  • Sizin adınıza C#, VB, Delphi … için kod üretir.
  • Gerçek bir exe üretirsiniz. (Interpreter / yorumlayıcı vs. değil)
  • Üniversitelerde yaygın olarak kullanılmaktadır (standart hale gelmiştir)

gibi maddeler ilk aklıma gelenler (Tekrar ediyorum, pazarlamacı/reklamcı ifadelere yer vermek istemiyorum. Yapılan Benchmark testlerinde HALCON açık ara önde bir kütüphanedir fakat uzun uzun bunlara yer verip, operatör sayısı, işlemci kullanma yüzdesi, hızı vb. vb. şimdilik gereksiz)

Peki HALCON nasıl tedarik edilir, nasıl yüklenir, maliyeti nedir?

HALCON, aşağı yukarı 500 MB büyüklüğünde bir SDK dır. bir o kadar da örnek resimleri vardır. Ortalama olarak 1 GB civarı bir üründür.

Bu ürünü öncelikle kendi web sitesinden ücretsiz olarak indirebilirsiniz.

İndirme esnasında, register (kayıt) olmanızı isteyecektir. (Korkmadan register olabilirsiniz. Spam mail bombardımanına, gerekli gereksiz hatırlatmalara vb. maruz kalmazsınız.) Register olurken irtibatta olduğunuz firma v.b. bir yer varsa oraya MAVIS yazmanız tavsiye olunur. Girdiğiniz bilgiler, belirttiğiniz firmaya iletilecek ve eğer direk bize gelirse hızlıca size lisans verebiliriz. Aksi halde süreç biraz uzayabilir

Alternatif olarak, 2GB bir flash disk ile ofisimize gelip beni bulursanız size direk kopyalayıp / geçici lisanslayıp verebilirim.

webden yüklediyseniz, hem programı (32 ya da 64 bit) hem de resimleri ayrı ayrı yüklemeniz gerekmektedir.

Yükleme işlemi bittikten sonra, programın çalışabilmesi için sizden lisans isteyecektir. Bana ulaşarak (info@mavis.com.tr) geçici lisans alabilirsiniz.

HALCON 2 tip versiyona sahiptir.

Runtime ve Development. Runtime versiyonu son kullanıcının makinasına yüklenecek kısımdır. Development ise, geliştirme yapılacak bilgisayarda (programcının bilgisayarında) çalışacak olan versiyondur.

Lisanslama maliyeti, Runtime için kullanılacak modüllere göre değişim gösterebilmektedir. (Net rakamlar için şirketimizle irtibata geçiniz. Ben teknik bir personel olduğum için, çoğu kez lisans maliyetleri ile ilgilenmem.)

Development lisans maliyeti haliyle daha yüksektir. (Üniversiteler için gayet ciddi indirimler uygulanmaktadır.)

Şimdi, bir programcı olarak neye ihtiyacınız var. Herşeyden önce, tüm sistemi denemek, çalıştırmak için deneme lisansı ile, eksiksiz, tam fonksiyonalite ile çalışabilirsiniz. Ürününüz satılma noktasına geldiyse, o zaman net lisans rakamlarını öğrenirsiniz.

Görüntü işleme uygulamaları, çok ucuz uygulamalar değildir. Bence HALCON lisans maliyetleri, kesinlikle ürkütücü değildir. Yine de tekrar belirtmek isterim, HALCON ücretsiz bir ürün değildir. Böyle bir beklenti içinde olanlar, yazı dizisinin devamını beklemeden burada ayrılabilirler.

Programcı, kendi makinasına HALCON development ürününü kurar ve görüntü işleme dünyasına adımını atar.

Makalemizin 3. sayısına ulaşmak için tıklayınız…

Yakında 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…

Mosaicking yöntemi

Bir parçanın birden fazla kamera ile çekilmiş görüntülerindeki ortak noktaların bulunarak birleştirilmesidir. Yöntemin daha sağlıklı çalışması için kameraların birbirleri ile kalibre edilmesi gereklidir. Genellikle çözünürlüğün(hassasiyetlerin) arttırılması için kullanılır.

Örneğin: Bir cetvelin 2 farklı kamera ile görüntüsünü alalım. Bu görüntüleri alırken dikkat etmemiz gereken iki görüntü arasında benzer kısımların bulunması gerekliliğidir.

 

 

 

 

Mosaicking yöntemiyle birleştirilen görüntü :

 

 

 

 

 

 

HALCON Kodu :

ImgPath := 'deneme/'
ImgName := '5_'
Times := []
Colors := ['red','coral','yellow','lime green']
read_image (Images, ImgPath + ImgName + ['sag','sol'])
* The internal camera parameters of the used camera to eliminate radial distortions)
CamParam := [0.0049315,-649.238,5.32872e-006,5.3e-006,512.613,668.631,1280,1024]
change_radial_distortion_cam_par ('adaptive', CamParam, 0, CamParOut)
change_radial_distortion_image (Images, Images, Images, CamParam, CamParOut)
tile_images_offset (Images, TiledImage, [0,0], [0,1280], [-1,-1], [-1,-1], [-1,-1], [-1,-1], 2560, 1024)
From := 1
To := 2
select_obj (Images, ImageF, From)
select_obj (Images, ImageT, To)
NumLevels:=1
* Calculate the projection between the two images
proj_match_points_ransac_pyramid (ImageF, ImageT, NumLevels, RowFAll, ColFAll, RowTAll, ColTAll, ProjMatrix, Points1, Points2)
* Generate the mosaic image
gen_projective_mosaic (Images, MosaicImage, 1, From, To, ProjMatrix, [2,1], 'false',MosaicMatrices2D)

Photometric Stereo yöntemi

Görüntü işleme uygulamalarında genellikle kamera ve ışık sabit bir açıda durmaktadır. Oysa, sabit bir açıdan bakıldığında her zaman istediğimiz sonucu elde edemeyebiliriz. Örneğin bir cep telefonu ekranında çizik olup olmadığını anlamak için, telefon yüzeyini elimizde farklı açılar ile çevirir, farklı ışık yansımaları altında bakar ve ona göre karar veririz. Belirli bir açıdan bakıldığında yüzey temiz görünürken, farklı bir açıda çizikler belirgin hale gelebilir. Çiziklerin belirginleşmesi, tam çizik üzerine düşen ışınların gözümüze değil de başka yerlere yanıması sonucu, çiziğin koyu görülmesinden dolayıdır. Photometric Stereo, işte bu ve benzeri amaçlar için geliştirilmiş, hayli ileri bir görüntü işleme tekniğidir. Kamera sabit tutularak, ışık farklı açılardan verilir ve alınan tüm görüntülere bakılarak karar verilir. Genellikle yüzey kontrollerinde (surface inspecton) yaygın olarak kullanılır.

Çalışma Prensibi :

İnceleyeceğimiz nesneye, farklı açılardan ışık vererek, her bir ışık açısı altında görüntü alıp, alınan tüm görüntüleri değerlendirip tek bir görüntü elde etmek esasına dayanır.

Aşağıdaki resim, şampuan kutusu etiketindeki bozukluğun photometric stereo yöntemi ile bulunmasını göstermektedir.

Mavis olarak geliştirdiğimiz yapay görme uygulamaları, daha çok otomotiv ve otomotiv yan sanayi çözümleridir. Metal pul üzerinde yüzey kontrolü yapılarak, çizik, ezik, leke gibi hataların yakalanıp ayıklanması projesinde, photometric stereo kullandık.

İlk olarak o çiziği belirgin hale getirebilecek(içinin parlatılması veya gölge düşürülmesi) bir açıdan ışık vermemiz gerekiyor. Fakat bu verilen ışık, farklı yerlerdeki veya farklı yönlerdeki çizikleri belirgin hale getiremeyebilir.

45 er derece açıyla yerleştirilmiş, 4 ışık kaynağı ile 4 farklı görüntü alarak, bu görüntüleri photometric stereo işlemine tabi tutarak yüzeydeki bozuklukları yakaladık. (Photometric stereo için, kamera kalibrasyon işlemi gereklidir. Bunun için kamera kalibrasyonu makalemizi okuyabilirsiniz)

 

 

 

 

 

Bu görüntüler photometric stereo yöntemi ile birleştirilirse aşağıdaki görüntü elde edilir. Bu görüntünün işlenmesi ile hata net olarak yakalanır.

 

 

 

 

 

 

HALCON kodu :

read_image (Images, 'duz/1/'+[1:4])
for I := 1 to 4 by 1
    Message := 'Acquire image ' + I + ' of 4'
    select_obj (Images, ObjectSelected, I)
    dev_display (ObjectSelected)
    disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
    wait_seconds (0.5)
endfor
* Apply photometric stereo to determine the albedo
* and the surface gradient.
Slants := [39.4,40.5,39.5,38.4]
Tilts := [-6.0,83.7,172.9,-98.2]
ResultType := ['gradient','albedo']
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])
* Display the albedo image
dev_display (Albedo)