HALCON 13 Eğitimi

Son zamanlara kameralı görüntü işleme kontrollerini kendi bünyesinde yapmak isteyen birçok firmada HALCON kullanımı arttı ve bizden eğitim almak isteyenler çoğaldı. Son zamanlarda bir çok yere eğitim verdik ve sonuncusu da geçtiğimiz hafta oldu.

Üretimini ülkemizde yaparak Almanya’ya merkezine ihraç eden, binlerce çalışanıyla İzmir’de bulunan Hugo Boss firmasına HALCON 13 eğitimi verildi.

Firmalarında kalite anlamında iyileştirmeler yapmak ve daha fazla bilgisayarlı ve kameralı kontroller yapmayı istemekteler. Bu geliştirmeleri kendi bünyesindeki ekibiyle ve HALCON’u kullanarak yapmaya karar verdiler.

Temel seviye ve İleri seviye olarak ikiye ayrılan eğitimi, ikisi bir arada ve 3 günde almak istediler. Biz de sıkıştırılmış olarak hızlıca ve neredeyse bütün konulara değinecek şekilde elimizden geldiğince anlatmaya çalıştık.

Anlatılan konular ise şöyle;

1. gün:

HDevelop kullanımı
Her türlü kamera veya kaydedilmiş görüntüler olan bir klasör üzerinden HALCON üzerinden görüntü alma
HALCON temel (foundation) komutları
Image’ler üzerinde işlemler; bir çok thresholding yöntemleri, görüntüyü bulanıklaştırma (smooth) ve keskinleştirme yöntemleri, kenar bulma algoritmaları (edge detection), çeşitli filtreleri uygulama, renkli görüntüler üzerinde yapılan işlemler
Region’lar üzerinde işlemler; selection, segmentation, ROI işlemleri, filtre uygulama ve dönüştürme işlemleri

2. gün:

Parallel processing
Procedure kullanma
Barkod – Karekod okuma
OCR (Karakter tanıma, yazı okuma)
Measurement 1D-2D (Ölçüm işlemleri)

3. gün:

Eşleştirme yöntemleri (Shape Matching)
Visual Studio ve C# ile HALCON kullanımının 2 yolu ve baştan sona uygulama yapmak
Ve uygulayacakları projeler üzerinde konuştuk.

Bazı konular kalmış olsa da en önemlilerini görmüş olduk ve başarıyla uygulayabileceklerine eminiz.

20170328_164618_HDR - Kopya

HALCON 13 ve yeni özellikler

HALCON 13, Kasım 2016’da kullanıma sunuldu. Yeni özellikleri, filtreleri, geliştirmeleri ve paralel işlemler ile hız konusunda yapılan iyileştirmeleri anlatalım.

Geliştiriciler için;

Halcon arayüzünde geliştirme yaparken, artık bütün kontrol ve ikonik değişkenlerine breakpoint konulabiliyor. Bunları Quick Navigation’dan izleyebilirsiniz.

Dokümantasyon’da notlar daha detaylı, düzenli, kısımlara ayrılmış, listeli halde.

Halcon kodu export edilip Visual Studio’da projenize eklendiyse, kullandığınız Halcon değişkenlerini watch edip izleyebiliyorsunuz.

Birkaç ayar ile uzaktaki sisteminizin Halcon üzerinden debug’ını yapabilirsiniz. Halcon’u hDevEngine ile çalıştırıp, projenizden Halcon dosyasını çalıştırarak kullanıyorsanız; uzaktan pc erişimi ile canlı proje üzerinde (sistem uzakta bir fabrikada da olabilir) Halcon arayüzü üzerinden breakpoint koyup debug yapılabiliyor. Sistem çalışırken Halcon dosyasındaki breakpoint koyduğunuz yere düşüyor, böylece siz değişkenleri görüp adım adım devam edebiliyorsunuz.

Görüntü işleme;

Yeni birçok görüntü işleme filtreleri eklendi.

bilateral_filter eklendi. Görüntüdeki geçiş noktalarını değil, yüzey kısımlarında yumuşatma yapmak için kullanılabilir, kenarı yakalamak isteyip yüzeydeki parazitleri gidermek istiyorsanız. Guided_filter da bunun gibi çalışıyor ve az daha hızlı. Bununla birlikte bilateral_filter kullanırken, hızını ve kalitesini parametrelerle ayarlayabilirsiniz.

Yeni bir threshold yöntemi; MSER (Maximally Stable Extremal Regions), yani en stabil olan threshold sonucu.
segment_image_mser komutu ile görüntü üzerinde keskin yada yumuşak geçişlerde de olsa, koyu açık ya da ikisi için de region’ları alabiliyorsunuz.

Texture inspection yöntemleri geliştirildi.

Datacode, QRcode fonksiyonları geliştirildi. Bulanık, yamuk açılı, kontrastı kötü, yazı kalitesi düşük, mürekkebi az-fazla gelse de kodları bulma oranları arttırıldı.

Barcode’lar parazitli olsa da bulabiliyor. Barkodun bir kısmı silinik gelse de, bar çubukları üzerinde okunabilen bir nokta var ise okur, bu şekilde bütün çubukların okunabilen yerlerini alır ve barkodun tamamını tanıyabilir.

OCR (karakter tanıma, yazı okuma) okuma oranları daha arttırıldı.

Dot print (nokta vuruşlu) yazılarda (sanayide döküm malzemeler üzerindeki gibi) okuma oranları geliştirildi.

Find_ncc_models komutu artık çoklu model tanımayı da destekliyor. Ayrıca görüntü üzerinde tanımada iyileştirmeler var.

3 Boyutlu Görme;

Kullanılan bazı komutlarda parametre eklemeleri var. Point Cloud (Nokta Bulutu) çıkarmaları, Kalibrasyonu, Yüzey modelleme komutları, Matching komutları geliştirildi.

HALCON arayüzündeki grafik ekranda da bazı yenilikler var.

set_window_param ile “region_quality” low-good değerleri verilerek, region kenarları daha hassas gösterilebilirsiniz.
set_window_param ile “anti_aliasing” true-false değerleri verilerek, kenarlar daha yumuşak yada keskin gösterilebilir.
dev_set_color’da artık renkler hex kodu olarak da verilebilirsiniz.
Ekranda yazı yazma göstereceğimiz zaman, top-bottom, left-right-center ile hizalanabilir.
Ekranda bir mesaj yazıldığında zoom in – zoom out yapıldığında bile mesajın da ona göre tekrar hizalanması sağlanıyor.

Komutlarda Hızlanma;

Artık neredeyse bütün komutlar fonksiyonlar kendi içinde paralel process ile işleniyor. Yani hepsinde bir hızlanma mevcut, bazıları ise çok daha hızlanmış durumda. Örneğin aşağıdaki komutlarda yüzde kaç hızlanma olmuş görelim;

threshold, %180
dyn_threshold, %400
mean_image, %300
trans_from_rgb, %325
find_shape_model, %300
scale_image, %300
find_text, %300
edges_color, %80

Shape based matching, Deformable shape based matching işlemleri,
OCR (karakter tanıma, yazı okuma) işlemlerinde de hızlandırmalar yapıldı.

 

HALCON 13 artık daha hızlı, daha verimli. Seneler içinde HALCON, biz görüntü işleme geliştiricileri için işimizi epeyce kolaylaştırdı..

 

HALCON 13 çıktı

Evet, görüntü işleme kütüphanesi olarak kullandığımız HALCON’un yeni versiyonu 1 kasım 2016’da çıkıyor.

Lansmanı için Almanya-Münih’e MVTEC’in merkezine gittik ve HALCON 13’ün yeni özelliklerini gördük, bununla ilgili detayları bir sonraki yazımda yazacağım.

halcon13days

 

 

 

 

 

 

Şimdilik aşağıdaki sayfadan inceleyebilirsiniz.

HALCON 13 Release

 

Uygun İşleme Yönteminin Seçimi

Tipik bir yapay görme problemini çözmek için pek çok farklı yaklaşım getirilebilir. İdeal yaklaşımı seçmek çoğu zaman pek kolay olmayabilir.

HALCON Alternatif yöntemler sunar

Görüntü işlemeye yeni başlayanlar genelde “Blob analysis” olarak belirttiğimiz, segmentation işlemleri ile (thresholding, filtering, selection …) işleri çözmeye meyillidirler. Oysa HALCON pek çok farklı alternatif disiplini sunmaktadır.

Uygun Metod?

Bu makalede; basitçe “Dairenin merkezini bulma” uygulamasını, farklı metodolojiler kullanarak nasıl gerçekleştirebiliriz ona değineceğiz.

Her bir metodolojinin farklı avantaj ve dezavantajları olabildiğinde, ideal olanı, projeye en uygun yöntemi seçmektir (ki çoğu zaman pek kolay değildir)

İleride makaleye yukardaki resimde anlatılan yolları tek tek inceleyerek devam edeceğiz. Görüşmek üzere…

Inpaint işlemi (görünmezlik etkisi)

Bir görüntüden, seçili yerlerin kaldırılması ama kaldırılan yerlerin de akıllı bir şekilde doldurulması işlemi, HALCON da inpainting olarak adlandırılan işlemdir. inpaint_ct, inpaint_texture v.b. komutlar bu işi yapmaya yardımcı olur.

geçmiş yıllarda, ingiliz ordusu tarafından görünmez tank geliştiridiği haberleri yayılmıştı. Oradaki teknoloji, yüzeyi silicon kaplı tankın yüzeyine, projektör yardımıyla arka zeminin görüntüsünün yansıtılması idi.

Benim burada bahsedeceğim yöntem ise, alınan bir görüntüden, istemediğimiz kısımları çıkartıp, çıkartılan yerleri akıllı bir şekilde tamamlamaktır.

Örneğin, TV de maç vs. yayınlanırken kaçak maç yayını yapan yerleri yakalayabilmek (!) adına ekrana çıkan sinir bozucu rakamlardan nasıl kurtuluruz?

 

read_image (Mac, 'C:/Users/Mavis/Desktop/Mac.jpg')
gen_rectangle1 (ROI_0, 81.5677, 66.7622, 103.823, 156.445)
reduce_domain(Mac, ROI_0, ImageReduced)
decompose3(ImageReduced, R, G, B)
binary_threshold(B, Region, 'max_separability', 'light', UsedThreshold)
dilation_circle(Region, RegionDilation, 3.5)
inpainting_ct (Mac, RegionDilation, InpaintedImage, 15, 90, 4, 8, 3)

Sadece bu kadar az kod yazarak, ekrandaki beyaz rakamları göndermek mümkündür. İşte sonuç 🙂

HALCON kendi örnekleri de inpainting konusunda oldukça başarılı ve etkileyici. İncelemekte fayda var…

Kameralı Sayma Sistemleri – Devam

Dünden beri, umreden bana gelen tesbihimle oynuyorum. Görüntü işlemecinin olmazsa olmazıymış meğer. Bu tesbihin tanelerini sayan bir uygulama yapalım.

(Yukarıdaki fotoğrafa tıklayıp, 1024 x 768 boyutlarında indirebilirsiniz)

read_image (Tesbih, 'C:/Users/Mavis/Desktop/T2-1024x768.jpg')
dev_close_window()
dev_open_window_fit_image(Tesbih, 0, 0, 600, 300, WindowHandle)
set_display_font(WindowHandle, 16, 'mono', 'true', 'false')
decompose3(Tesbih, R, G, B)
*siyah kisimlari secelim
var_threshold(G, Region, 75, 75, 0.2, 2, 'dark')
opening_circle(Region, RegionOpening, 1.5)
connection(RegionOpening, ConnectedRegions)
select_shape_std(ConnectedRegions, SelectedRegions, 'max_area', 70)
fill_up_shape(SelectedRegions, RegionFillUp, 'area', 1, 1000)
* imameyi eleyelim
fill_up(RegionFillUp, RegionFillUp1)
opening_circle(RegionFillUp1, RegionOpening1, 60)
dilation_circle(RegionOpening1, RegionDilation, 35)
intersection(RegionDilation, RegionFillUp, RegionIntersection)
* her bir boncugu secelim
closing_circle(RegionIntersection, RegionClosing, 4.5)
opening_circle(RegionClosing, RegionOpening, 12)
erosion_circle(RegionOpening, RegionErosion1, 14)
* sayalim
connection(RegionErosion1, ConnectedRegions1)
select_shape(ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
count_obj(SelectedRegions1, Number)
Radius[0:Number-1] := 12
area_center(SelectedRegions1, Area, Row, Column)
gen_circle(Circle, Row, Column, Radius)
dev_display(Tesbih)
dev_display(Circle)
disp_message(WindowHandle, 'Tesbih ' + Number + ' lük' , 'image', 12, 12, 'dark green', 'true')


Uygulamamızı çalıştırdığımızda elde edeceğimiz ekran görüntüsü :

Mavis Kameralı Hacim (En-Boy-Yükseklik) Ölçümü

Koli, paket, kutu v.b. ürünlerin hacmini ölçmek isteyenler (kargo firmaları) için, 2 ya da 3 kameralı hacim ölçüm sistemi geliştirdik.

Win2015 fuarında sunumunu yaptığımız projede, 1 otofokus kamera üstten, 1 otofokus kamera ise yandan bakarak hacim ölçmektedir.

Mavis, Hacim bulma uygulaması için, biri üstten bakan (W x L) diğeri üst çaprazdan bakan (H) 2 kamera kamera ile çözüm sunmaktadır.  Sunulan çözüm alternatiflerine göre (TOF kamera, derinlik sensörü, 3D kamera..) aşağıdaki avantajlara sahiptir.

•Yüksek Çözünürlük (5MPix – 2592×1944)
•Yapay Görme Teknikleri Kullanabilme (Image Processing)
•Gerçek Görüntü – Video Kaydedebilme
•Tüm boyutlarda ölçüm yapabilme
•Otomatik Fokus ile her yüzeyden net görüntü alabilme
•Barkod Okuyabilme
•Özel Şekil Logo Tanıyabilme, Öğrenebilme
•Kolay Kurulum
•Bakım Gerektirmeme
•Ucuza Maliyet

 

Daha fazla bilgi için şu sayfamıza da bakabilir ya da bizimle iletişime geçebilirsiniz.

 

 

Kameralı Sayma

Kameralı sayma sistemleri hızlı ve tutarlı olabilmektedir. Gözle zor sayılan pek çok şey, kamerayla hızlıca sayılabilmektedir. Son zamanlarda daha sık sayma uygulaması istendiğinden, burada bir kaç örnek sayma projesine yer vereyim.

Yukarıdaki resimde ağaç (kütük) sayısını bulan, bir HALCON kodu yazalım.

smooth_image ve watersheds_threshold filtreleri uyguladıktan sonra, zor gibi görünen resim, kolaylıkla sayılabilir hale geldi.

 

İşte aşağıda da tam HALCON kodu (en üstteki resim indirip deneyebilirsiniz)

dev_update_window ('off')
dev_close_window ()
read_image (Image, 'trees.png')
get_image_pointer1 (Image, _, _, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Region, 230, 255)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, Back, 'max_area', 0)
dilation_circle (Back, RegionDilation, 3.5)
paint_region (RegionDilation, GrayImage, GrayImageFilled, 0, 'fill')
info_smooth ('deriche2', 0.0655, Size, Coeffs)
smooth_image (GrayImageFilled, ImageMean, 'deriche2', 0.0655)
invert_image (ImageMean, ImageInvert)
watersheds_threshold (ImageInvert, Basins, 18)
dev_set_colored (6)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Image)
dev_display (Basins)
count_obj (Basins, NumberOfTrees)
disp_message (WindowHandle, 'Number of trees: '+NumberOfTrees, 'window', 12, 12, 'black', 'true')

Çatlak, Çizik, Çizgi vs. bulma

Genelde gözle dahi zor görülen çatlak, çizgi, çizik vs. bulunması işlemi bazen oldukça baş ağrıtıcı olabilir. Cam çatlağı bulunması, ahşap ya da mermer yüzeyde damarların kontrolü, tıbbi görüntüler, metalik yüzeydeki çiziklerin tesbiti gibi örneklerde karşımıza sıkça çıkan bu uygulamalarda alınan  görüntünün hem arka zemini ile uğraşmak (görüntüye giren yansımalar, noktacık şeklindeki tozlar vs. ayrıştırılmalı) hem de ön plandaki çizgiler hassas olarak seçilebilmelidir.
Uygulamaya göre pek çok farklı yaklaşım getirilmekle birlikte, bu tür uygulamalarda

  • Gauss Filtresi Uygulama
  • Gradient Domain Manipulation tekniği uygulama
  • Photometric stereo yöntemine göre görüntü alma

vb yöntemler ilk akla gelenlerdir.

Yukardaki resimde görüldüğü gibi, lines gauss bize çizgileri, gradient_domain işlemi ise arka zemin temizlemeyi ve çizgileri belirginleştirmeyi göstermektedir. Her iki tekniğin de HALCON kurulumu ile gelen angio-part isimli resme uygulandığı HALCON programcığı ise aşağıdadır. Kendi örneklerinizde uygulamalar daha komplike olacaktır.

(gradient domain manipulation tekniği, zemin üzerindeki resim üzerinde yer alan, genelde istenmeyen lekelerin elenmesi ve ön plana çıkartılmak istenen yerlerin belirginleştirilmesi suretiyle resmin yumuşatılması işlemidir. Bazı durumlarda çok iyi sonuçlar verebilmektedir.)

dev_update_off ()
dev_close_window ()
read_image (Angio, 'angio-part')
get_image_size (Angio, Width, Height)
dev_open_window (0, 0, 3*Width/2, 3*Height/2, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
lines_gauss (Angio, Lines, 2.3, 0.0, 0.7, 'dark', 'true', 'parabolic', 'true')
dev_display (Angio)
dev_set_color ('green')
dev_display (Lines)
disp_message (WindowHandle, 'X-Ray image with extracted contours', 'window', 20, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop()
*
gen_image_const (DX, 'real', Width, Height)
gen_image_const (DY, 'real', Width, Height)
count_obj (Lines, Number)
*
for I := 1 to Number by 1
    select_obj (Lines, Line, I)
    get_contour_xld (Line, Row, Col)
    if (|Row| < 10)
        continue
    endif
    get_contour_attrib_xld (Line, 'angle', Angle)
    get_contour_attrib_xld (Line, 'width_left', WidthL)
    get_contour_attrib_xld (Line, 'width_right', WidthR)
    get_contour_attrib_xld (Line, 'contrast', Attrib)
    * To process the lines, the point at which the gray value drops to
    * 25% of the contrast between the line and the background will be
    * displayed.  This point is given by sqrt(3/4) for the parabolic
    * line model.
    RowR := Row+cos(Angle)*WidthR*sqrt(0.75)
    ColR := Col+sin(Angle)*WidthR*sqrt(0.75)
    RowL := Row-cos(Angle)*WidthL*sqrt(0.75)
    ColL := Col-sin(Angle)*WidthL*sqrt(0.75)
    tuple_max ([RowR,RowL], Max)
    tuple_max ([ColR,ColL], Max2)
    if (Max < Height and Max2 < Width)
        set_grayval (DX, int(RowR), int(ColR), Attrib*sin(Angle))
        set_grayval (DY, int(RowR), int(ColR), Attrib*cos(Angle))
        set_grayval (DX, int(RowL), int(ColL), -Attrib*sin(Angle))
        set_grayval (DY, int(RowL), int(ColL), -Attrib*cos(Angle))
    endif
endfor
real_to_vector_field (DY, DX, VectorField, 'vector_field_relative')
reconstruct_height_field_from_gradient (VectorField, SmoothedImages, 'poisson', [], [])
dev_display (SmoothedImages)
disp_message (WindowHandle, 'Smoothed image', 'window', 20, 12, 'black', 'true')

Gradient domain manipulation allows strong image smoothing simply by suppressing all gradients below a certain threshold.

As result, only strong edges remain while small changes (which are typically caused by noise) are removed.

 

HALCON12 Hobj Viewer

One of the HALCON 12’s new feature is HObj file support.

HOBJ is a binary file format, which provides the functionality to write and read all kinds of iconic HALCON objects (images, regions, and XLDs). Since data is written with neither compression nor conversion, writing this file format is faster than other supported file formats in most circumstances. Hence, if an application needs to read and write all kinds of HALCON objects as fast as possible and no compression is required, this format should be used. The default file extension for this file format is ‘.hobj’. For images, all HALCON pixel types can be written. Multi-channel images are supported. The channels can have mixed pixel types but must have the same width and height. The domain of an image and it’s creation date are stored in the file as well. An object tuple is written into a single file.

I wrote a opensource simple .NET HObjViewer to display hobj files. (Requires HALCON 12 Runtime license)

 

Download Visual Studio Express Edition Source codes of HObjViewer

 

HObj, HALCON 12 ile birlikte gelen yeni bir özelliktir. İkonik nesnelerin (Resim, region, xld) okunmasında ve yazılmasında çok daha hızlı çalışmaktadır. (Sıkıştırma algoritmaları kullanmadığı için)

Mavis olarak, HALCON Runtime yüklü makinalarda hobj dosyalarını görüntüleyebilmek için geliştirdiğimiz, açık kaynak kodlu HObjViewer uygulamasını indirebilirsiniz.

Download Visual Studio Express Edition Source codes of HObjViewer