ARM Cortex A9 üzerinde çalışan HALCON

Gömülü HALCON dağıtımlarının ARM Cortex A9 işlemcileri üzerinde çalışabildiğinin açıklanması, yakın gelecekte çok tanıdık mobil cihazlarda HALCON görebileceğimiz anlamına geliyor.

ARM Cortex A9 kullanan mobil cihazlar listesi çok uzun olmakla birlikte (en yaygın kullanımı neredeyse her modemde yer alan Conexant işlemcileri) günlük hayatta bilinen bazı markaları listelemek istiyorum.

Apple iPhone 3GS, Palm Pre, Samsung i8910, Sony Ericsson Satio, Touch Book, Nokia N900 …

mobil cihazlarda gittikçe artan kamera ve ekran çözünürlüğü, geri planda çok hızlı ve hassas sonuçlar verebilecek bir engine kullanımını zorunlu hale getirmektedir. Bir önceki makalede de bahsettiğim gibi, teknoloji devi firmalar, tam da bu alana inanılmaz kaynaklar ayırmaktadır. Burada kişisel görüşüme göre; ARM gibi mobil işlemci piyasasının %75 ine hakim bir işlemciyi hedefleyen HALCON, bu sektöre taze bir kan getirecek ya da bazı ciddi kararların değişmesine sebep olabilecek gibi görünüyor.

HALCON Kinect Desteği

HALCON 10, test aşamasında olsa da MS Kinect ile 3D alanında başarılı çalışmalar yapmaktadır. Bilindiği gibi Kinect, Microsoft XBox oyun konsolları için geliştirilmiş, oyuncunun üzerinde herhangi bir kontrolör, kumanda ya da sensör olmaksızın tüm hareketlerini algılayabilen 3D kamera sistemidir.

HALCON un Kinect desteği sunması, oldukça ucuz ve yaygınlaşacağı neredeyse kesin olan 3D kamera seçeneği ile çalışabilmesi dışında daha derin anlamlar da içeriyor olmalı. Kişisel görüşüm, inanılmaz bir hızla yükselen oyun endüstrisinin MVTec yetkililerinin zaten uzunca bir süredir dikkatini çektiği yönünde. Nintendo Wii konsollarıyla başlayan etkileşimli oyun teknolojilerinin, Kinect ve benzeri ürünler ile iyice yaygınlaşması, bu cihaz üreticileri için HALCON kullanılabilmesi anlamına geleceği gibi, HALCON kullanıcılarının bu tür ucuz donanımlar ile profesyonel uygulamalar geliştirebileceği anlamına da gelir.

Üstelik, Microsoft un kendisi bile, Kinect görüntülerini algılayan akıllı yazılımlar için inanılmaz kaynaklar tüketirken, MVTec elindeki mevcut HALCON 3D görüntü işleme kütüphanesini Kinect uyumlu hale getirmek için hiç te sıradışı bir çabaya ihtiyaç duymayacak. Mevcut yapı zaten yeni framegrabber ve kamera arabirimleri için genişletilebilir durumda.

Başlangıçta Linux ve Windows işletim sistemlerini destekleyerek çoklu platformu hedefleyen HALCON, son zamanlarda ARM işlemcilerine verdiği güçlü destek ile ön plana çıkmaktadır. Nokia (belirli seri) desteğinden sonra bu atılımlar, yakın gelecekte HALCON u mobil cihazlar, oyun sektörü, ve günlük hayatın içinde çok daha fazla görebileceğimiz anlamına geliyor.

NASA gibi bir kurumun kendi görüntü işleme yazılımını bir kenara itip HALCON kullanmaya karar vermesi örneğini diğer teknoloji devi firmalar da izleyecektir. (Apple ın OpenGL için açık iş pozisyonlarını google dan aratın, gözlerinize inanamayacaksınız.)

Akıllı Şekil Tamamlama

Görüntü işleme uygulamaları, olabildiğince net ve düzgün görüntülerle çalışmayı sever. Bizim gibi, görüntü işleme ile endüstriyel ortamlarda çalışanlar, kaliteli ve bir görüntüyü garanti etmek için sistemin kurulumuna aşırı önem gösterirler. Gece/gündüz, yaz-kış, 24 saat çalışacak uygulamalar da alınan her görüntünün yeterli kalitede olması için aydınlatma ve çevre şartlarından izolasyon işlemleri özenle yerine getirilir. Her şeye rağmen, alınan tüm görüntüler beklenen kaliteyi sağlamayabilir.

İşte bu noktada, iyi bir görüntü işleme yazılımından beklentiler yükselir. Yazılım, değişen fotoğraf kalitesinde bile en iyi sonucu verebilmeli. “Akıllı şekil tamamlama”, kenar çizgileri eksik olarak alınmış fotoğrafların, kenar çizgilerini olması gerektiği gibi tamamlayan bir algoritmadır. Bol miktarda uygulama alanı mevcuttur. Örneğin bir önceki makalede, Defne Yapraklarının kalite kontrolünü incelemiştik. Bir yaprağın kenar çizgilerinin düzgün olup olmadığını anlamak için bu algoritma uygulanabilir.

Yaprak resmine benzer bu şekli Paint ile elle çizdim. Sonra kenarlarından bazı yerleri rastgele silerek, bozulma oluşturdum. Amacım bir algoritma ile bu boş yerleri tamamlayabilmek.

HALCON kodu aşağıdaki gibidir.

read_image (Image, 'C:/Users/Mustafa/Desktop/Yaprak.jpg')
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
regress_contours_xld(Edges, RegressContours, 'no', 1)
union_collinear_contours_xld (RegressContours, UnionContours, 30, 10, 10, 0.2, 'attr_keep')

 

Bu 3 satırlık basit HALCON kodu çalıştırıldığında,  elde edilecek sonuç :

Soldaki gibidir. Bu çalışma da, contour processing yapılarak eksikliğin tamamlanması gösterilmiştir. close_edges, region_growing, sobel_amp gibi komutlar ve daha ciddi yapılanmalarla, oldukça karmaşık eksiklikler bile düzgün olarak tamamlanabilmektedir.

 

 

İki Göz Arası Mesafeyi (Pupila mesafesi) ölçen HALCON çalışması

Yalnızca görüntü işleme çalışmalarına örnek olması açısından, 2 göz arası mesafeyi ölçen (puppila mesafesi) basit bir HALCON kodu aşağıda verilmiştir.

Mesafe pixel cinsinden ölçülmektedir. Görüntü alan cihaz (kamera, fotoğraf makinesi vb.) sabit ise, makinanın karşısındaki insanın bulunduğu yer de sabit ise, bu durumda basit bir dönüşüm ile, pixel den milimetreye geçiş yapılabilir. (Uygulama açısından gözlerin gelmesi gereken yere, hassas bir cetvel ya da mesafesi bilinen bir işaret koyarak kaç pixele denk düştüğü bulunabilir)

Şimdi HALCON koduna geçelim :

dev_set_draw('margin')
*Ekran fontunu set edelim
set_display_font (3600, 12, 'mono', 'true', 'false')
*Resmi dosyadan yükleyelim (Normalde kameradan direk alınır)
read_image (Image, 'C:/Users/Mustafa/Desktop/m1.jpg')
* Resmin ilgilendiğimiz bölgesini (gözlerin bulunduğu yer) belirtelim
gen_rectangle1 (ROI_0, 154.969, 72, 206.531, 255.75)
reduce_domain (Image, ROI_0, ImageReduced)
*koyu renkleri seçelim (göz bebekleri, kirpikler, saçlar vb.
threshold (ImageReduced, Regions, 0, 57)
closing_circle(Regions, RegionClosing, 3.5)
*içinde daire içeren şekilleri seçelim
opening_circle(RegionClosing, RegionOpening, 6)
connection(RegionOpening, ConnectedRegions)
*Belirli bir alandan büyük nesneleri seçelim
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 500)
count_obj(SelectedRegions, Number)
if (Number = 2)
    *2 adet göz seçilmiş ise
    select_obj(SelectedRegions, Goz1, 1)
    select_obj(SelectedRegions, Goz2, 2)
    * her bir gözün tam merkezinin koordinatlarını bulalım
    area_center(Goz1, Area, Row1, Column1)
    area_center(Goz2, Area, Row2, Column2)
    *Artık sonuçları ekranda gösterelim
    dev_display(Image)
    dev_set_color('blue')
    dev_display(SelectedRegions)
    dev_set_color('green')
    disp_cross(3600, Row1, Column1, 12, 0)
    disp_cross(3600, Row2, Column2, 12, 0)
    dev_set_color('red')
    disp_arrow(3600, Row1 + 30, Column1, Row1 + 30, Column2, 1)
    disp_arrow(3600, Row1 + 30, Column2, Row1 + 30, Column1, 1)
    Dist := Column1-Column2
    disp_message (3600, Dist + ' px.', 'image', Row2+40, Column2 + 20, 'black', 'false')
endif

bu projede kullandığım insan yüzü resimlerini, http://www.uni-regensburg.de/Fakultaeten/phil_Fak_II/Psychologie/Psy_II/beautycheck/english/prototypen/prototypen.htm adresinden aldım.

orijinal resimlere oradan ulaşılabilir.

bu kodu çalıştırabilmek için, HALCON yüklü olmalıdır. En gelişmiş görüntü işleme kütüphanesi olan HALCON hakkında bilgi almak ve  ücretsiz tam versiyonu (sınırlı süreli) edinmek için bizimle irtibata geçebilirsiniz.

Tek bir Kod ile hem Siyah, hem de beyaz vidaların bulunması

HALCON komutlarından gray_range_rect ile, aynı kod kümesi işletilerek hem siyah, hem de beyaz yüzey üzerinde yer alan vidaların bulunması sağlanabilir.

Aşağıda yalın hali ile verilmiş HALCON kodu, yine aşağıda verilmiş her iki resim için de çalışmaktadır. (Resimler gerçek projeden alınmıştır. Projede Çamaşır makinası arka yüzeyindeki vidaların kontrol edilmesi istenmektedir. Makinalar Siyah, Beyaz, Gri vb. metalik ve mat renklerde olabilmektedir)

Projede kullanılan resimler (aşağıdaki resim galerisinden siyah ve beyaz makina resimlerini indirebilirsiniz)

HALCON kodu :

Burada işin büyük kısmı, gray_range_rect komutu tarafından halledilmektedir. Kodun tamamı :

dev_set_draw('margin')
*Beyaz resmi yükleyelim
read_image (Image, '024548.jpg')
gen_circle (ROI_0, 183.649, 233.052, 52.4687)
reduce_domain (Image, ROI_0, ImageReduced)
gray_range_rect (ImageReduced, ImageResult, 11, 11)
bin_threshold(ImageResult, RegionKara)
difference(ImageResult, RegionKara, RegionAk)
shape_trans(RegionAk, RegionTrans, 'convex')
dev_display(Image)
dev_display(RegionTrans)

Programın HDevelop ortamındaki görüntüsü

Kod, vidayı belirleyip, etrafını yeşil daire ile çerçevelemiştir.

Aynı kod, siyah resim için uygulandığında, yine doğru çalıştığı görülecektir.

Sonuç olarak, farklı renk skalaları için, farklı farklı threshold değerleri ve farklı kod öbekleri ile çalışmak yerine hepsi için çalışabilen bu kod, basitliğiyle avantaj sunmaktadır.

HALCON Temelleri

HALCON üzerine referans site çok fazla olmamasından dolayı (benim bildiğim hiç yok) bu blog sitesinde HALCON temel fonksiyonları ve gittikçe ilerleyen seviyelerde örnekler vermeyi uygun gördüm.

Aşağıdaki örnek proje, resimdeki belirlenen bir nesneye, en yakın diğer nesneyi bulma örneği. Bu örnek dikkatle incelenirse, kendi içinde dikkat edilmesi gereken bir “TRICK” içeriyor. Bunu da hemen takip eden makalede açıklamayı düşünüyorum.

Yukarıdaki resimde (sağ tuşa tıklayarak orijinal halini görebilir / kaydedebilirsiniz) somunu seçip, somuna en yakın civatayı bulup, aralarındaki mesafeyi pixel cinsinden yazan bir HALCON kodu geliştirelim.

Sonuçta ekran görüntüsü soldakine benzer bir şey olacak. Sistem önce somunu belirleyecek, daha sonra somuna en yakın civatayı, ve aralarındaki mesafeyi bulacak.

Bunun için öncelikle somunun belirlenmesi, daha sonra distance_rr_min komutu ile iki region arasındaki minimum mesafenin bulunması işlemi söz konusu olacaktır.

HALCON koduna dönersek

set_display_font (3600, 12, 'mono', 'true', 'false')
read_image (Image, 'C:/Users/mvs/Desktop/SC.bmp')
bin_threshold (Image, Region)
connection (Region, ConnectedRegions)
*Çok küçük parçalar, noktasal kirlilikler varsa eleyelim
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
count_obj(SelectedRegions, Number)
if (Number > 0)
    *nesnelerin içinde var olan boşlukları dolduralım
    fill_up_shape(SelectedRegions, RegionFillUp, 'area', 1, 100)
    *içinde 1 adet delik olan nesneyi bul
    select_shape (RegionFillUp, Somun, 'holes_num', 'and', 1, 1)
    count_obj(Somun, Number)
    if (Number = 1)
        difference(RegionFillUp, Somun, RegionDifference)
        union1(RegionDifference, RegionUnion)
        distance_rr_min(Somun, RegionUnion, MinDistance, Row1, Column1, Row2, Column2)
        dev_set_color('blue')
        disp_arrow(3600, Row1, Column1, Row2, Column2, 2)
        disp_message (3600, MinDistance, 'image', Row2 - 20, Column2 + 20, 'green', 'false')
    endif
endif

şeklinde bir kod işimizi fazlasıyla görür.

Burada fill_up_shape komutunun etkisi aşağğıdaki resimde görülebilir:

fill_up_shape yerine fill_up kullanılsaydı, somun simit şeklinde olmayıp içi dolu daire şekline gelecekti.

Örnekte, somunu seçmek için, içindeki boşlık sayısı 1 olan nesneleri arattım. Duruma göre bir çok farklı alternatif denenebilirdi. dairesellik, (circularity), alan (area) vb. gibi.

Bu örnekte hala eksik olan ve dikkatli olunmaması durumunda ciddi hatalara neden olabilecek bir kod var. Bir sonraki makalede buna değineceğim.

Pharmacode okuma

Genelde medikal sektörde yaygın olan Pharmacode tipindeki barkodları okumak, sanıldığı kadar kolay olmayabilir. Aşağıdaki örnek, zor resimlerde (perspektif bozulmuş, net olmayan vb etkiler) pharmacode okumayı olanaklı hale getiren HALCON 10 kodudur.

set_display_font (3600, 16, 'mono', 'true', 'false')
*Pharma code yükleyelim
read_image (Image, 'PharmaCode3486.jpg')
*manual olarak barkod çizgilerini belirleyelim
bin_threshold (Image, Region)
connection(Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','height'], 'and', [1000,180], [15000,300])
count_obj(SelectedRegions, Number)
if (Number > 4)
    union1(SelectedRegions, RegionUnion)
    *barkodu içeren en küçük rectangle2 yi bul
    smallest_rectangle2(RegionUnion, Row, Column, Phi, Length1, Length2)
    gen_rectangle2(Rectangle, Row, Column, Phi, Length1, Length2)
    reduce_domain(Image, Rectangle, ImageReduced)
    *barkodu 0-255 arası scala ya yay
    scale_image_max(ImageReduced, ImageScaleMax)
    *şimdi barkod okuma işlemlerine geç
    create_bar_code_model ([], [], BarCodeHandle)
    decode_bar_code_rectangle2 (ImageScaleMax, BarCodeHandle, 'PharmaCode', Row, Column, Phi, Length1, Length2, DecodedDataStrings)
    get_bar_code_object (SymbolRegions, BarCodeHandle, 'all', 'symbol_regions')
    clear_bar_code_model (BarCodeHandle)
    disp_message (3600, DecodedDataStrings, 'image', 10, 10, 'green', 'true')
endif

Projede kullanılan barkod orijinal resmi

HALCON 10 Resmi Olarak Yayımlandı

Mavis olarak distribütörü ve yetkili eğitim merkezi olduğumuz, HALCON görüntü işleme (image processing) kütüphanesinin 10. versiyonu yayında.

HALCON 10 yeni özellikleri hakkında kısa bilgi almak için, http://www.mavis.com.tr/v2/documents/halcon10-new-features.pdf adresindeki PDF dosyayı gözden geçirebilirsiniz.

HALCON 10 ücretsiz ürün DVD si, lisans anahtarı, kurulum ve kullanım hakkında bilgi almak için bizimle iletişime geçebilirsiniz.


Mavis MVTec Distribütör / Eğitim Günlerinde

Mavis, “HALCON 10 Distributor Training” etkinliğine katıldı. Etkinlik boyunca HALCON 10 ve yeni özellikleri üzerine derinlemesine eğitim sınıfları oluşturuldu ve yeni teknolojiler tanıtıldı.

HALCON Türkiye distribütörü olan Mavis, HALCON için aşağıdaki hizmetleri sunmaktadır.

  • Ürünün Yerelleştirilmesi (Ürünün Türkçeye tercümesi, Türkçe arayüzlerin hazırlanması, Türkçe bilim diline uygun terminolojinin kullanılması)
  • Ürünün Test Edilmesi (Mavis, HALCON yeni versiyonu çıkmadan daha beta aşamasında test sürecine dahil olur, ürün çıktıktan sonra da iyileştirme katkılarında bulunur)
  • Ürünü kullanarak uygulama geliştirme (Mavis sayısız HALCON kullanan uygulamaya sahiptir. )
  • Farklı platform ve dillerde destek (Visual Studio, Delphi, Linux gibi ortamlarda HALCON kullanan çözümler geliştirilmekte ve destek verilmektedir)
  • Eğitim (Mavis yetkili HALCON eğitim noktasıdır)

En gelişmiş görüntü işleme kütüphanesi olan HALCON ücretsiz DVD si ve lisans dosyası almak için, Mavis ile irtibata geçebilirsiniz.

Görüntü İşlemede Doku Analizi

Hortum üzerine sarılı kumaşın varlığının tesbiti

Görüntü işlemede son derece karmaşık ve hayli ileri derece algoritmalar gerektiren çoğu kontrol ve metodoloji, HALCON kullanarak basitçe çözülebilir. Bugün Kros Otomotivde, siyah EPDM boru üzerinde yine siyah renkli ipliklerle örülmek suretiyle oluşturulmuş dokunun var olup olmadığının kontrolünün yapılması gerekiyordu.

Görüntü işleme terminolojisinde, pattern matching, texture analysis, surface analysis vb. isimler altında ciddi çalışmalar olarak kendini gösteren bu konuya HALCON ile pratik bir yaklaşımda bulunalım.

Üzerinde çalıştığımız projeye ait orijinal görüntü solda yer almaktadır. Görüntüde, yeşil dörtgen ile belirtilmiş alanda kumaş örgünün varlığı, sarı dörtgen ile belirtilmiş alanda ise yokluğu araştırılacaktır.

Kumaşın varlığını test eden HALCON programı :

1. Resim Yüklenir, İlgilendiğimiz alan (ROI) oluşturulur ve resim bu ROI ye indirgenir

read_image (Image, 'D3.bmp')
*draw_rectangle2 (3600, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, 687, 406, -1.4, 128, 24)
reduce_domain (Image, Rectangle, ImageReduced)

indirgenmiş resimde (ImageReduced) histogram değerlerine baktığımızda soldaki gibi dağılmış olduğunu görürüz. İdeal olmayan bu dağılım, üzerinde çalıştığımız resmin fazla aydınlatılmış olmasından kaynaklanmaktadır. Fazla aydınlatma, kumaş dokusunu görebilmek açısından önemli. Aksi halde kumaş olan yerler siyaha yakın görüneceğinden, ayırdetmek daha da zorlaşacaktı.

Bu aşamada ilk yapılması gereken, belirli bir aralığa yığılmış olan histogramı 0-255 arası tüm aralığa yaymak. Bunun için HALCON’un scale_image_max fonksiyonunu kullanacağız.

2. İndirgenmiş Bölgenin belirginleştirilmesi

scale_image_max fonksiyonu uygulanmış bölge, solda görüldüğü gibi oldukça belirginleşti. Histogram 0-255 arasına düzgün olarak dağıldı. Aradaki kuantalanmış boşlukları gidermek ve yumuşak bir geçiş sağlamak için mean_image filtresi uygulanabilir. Bunu uygulamadan hemen önce emphasize komutu ile birlikte, resim iyice belirginleştirilir. Artık bin_threshold ile seçim kolaylıkla yapılabilir.

3. Seçim ve Karar

solda, bin_threshold sonrası resmin son hali görülüyor. Artık kumaşı oluşturan doku iyice ortaya çıktı. Bundan sonrası ortaya çıkan bu yapıyı değerlendirmeye kalıyor. Ben bu örnekte basit olması açısından closing_circle ile boşlukları doldurmayı denedim ve gayet sağlıklı sonuçlar aldım. (Bu noktadan sonra sayısız alternatif olabilir)

Tüm HALCON kodunu listeliyorum

read_image (Image, 'D3.bmp')
*draw_rectangle2 (3600, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, 687, 606, -1.4, 128, 24)
reduce_domain (Image, Rectangle, ImageReduced)
scale_image_max(ImageReduced, ImageScaleMax)
emphasize(ImageScaleMax, ImageEmphasize, 40, 40, 20)
mean_image(ImageEmphasize, ImageMean, 5, 5)
bin_threshold(ImageEmphasize, Region)
closing_circle(Region, RegionClosing, 5)
connection(RegionClosing, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4000, 25000)
count_obj(SelectedRegions, Number)
if (Number = 1)
    write_string(3600, 'Örgü Belirlendi.')
else
    write_string(3600, 'Örgü Belirlenemedi!')
endif

3. satırda yer alan gen_rectangle2 fonksiyonunu

gen_rectangle2 (Rectangle, 687, 606, -1.4, 128, 24)

şeklinde değiştirirseniz, örgü olmayan bölümde örgünün yokluğunu düzgün olarak test edebildiğini göreceksiniz.

Programı çalıştırmak isteyenler için, örnek olarak kullandığım D3 isimli dosyayı ekliyorum. Aşağıdaki resimler arasından D3 isimli dosyayı seçerek kendi makinanıza kaydedebilirsiniz.

Görüldüğü gibi, sadece 17 satırlık basit bir HALCON kodu ile, son derece karmaşık sayılabilecek metodolojilere pratik bir yaklaşım getirmiş olduk.