Kameralı Hacim Ölçümü – 3

Mavis kamera ile hacim (en-boy-yükseklik) ölçen sistemin 3. versiyonunu geliştirdi.

Herhangi bir yere dayama gerektirmeyen, görüntü alanı içinde herhangi bir yere koyulabilen, 1.5 mt yüksekliğe kadar cisimlerin hacmini ölçen sistemi test kullanımına aldı.

Ölçüm sonuçları

2 adet kamera ile ve tamamen Mavis tarafından geliştirilmiş yeni bir teknoloji ile, görüş alanının herhangi bir yerine koyulan cisimlerin hacmi, hızlı ve doğru bir şekilde ölçülmektedir.
Kantardan gelen ağırlık bilgisi de eklenerek, en-boy-yükseklik (desi) bilgisi de eklenerek barkod oluşturulmakta, veritabanına kaydedilmekte ve ilgili sistemlerle entegrasyon sağlanmaktadır.

Kargo firmaları gibi pek çok yerde kullanılması muhtemel olan sistemin çalışması istenildiği takdirde görülebilir, demo kurulum yapılabilir.

Kameralı Hacim Ölçümü – 2

Kargo firmaları v.b. yerler için, hızlı hacim ölçen (en boy yükseklik) çözümümüz 1 aylık test kullanımından sonra, evrimleşerek daha hassas ve daha tutarlı bir hale getirildi.

Sistemin Kurulumu

Sistemin Kurulumu

Sistemin Kurulumu

Sistem, belirli bir açı ile yerleştirilmiş, otofokus, renkli ve yüksek çözünürlüklü 2 kamera ile, 1.5 metreküplük bir yeşil bölge içindeki, 1.2 metreküplük bir hacmi ölçmeye yarar. (Maksimum yükseklik boy genişlik 1.2 m olacak şekilde)

Kameralardan biri, yükseklik ölçmeye, diğeri ise en ve boy bulmaya yarar.
Ölçüm işlemi 1 sn kadar sürer.
Sistemin, kendi aydınlatması olduğundan, ışık değişimi, gece gündüz, yaz-kış farkı gibi dış etkenlerden etkilenmez.
Endüstriyel koşullarda (çok düşük / yüksek sıcaklıklar v.b.) çalışabilir.
Kurulduktan sonra, bakım gerektirmez.

Kameralı Yükseklik En Boy Ölçümü
Sistemin Genel Özellikleri

  • Tüm Sonuçlar Kaydedilir (5 Yıl)
  • Alınan Resimler Saklanır (1 Yıl)
  • Tartım Bilgisi (Ağırlık) Okunabilir
  • Barkod, Fiş, Fatura Çıkartılabilir
  • Web, Intranet, Veritabanı ile diğer sistemlerle entegre olabilir

 

Hacim ölçüm sistemi, sadece koli (kutu, kübik) şekiller için değil, hemen her tür serbest geometriye sahip hacim ölçümlerinde kullanılabilir.

Program Görüntüsü

 

 

 

 

 

 

 

Sistem Tarafından Ölçülen Hacim Tipleri

Slayt51. Kutu, Koli vb. Kübik Ölçümler

En, boy ve yükseklik değerleri ölçülür. Santimetre cinsinden ölçülen bu değerlerden desi hesaplanır.

Eğer koliler fiziksel olarak ayrılabiliyorsa, her birini ayrı ayrı ölçmek daha doğru bir yaklaşım olacaktır. Fiziksel olarak birbirine bağlı ya da ayrılamayan nesneler varsa, en yüksek noktanın yüksekliği baz alınarak ölçüm yapılacaktır. Böyle bir durumda, aralardaki boşluklar, tamamlanarak hacim ölçümü yapılacaktır. (Gerçekte olandan daha büyük hacim bulunabilir)

Slayt5

 

 

 

 

 

 

 

 

 

 

2. Serbest Şekilli Hacimler

Belirli bir geometrik şekle sahip olmayan (gitar, tampon, çuval, saksı bitkisi, araba tekeri v.b.) şekiller için hesaplanan hacim.

Bu tür hacim hesaplamalarında, hem nesnenin gerçek hacmi, hem de bu nesneyi çevreleyen en küçük kutunun hacmi ayrı ayrı hesaplanır. Dilenirse, bu iki ölçüm değerinin ortalaması alınabilir.

Slayt7Slayt6

 

 

 

 

 

 

 

 

Sistemin Kullanımı

Slayt8

Ölçüm; hacmi ölçülecek nesneyi (koli, kutu vs.) tartının üzerine koyulup bir tuşa basılması ile yapılır.

Ölçüm ile tartım işlemi aynı anda olduğundan ilave vakit kaybı getirmemektedir.

Sistemin daha da geliştirilmiş son hali için şu sayfamıza da bakınız…

HALCON ile Gradient Domain

Uzunca bir süredir eni konu bahsetmek istediğim ama bir türlü elimin gitmediği, son yılların en çok araştırılan, üzerinde en çok çalışılan, bir o kadar da bilinmeyen (pek yaygınlaşamayan) görüntü işleme konularından biri olan, Gradient Domain konusuna girmek, bugüne nasip oldu. Başlayalım bakalım…

Ön Bilgi

Resim (Fotoğraf) matematiksel olarak bir çok farklı biçimde modellenebilir / gösterilebilir. Bunlardan en yaygın kullanılanı S-domain sunumu olan spatial domain ismi verilen sunumdur. Bu hepimizin bildiği, her bir pixelin intensity (ışık şiddet / gray value) değerini tuttuğu notasyondur.

Normalde sık sık kullandığımız threshold işlemleri v.b. çoğu fonksiyon, işte bu spatial domain verileri üzerinden işlem yaparlar. Burada, her bir pixel bağımsız olarak ele alınır. Örneğin, tamamen beyaz (gri değeri = 255) olan pixelleri seçmek istiyorsam, bu pixellerin sağına soluna bakmadan, 255 değere sahip olan her bir pixel seçilir.

Tam bu noktada, gradient domain farklı bir yaklaşım sunar. Her bir pixelin tam ve kesin değeriyle ilgilenmek yerine, o pixele komşu olan diğer pixeller ile arasındaki farkı da göz önüne alarak bir matematiksel model bulmaya çalışır. Şimdi her bir pixel değerinin bir öncesi dediğimiz zaman, işi bir seriye dökmeye ihtiyacımız var demektir. Zaten spatial-domain resim dediğimiz, satır ve sütunlardan oluşan bir matris ya da yatay ya da dikey diziler şeklinde düşünülebilir. Elimizdeki bir dizinin elemanlarının değerleri, belirli bir periyotla ya da belirli bir pattern ile tekrarlanıyorsa bu durumda matematiksel olarak frekas domain (frequency domain) den söz edebilirim. (F-domain) f-domain uzayına geçtiğimizde, tıpkı bir dosyanın sıkıştırılması ve geri açılması algoritmalarında olduğu gibi, pixel değerlerinin belirli bir mantığa göre (pattern) tekrarlanması ve bu tekrar mantığını kullanarak, istediğimde orijinal değerlerine ulaşabilmem garanti edilmiş olur. Bunu yapabilmenin en kolay yolu Fourier Transformu’dur. Elimdeki s-doiamn dizisini (satırlar ya da sütunlar), fourier transformuna (hızlı olsun diye fast fourier çoğu kez) tabi tutarsam, resmi bu kez f-domaine almış olurum.

Şimdi elimizde fourier transformu alınmış bir resim var. Durduk yere neden f-domain ile çalışmaya karar verdik? Çünkü artık elimizde matematiksel olarak modellenmiş bir seri var ve her tür spectral işlemleri (lowpass, highpass, bandpass gibi filtleler, konvolüsyon, laplace açılımları v.b. …) yapabileceğimiz tamamen yeni bir matematiksel uzaya geçmiş bulunuyoruz ve bu sonsuz uzayda dilediğimiz gibi at koşturmanın avantajlarından yararlanalım istiyoruz… (elimizde tek bir pixelin gri değeri vardı, nereden nereye geldik.. f-domain ile dur bakalım sonu nereye varacak 🙂 )

Gradient domain resmi iki bileşenden oluşur. Satır dizisinin türevi alınmış hali Dx, Sütun dizisinin türevi alınmış hali Dy. Dx ve Dy resimlerine bakarsanız, sanki daha çok kenar (edge) çizgileri ile ilgilenmiş gibi? Çünkü her bir pixelin ışık değerinin, komşu pixeller ile olan farkı (türevi) ile ilgileniyor. Tam kenarlarda, ışık değişimi çok daha fazla olduğu için, beklentimize uygun bir sonuç.

Tek boyutlu bir fonksiyonda (dizi) bu fonksiyonun gradient domain fonksiyonu, kısaca onun ilk türevi şeklinde düşünülebilir. (Bu yüzden genelde kenar değerleri pik yapmakta, kenar olmayan, yani ışık şiddetinin değişmediği ya da az değiştiği yerlerde türev sıfır olmaktadır) Gradient domain, eğer spatal domain resminin 1. türevi ise, bu durumda bunun integralini alırsam ne olur? Tabii ki orijinal resme yakın bir resmi elde etmiş olurum.

 

 

 

 

Peki bunca matematiği, dön dolaş başa gelmek için mi yaptık? Tabii ki hayır, o aradaki a katsayısını kaybedebilmek için yaptık.

Yani?

Düşünelim ki, bir resim aldık, doğal olarak bu resmin içinde çeşitli gürültüler (noise) var. Ben orijinal resmi bozmadan, sadece bu gürültüleri nasıl eleyebilirim? Eğer orijinal resim f(x), gürültü a ise, ve benim elimdeki resim de haliyle f(x) + a şeklinde bana gelmiş ise, işte tüm mesele bu a değerini ayıklamaktan ibarettir. Özetle Gradient domain de işte bu işe yaramaktadır. Burada iş yine kolay değildir, çünkü gürültü fonksiyonu, integre edilemeyen bir sabit şeklindedir. Bu yüzden iş biraz biz programcılara düşecektir. Uygun parametreleri vererek sonucu gözlemleyerek, ihtiyacımıza en çok uyan değeri seçeceğiz (Gürültü her resim için sabit olmayacaktır. bazen çok az, bazen çok fazla olabilir. Dolayısıyla, her resimden gürültüyü ele gibi bir fonksiyon beklememekle birlikte, bu eleme işlemi, programcının seçtiği kadar yaptırılabilir)

Gerçek bir örnekle gösterelim..

Yukarıdaki sonucu test edebileceğiniz HALCON örneğini buradan indirebilirsiniz.

Gradient Domain, filtreleme dışında pek çok alanda kullanılmaktadır. Cep telefonlarımızda bile yer alan HDR işlemi, seamless stitching dediğimiz, bir görüntüyü diğerinin üzerine akıllı olarak yerleştirme, (wikipedia sayfasındaki el üzerine yerleştirilmiş göz resmi resim hayli bilgi verici) kontrast iyileştirme, medikal görüntüleme (x-ray, MR görüntüleri) 3D, color processing, görüntü bindirme gibi alanlarda gittikçe daha sık kullanılmaktadır.

Yukarıda; Termal kamera görüntüsünün, normal kamera görüntüsü ile üst üstebindirilmesi.

Yukarıda; Image Fusion : Görüntülerin üst üste bindirilip, arka planın ve gürültülerin elenmesi.

Yukarıda; surveillance (trafik) görüntüsünden. Hareket halindeki nesnelerin olduğu bir görüntüde, arka zemini bulabilmek ve ayıklayabilmek oldukça güçtür. Gradient Domain çok iyi sonuç vermiştir.

Özet :

Görüldüğü gibi, hemen her alanda oldukça ilgiçn ve başarılı sonuçlar veren gradient domain üzerine ciddi olarak eğilmek gerekmektedir. Real time processing gerektiren işlemler (Sony TV lerdeki Bravia engine vs.) cep telefonlarındaki kamera uygulamaları (çoğu güncel telefon Sony imx240 sensörünü kullanmaktadır fakat hepsinin son kullanıcıya sunduğu görüntü kalitesi farklıdır, geri planda kullandıkları farklı akıllı algoritmalardan dolayı) fark yaratabilmek için bu ve benzeri teknolojileri kullanmak zorundalar.

Zaman buldukça, kişisel olarak geleceğinin iyi olabileceğini gördüğüm görüntü işleme trendlerine yer vermeyi düşünüyorum.

Görüşmek üzere.

Paralel Programlama

PC tabanlı görüntü işleme uygulamalarında, paralel programlama teknikleri kullanmak çok radikal hız artışları sağlayabilir. Yazılımımız, gerçekten sahip olduğumuz donanımın hakkın veriyor mu? Günden güne hızlanan bilgisayarlar, çok çekirdekli işlemciler, devasa hafızalar… Bu kaynakları gerçekten etkin olarak kullanabiliyor muyuz?

Düzgün yönetilmememiş paralel programlama (Multi threaded programming) uygulamalarında çoğu kez olan yukarıdaki gibidir 🙂 Bilmem kaç çekirdekli cep telefonlarının neden bu kadar yavaş olduğu sorusunun da cevabı? Tamam çekirdek çok da, uygulama onları nasıl kullanıyor?

Paralel programlama derken tam olarak neyi kastediyoruz?

Paralel programlama, bilgisayar işlemcisinde gerçekleşen işlemlerin, birinin diğerini beklemediği, aynı anda bir çok işlemin çalıştığı uygulamalardır. Visual Studio .NET dilinden konuşursak, çok kanallı programlar (Multiple threads), parallel tasks, background worker v.b. yapılar ile çoğu programcının bir şekilde aşina olduğu yapılardır. Bu yapılar ile uğraşanlar iyi bilir, duruma göre tam bir başağrısıdırlar. Geliştirmesi zor, debug etmesi zor, sonuçların ekranda gösterilmesi bile ayrı bir teknik gerektirir. Lock objects ler, autoreset, manual reset eventler, mutexler, semaphore lar v.b. .NET yapıları, durduk yere hiç bir programcının severek bulaşacağı yapılar değildir, kabul edelim.


Eğer öyle ise, görüntü işleme uygulamam gerçekten paralel çalışmalı mı?
Bu  sorunun cevabı, eğer zaman sorunum varsa, ya da birim sürede çok daha fazla kontrol etmem gerekiyorsa EVET, aksi halde HAYIR dır.

Gerçek hayattan örnek vermek gerekirse, Derby traş bıçakları fabrikasında bir makinada kurulu olan sistemimiz, her 600 milisaniyede bir, üretilen traş bıçağını kontrol etmektedir. Böyle bir sistemde,

  • Kameradan Görüntünün Alınması (80 ms.)
  • Alınan Görüntünün İşlenmesi (60 ms)

sürmektedir. Özetle, tetik sinyali geldikten sonra, en geç 150 ms. sonra, OK ya da NOK cevabını sisteme bildirmekteyiz. Geri kalan 450 ms. içinde de sistem diğer ürünün gelmesini beklemektedir. Dolayısıyla, bir zaman sorunu yoktur, işlemleri paralel yapmak kimseye bir şey kazandırmayacaktır. Bu durumda, eski tip, ardışıl programlama (görüntü al, işle, dijital çıkış ver, bekle, başa dön..) en doğru seçenek olacaktır.

Peki ya sürekli ve çok hızlı kontrol etmem gerekirse, mesela araçlardaki şerit takip sistemi örneği gibi. Sistem sürekli ve olabildiğince hızlı görüntü almalı, işlemeli ve hiç beklemeden yeniden görüntü almalı, yeniden işlemeli. bu alma-işleme süreci ne kadar kısa olursa, sistem o kadar sağlıklı / gerçeğe yakın çalışacaktır.

Yine gerçek bir örnek verelim;

Halı Kesme makinası olarak kurulumunu yaptığımız sistemde 13 adet kamera vardır. 50 m/dk hızıyla üretilen halıları dikey olarak tam kesim çizgisinden kesmek istiyoruz. Bunun için 13 bıçağın, kameralar yardımıyla anlık olarak sağa-sola yönlendirilmesi ve tam çizgi üzerinden kesim yapılması sağlanmalıdır.

Halı, esnek olduğundan, kesim çizgisi sağa sola kayabilmekte ve ancak kamera yardımıyla çizgiyi görüp takip etmesi sağlanabilmektedir. Sorun şu ki, 50 m/dk. hızında üretim yapılırken, 120 ms. içinde halı 10 cm kaymaktadır. Dolayısıyla, bu projede, tipik olarak 1. kameradan görüntü al, işle, 2. ye geç al işle, sonra 3. ye… şeklinde bir yaklaşım izlenmiş olsa, algoritmalar ne kadar düzgün çalışırsa çalışsın, sonuç tam bir felaket olacaktır. Tek bir kameradan görüntü alınıp yine aynı kameraya sıra gelene kadar, halı 1 m. den fazla ilerleyecektir ve böyle bir sistem elbette kabul edilemez.

HALCON 12 ile Paralel Programlama

Visual Studio kullanarak geliştireceğimiz, çok kameralı tipik bir paralel programlama algoritması genel hatları ile şu şekildedir.

3 adet genel thread vardır.

  1. Grabbing Threads : Var olan kamera sayısı kadar thread açılır. Her bir thread sonsuz bir döngüde görüntü alır. Diyelim ki 4 kamera var. 4 ü de eş zamanlı olarak görüntü alır. Biri diğerini beklemez, her biri bağımsız olarak kendi görüntüsünü alır.
  2. Processing Thread : Yine kamera sayısı kadar thread açılır. Her bir thread, sonsuz bir döngü içinde, kendi kamerasından görüntü alınmışsa, bunu işler yine başa döner (yeni görüntü alınmasını bekler) görüntüyü işlemeye başladığı anda, grabbing thread yeniden resim alma işi ile meşgul olur. Diyelim ki, resim alma (grabbing) 60 ms, işleme ise 20 ms sürsün. bu durumda, tek bir kamera 60 ms içinde sonucu verecektir (80 değil) çünkü 20 ms. işleme sürerken, grabbing thread görüntü almaya başlamıştı ve işleme bittikten 40 ms. sonra (60 değil) yeni görüntü gelecektir.
  3. User Interface Thread : Benim kullanmadığım ama genel amacı, bulunan sonuçların ekranda gösterilmesi, label buton panel v.b. form kontrollerinin çizilmesi amacıyla kullanılır. Ben, HALCON fonksiyonlarına, DisplayHandle gibi bir değişken gönderiyorum ve ekran işlemlerini de HALCON içinden yaptırıyorum. Böylece, sonuçların toparlanması ekranlarda gösterilmesi gibi işleri C# tarafında değil, HALCON tarafında hallediyorum.

Bu yapı, kendi içinde gayet hızlı çalışacak ve CPU kullanımı tüm çekirdeklerde %100 e vuracaktır. bu iyiye işarettir, tek bir cpu birimini boşa harcamaya gerek yoktur ve uygulamamız resmen donanımın hakkını veriyor demektir.

Ayrıca, bellek kullanımına dikkat edin, sonsuz döngüde çalışan thread (kanal) yapıları, nesneleri hafızadan atamıyorsa, çok çabuk hafıza dolabilir. İdealde hafızanın sabit kalması gerekmektedir.

HALCON 12 ile Paralel Programlama

Visual Studio ile, paralel programlama tekniklerini etkin bir şekilde kullanarak, çok kameralı sistemde, tüm görüntü alma ve işleme kanallarını paralel çalıştırarak, çok büyük bir hız avantajı sağladık. Şimdi HALCON ile bu yapıyı daha da geliştirmek mümkün.

Öncelikle HALCON, tecrübeli olmayan programcılar ya da .NET çok kanallı yapılarını sevmeyen tercih etmeyen kullanıcılar için bir çok yenilik barındırmaktadır. Artık tüm paralel programlama işlemlerini HALCON kendisi yerine getirebilmektedir. HALCON12, yazdığınız kod parçalarını (HDevelop procedure) tek bir tıklama ile paralel olarak çalıştırabilmektedir. (Bizim C# ile tabir yerinde ise, o kadar kastırarak yaptığımız dümenlerin hepsi boşa mı gitti şimdi 🙁 )

Ve hala daha da fazlasını sunmaktadır. O da şu :

diyelim ki, her bir kameradan alınan görüntüde, tek bir işlem değil de, birden fazla işlem yapmak durumundayım. Mesela alınan görüntüde hem barkod, hem karekod, hem de OCR yapmak durumundayım diyelim.

Barkod bulma 40 ms, OCR 90 ms, karekod okuma ise 70 ms. civarı sürsün.

HDevelop içinde bu işi yapan 3 güzel procedure yazdığımı varsayalım. HALCON 12, bu 3 procedure ü paralel olarak başlatabilmekte (par_start komutu ile) Buraya kadar olan, zaten tecrübeli C# kullanıcılarının daha önceden yaptığına denk gelen kısım. HALCON, par_join komutu ile, bu 3 procedure ü de aynı anda çalıştırmakta, en son hangisi biterse, diğerleri onu beklemekte, ve tek bir yapı çalıştırmışım gibi sonlanmakta. Dolayısıyla, bu yapıları paralel çalıştır diyorum, sanki hepsi tam da aynı anda çalışıp aynı anda bitmiş gibi, bir alt satırda da hepsinin sonuçlarını toplayabiliyorum. Bizim örneğimizde, 90 ms. sonunda barkod, karekod ve OCR işlemim bitmiş, elimde hazır sonuçlar olmuş oluyor.

Bu güçlü yapıyı, C# daki özgün multi thread yapım ile birleştirdim. Ortaya, C# tarafında, tüm kameralardan görüntü alma ve işleme işlemlerinin paralel koşturulduğu, HALCON tarafında da bir çok procedure (alt programı) aynı anda çalıştırıldığı, hibrit bir yapı çıktı. Sistemi 13 kamera için çalıştırdığımda, cpu fanı hemen devreye girmekte CPU maksimum performansa zorlanmakta. (Bu aşamada i7 gibi işlemcilerin gerçek farkını ve hızını hissedebilmek de bir programcı olarak ayrı bir mutluluk kaynağı oluyor.)

Peki, neden aynı anda bir çok procedure start edilir. Ya da ne gibi uygulamalar buna ihtiyaç duyar.

Açıkçası bu çok sık karşılaşılan bir yapı veya ihtiyaç değildir.

Bizim halı kesme makinasında, siztem kesim çizgisini aramaktadır. Yazdığım algoritmalarda bazen var_threshold ile sonuca gitmiş, bazen de binary_threshold işe yaramıştı. Bazı durumlarda median_rect filtresi güzel sonuçlar vermiş, bazen ise label_to_region işe yaramıştı. Bazen GMM classification imdada yetişmiş, bazen resmi decompose edip hsv kanallarına bakmam gerekmişti?

İyi ama, bunların hangisini kullanmam en doğrusuydu? Apaçık ki, hiç biri tek başına yeterli değil. Hepsini tek tek denesem, bu sefer çok uzun sürebilir. İşte tam da bu anda, yazdığım tüm alt programları (ki aslında hepsinin derdi aynı, hepsi de çizgi arıyor) aynı anda start ediyorum. Resmi grab etmem (kameradan almam) ortalama 60 ms. kadar sürüyor (bendeki pixel clock, exposure değerleri ile inebildiğim minimum değer) ve bir sonraki resim gelene kadar, tüm yapıları HALCON aynı anda start ediyor. bunlardan bir veya daha fazlası sonucu zaten buluyor ve bulduğum sonucu işliyorum.

Sonuç?

Eğer bu kadar fazla multitasking sonucu yazdığınız kodlar halıya çıkmadıysa, iyi yoldasınız demektir.

Yazının Özeti :

HALCON 12 güçlü bir multithreading (paralel programlama) desteği sunmaktadır. par_start, par_join, mutex, message queue yapılarını inceleyin, örneklere bakın, dokümanları okuyun, çok yardımcı olacaktır. Buna rağmen danışmanız gereken bir yer olursa, buradan ya da info@mavis.com.tr ile bana istediğiniz zaman ulaşabilirsiniz.

kolay Gelsin 😉

Kameralı Otomatik Dikey Halı Kesme Makinası

Mavis, dikey halı kesme makinası (5 mt, 13 kafa, 60 mt/dk.) kullanıma alındı.

 

 

 

 

 

 

 

Sistemin çalışan bir videosu şu adreste izlenebilir.

https://www.youtube.com/watch?v=hHQT50P9wk8

Daha fazla bilgi için bizimle iletişime geçebilirsiniz.

3D Görüntü İşleme Teknikleri – 2

Stereovision Prensibi

Bir önceki makalede, 3D görüntü işleme teknolojilerine ana başlık olarak değinmiştik. Bu makalede biraz daha teknik ayrıntıya girebiliriz.

Önce işin biraz matematiğine değinelim. Stereovision nasıl çalışır?

Nesne farklı açılardan gözlemlenir.

Eğer α ve β açıları ile b mesafesi biliniyorsa, basit bir geometrik hesaplama ile P nin pozisyonunu bulabiliriz.

Buna, triangulation (üçgenleme) prensibi denir.

P noktası her iki kamerada bir miktar kaymış olarak görünür (sırasıyla tek gözümüzü kapattığınızda gördüğümüz nesnelerin bir miktar kayması gibi)

Sonuç olarak, her iki kamera arasındaki mesafe, açı, focal mesafe biliniyorsa, kaymanın kaç pixel olduğu da hesaplanabilir. Buna Disparity denir. Uzaktaki nesneler için kayma az olacaktır, yakındaki nesneler için ise kayma daha fazla olacaktır. Bu durumda, stereovision da temel prensip, her bir pixel için Disparity değerini hesaplayabilmektir.

Nemrutun her iki (sol ve sağ kamera) tarafından alınmış görüntüsü soldaki gibidir. Şapkasının hemen üst noktası, sağ kameraya daha yakın olduğundan 156. pixelde iken, sol kamerada 160. pixeldedir. Kameralar kalibre edilmiş olduğundan aynı Y değerlerini vermektedirler. Yine kalibrasyon sonucu, bu 4 pixel kaymanın, ne kadar mesafeye dek düştüğü bulunabilir. Burada, sistemin hızlı çalışması için, sol resimdeki P(160,120) noktasının, sağ resimde nerelerde aranacağını sistem kestirebilmek zorundadır. Kalibrasyon sonucu, sol kameradaki her bir satır (row) sağ kamerada da aynı satıra denk düşecek şekilde resim dönüştürülür (rectification). Son olarak, stereo kamera, hangi mesafeden çalışıyor ise, (10 cm, 30 cm, 1 mt., 2 mt. vs.) yaklaşık olarak, kaç pixel kayma olabileceği bellidir. Böylelikle, sol kameradaki her bir tekil pixel, sağ kamerada tek bir satır üzerinde, dar bir alanda aranır ve hızlıca bulunur.

Şimdi işin matematiğine daha ayrıntılı girelim.

Stereo Teori – Perspective Projection

3 boyutlu olarak algılanmak istenen nesne üzerindeki her bir nokta (p), biri sol kamerada (p’), diğeri sağ kamerada (p”) olmak üzere bir geometrik yüzey oluşturur. Buna epilolar yüzey denir.

Her bir kameranın, x-y eksenlerinden oluşan yüzey ile epipolar yüzeyin kesişim noktalarının kenara olan uzaklıkları, l1 ve l2 olsun. Sistem, sol kameradaki her bir tekil p’ noktasının sağ kamerada nerede bulunduğunu (p” noktaları) bulmak zorundadır. Normalde bu, uzun bir işlemdir. Örneğin 1.3M Pixellik kameralar kullanılıyorsa, soldaki her 1.3 milyon pixel, sağ tarafta tek tek aranacak ve Disparity değerleri hesaplanacak. Bu işlemi hızlandırmak için, Camera Rectification dediğimiz tekniği kullanırız.

Stereo Rectification

Rektifikasyondaki amaç, p noktasının her iki kameradaki izdüşümleri olan p’ ve p” noktalarını, yatay eksende aynı paralel doğru üzerine düşürmektir. Bunun için, her iki kamera görüntüsü de, bir miktar döndürülür ve pixeller transform edilir. Sonuçta, p’ ve p” noktaları aynı y (row – satır) değerine denk getirilir. Rectified (düzeltilmiş) görüntüler, şimdi aynı eksendedir (z=1) Epipolar doğrular, (l1 ve l2) aynı paralel düzlemdedir. Artık, sol kameradaki p'(x,y) noktasındaki bir pixel, sağ kamerada herhangi bir yerde değil, aynı y değerine sahip olan satırda aranacaktır. Üstelik, bütün bir satır boyunca aramaya gerek yoktur. Nesnenin kameraya olan uzaklığı aşağı yukarı belli ise, satır boyunca ne kadar ileride ya da geride olabileceği de belli demektir. Bu yaklaşım, hem çok daha hızlı olacak, hem de çok daha etkin PC ve CPU kullanımı anlamına da gelecektir.

Pasif Stereo Vision

Pasif Stereovision tekniğinde, 2 adet kamera vardır fakat projektör yoktur. Nesnelerin üzerindeki şekillerden ve desenlerden faydalanılarak, her bir pixelin ne kadar kaydığı hesaplanmaya çalışılır.

Üzerinde resim olan kupanın sol ve sağ kameralar ile alınmış görüntüsü yukarıdaki gibi olsun. Bu durumda, mesela resimdeki hayvanın gözünün sol ve sağ kamerada kaç pixel kaydığı, kupanın kulpunun ne kadar kaydığı, ayakkabısının alt köşesinin ne kadar kaydığı gibi bilgilere ulaşabilirim. (Disparity değerleri bulunabilir) Özetle, desen ya da resim (texture) içeren yerler için disparity değerlerine erişilebilir. Fakat, hiç resim ya da desen içermeyen, mesela masanın üzeri, arka plandaki duvar gibi yerlerde, disparty değerlerini hesaplamak mümkün değildir. Bu durumda, derinlik bilgisine de erişilemeyecektir.

 

 

 

 

Aktif Stereo Vision

Pasif stereo vision, nesne üzerinde yeterli texture (desen, resim) yoksa derinlik bilgisine ulaşamıyordu. Bu durumda ana fikir; bir projektör kullanarak nesnenin üzerine bilinen patterne sahip infrared görüntü göndermek ve stereovision kameraları ile, bu infrared desenleri yakalamaktır. Yukarıdaki şekilde de görüldüğü gibi, kupanın silindir geometrisinden dolayı, iyi görülemeyen yerleri dışında (gölgeleme/shadowing) hemen her noktada derinlik bilgisine ulaşılabilmektedir. (Silindirik yüzeylerin aşağı yukarı 2/3 kadarı stereovision ile yakalanabilmektedir. Tamamını görmek için, 3 veya daha fazla stereovision kameraya ihtiyaç olabilir)

Kelepçe Varlık, Yazı Baskı Kontrolü, Pozisyon, Mesafe Ölçümleri

Mavis, çok sayıda kurulum yaptığı otomotiv sektöründeki bir firma için geçtiğimiz aylarda yenilerini de ekleyerek 17. ve 18. kameralı kalite kontrol ve ölçüm sistemini uygulamaya almıştır.

Kelepçe ve baskı kontrolü

Ürün üzerinde hem (başka bir firma tarafında yapılan) sızdırmazlık testi, hem de (bizim yaptığımız kısım) kameralı kontrol sistemi çalışmaktadır. Programın birkaç farklı şekilde çalışabilme olanağı mevcut; sızdırmazlık testi bitince PLC’den aldığı sinyal ile otomatik çalışabilir, sızdırmazlık testi devam ederken kullanıcının bir butona basması ile çalıştırılabilir. Son durumda da eğer parça OK ise ve sızdırmazlık testinden de OK sinyali alınmış ise, parçaya özgü bir barkod yazdırılır.

Parça üzerinde yaptığımız kontroller:

  • Demir üzerinde kabartılmış çizginin bulunması
  • Kauçuk üzerindeki çizginin bulunması
  • Kelepçenin takılı ve doğru yönde olması
  • Bu üçünün birbirleri ile pozisyonunun doğru olması

Kontrollerde ışık önemli bir faktör oynuyordu, çünkü ışığın metalik kelepçe üzerinden yansıması ve demir üzerindeki kabarıklıktan yansıması farklılık gösterebildiği için ışığın tipi ve açısı önemli bir unsur oldu. Daha önceki deneyimlerimizi kullanarak, ışığın tipi, açısı, kamera pozisyonları gibi konuları kolaylıkla bularak sistemin kurulumunu gerçekleştirdik.

Bütün kontrollerin OK durumu aşağıdaki gibidir.

Pozisyonların belirtilen toleranstan fazla olması ya da kelepçenin ters olması durumunda RET sonucu verilir.

Daha sonra masa üzerinde yapılan revizeler ile, baskı yapılan yazıların kontrolü de eklendi.

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ş – 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…

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)