Mustafa Sarı

Mustafa Sarı hakkında

(Samsun, 26.03.1973, ,İTÜ, Elektronik ve Haberleşme Mühendisliği, Yazılım)

Kalibrasyon

Özellikle ölçüm, robotik gibi hassas uygulamalarda mutlaka kamera kalibrasyonu yapılmak zorundadır. Hayli zahmetli olduğu için genellikle ihmal edilir. İyi kalibre edilmiş kamera ile 1 mikron hassasiyetli değerlerde ölçüm yapabilmek, 3D modelleme, robotik koordinat sistemleri, gerçek dünya koordinat sistemleri, pixel – mm. tarzı dönüşümler mümkün olabilmektedir. En önemlisi, lens distorsiyonları giderilmekte, balık gözü efekti, (lens küresel  olduğu için oluşan) merkezde ve kenarda ölçüm farklılıkları gibi istenmeyen etkenler giderilmektedir.

HALCON kamera kalibrasyonu için geniş kapsamlı bir modül ve sihirbaz içermektedir. Kamera kalibrasyonu yapabilmek için, öncelikle son derece hassas olarak üretilmiş kalibrasyon plakalarına ihtiyaç vardır. MVTec, farklı ihtiyaçlar için farklı ölçülerde kalibrasyon plakaları üretmiştir. Seramik, metal, şeffaf vb. olabilen kalibrasyon plakaları MAVIS ten temin edilebilir.

HALCON, kullanılan kalibrasyon plakasına bağlı olarak, kalibrasyon plakasının özelliklerini içeren bir description dosyası yüklemeye izin verir. (Kalibrasyon plakası ile birlikte, bir de data dosyası gelmektedir.) Son derece hassas olduğu için pahalı da olan kalibrasyon plakalarından, farklı uygulamalara göre farklı boyutlarda bulundurmak gerekecektir. Böylesine atıl bir stoğu bulundurmak mantıklı olmayacağı için kalibrasyon plakası uygulamanın ihtiyaçları doğrultusunda satın alınmalıdır. Yurt dışından getirmenin zaman alması ya da diğer zorluklardan dolayı MAVIS kendi kalibrasyon plakalarını geliştirmiştir. Farklı boyutlardaki plakalar, 1 mm. kalınlığında özel kağıtlara yüksek hassasiyetli baskı merkezlerinde print edilerek çıkartılmış, her biri için postscript (.ps) ve HALCON description dosyası hazırlanmıştır.

Ölçüm ya da robotik gibi uygulamalar ile uğraşan HALCON kullanıcıları, MAVIS ile iletişime geçerek, uygun fiyatlarda kalibrasyon plakalarına sahip olabilir ve gerçek ölçüm, robotik, 3D uygulamalarını geliştirebilirler.

 

 

HALCON ile Video Processing

Image Processing (Görüntü İşleme) tekniklerinin video dosyalarına uygulanması işlemi HALCON ile mümkündür. Video, her biri işlenebilir bir görüntü içeren ardışıl frame lerden meydana gelmektedir. Dolayısıyla, tek tek bu frame lere erişmek mümkün ise, istenen “video processing” HALCON komutları ile gerçekleştirilebilir.

Video işleme neden gerekli olabilir?

  • Görüntü alınırken, işlemek için yeterli süre yoksa
  • Tüm senaryonun kaydedilip, en sonunda karar verilmesi gerekiyorsa
  • Tek tek Frame olarak görüntü alınamıyorsa
  • Kamera çıktısı video formatında ise
  • Real Time / (Canlı) işleme gerekiyorsa

vb. sebepler sayılabilir.

Sürpriz yumurtadan çıkan motosikletin, arka tekerleğini çıkartıp kamera altında fırıldak gibi döndürdüm. Tekerlek, kendi ekseni üzerinde kamera altında fırıldak gibi dönerken, görüntüyü avi formatında kaydettim. Tekerlek, yüzeyde hangi noktalardan geçti? gibi bir soru aklıma geldi. Tüm görüntü kaydetme işi bittikten sonra, bu avi formatındaki videoyu HALCON da işledim ve cevabı buldum 🙂

Fırıldak gibi dönen tekerleğe ait avi formatlı video (tıklanarak indirilebilir)

HALCON içinde video processing işlemi için, öncelikle video dosyasının open_frame_grabber ile açılması gerekir. Grabber adı olarak “DirectFile” en uygun seçenektir. CameraType değişkeni olarak avi dosyasının adı seçilmelidir. DirectFile için HALCON sürücü dosyasının versiyonu 5.1 olmalıdır. Eski versiyonlar bazı avi dosyalarını iyi tanımayabilir. (HALCON 11 ile 5.0 gelmektedir. MVTec web sitesinden indirilip, 5.1 e yükseltilmelidir)

Tekerleğe ait video içinden ayıklanmış tek bir frame

 

 

 

 

 

 

 

 

 

Tekerleğin geçtiği tüm yollarin deviation_n komutu ile çıkartılmış hali.

 

 

 

 

 

 

 

 

 

şimdi basit bir threshold ile, tekerleğin taradığı tüm alanları belirleyebiliriz.

 

 

 

 

 

 

 

 

 

ve ağırlıklı olarak tekerleğin taradığı alanları belirlemek için, distnace_transform komutundan yararlanabiliriz.

 

 

 

 

 

 

 

 

 

Bütün programın HALCON kodu

gName := 'C:/Users/Mustafa/Desktop/don4.avi'
open_framegrabber ('DirectFile', 1, 1, 0, 0, 0, 0, 'default', 8, 'default', -1, 'false', gName, 'default', 0, -1, AcqHandle)
gen_empty_obj(Images)
for i := 1 to 132 by 1
    grab_image(Image, AcqHandle)
    concat_obj(Images, Image, Images)
endfor
close_framegrabber (AcqHandle)

channels_to_image (Images, MultiChannelImage)
deviation_n (MultiChannelImage, ImageDeviation)
threshold(ImageDeviation, Region, 28, 255)
distance_transform (Region, DistanceImage, 'euclidean', 'true', 1280, 1024)

HImage Bitmap, Bitmap HImage dönüşümleri

HALCON içinde resim tipi dosyaların iconic değişken olarak eşdeğeri HImage dir. grab_image, read_image gibi fonksiyonlar direk olarak HImage tipi değişken döndürür. Bazı durumlarda (genelde windows ile programlama yaparken) HALCON HImage nesnesini Bitmap olarak dönüştürmeye ya da Windows Bitmap nesnesini HImage olarak dönüştürmeye ihtiyacımız olabilir.

HALCON içinden grab işlemi yukarıdaki şemaya göredir.

Eğer HALCON image acquisition interface yerine, kameradan Bitmap olarak görüntü almak ve bunu proses etmek gibi işlemlere gereksinim varsa Bitmap to HImage türü fonksiyona ihtiyacımız olabilir. HALCON .net kütüphanesindeki HImage in overload edilmiş yöntemlerinden biri, tam da bu iş için geliştirilmiştir.

            Bitmap bmp = new Bitmap("C:\\Projects\\1.bmp");
            IntPtr pval = IntPtr.Zero;
            BitmapData bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
            pval=  bd.Scan0;
            HImage img = new HImage("byte", bmp.Width, bmp.Height, pval);
bmp.Unlock...

gibi bir kodlama, bitmap nesnemizden direk olarak HImage üretmeye yarar.

Projeyi daha derli toplu hale getirmek için ise;

            Bitmap bImage, bImage32;
            System.Drawing.Imaging.BitmapData bmData = null;
            Rectangle rect;
            IntPtr pBitmap;
            IntPtr pPixels;

            HImage hi_Image = new HImage();

            bImage = new Bitmap("C:\\Users\\Public\\Documents\\MVTec\\HALCON-11.0\\examples\\images\\mreut.png");
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = bImage;

            // Convert 24 bit bitmap to 32 bit bitmap in order to ensure
            // that the bit width of the image (the Stride) is divisible by four.
            // Otherwise, one might obtain skewed conversions.
            bImage32 = new Bitmap(bImage.Width, bImage.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            Graphics g = Graphics.FromImage(bImage32);
            g.DrawImage(bImage, new Point(0, 0));
            g.Dispose();

            // Obtain the image pointer.
            rect = new Rectangle(0, 0, bImage.Width, bImage.Height);
            bmData = bImage32.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            pBitmap = bmData.Scan0;
            pPixels = pBitmap;
            unsafe
            {
                // Create HALCON image from the pointer.
                hi_Image.GenImageInterleaved(pPixels, "bgrx", bImage.Width, bImage.Height, -1, "byte", bImage.Width, bImage.Height, 0, 0, -1, 0);
            }
            // Don't forget to unlock the bits again. 😉
            bImage32.UnlockBits(bmData);
            hWindowControl1.HalconWindow.SetPart(0, 0, bImage.Height - 1, bImage.Width - 1);
            hi_Image.DispObj(hWindowControl1.HalconWindow);

gibi daha güvenli bir kod geliştirilebilir. C# formu üzerine koyduğum HWindowControl ve PictureBox bileşenleri ile birlikte, tam çözüm halindeki C#.NET uygulaması ise buradan indirilebilir. Bu çalışan Visual Studio 2008 uygulamasında hem Bitmap ten HImage dönüşümü, hem de HImage den Bitmap dönüşümü kodlanmıştır.

Daha fazla bilgi veya destek için info@mavis.com.tr adresi ile iletişime geçebilirsiniz.

 

DXF (DWG) çizimlerinin resim üzerine oturtulması

CAD Destekli Görüntü İşleme

Cad programlarından (Autocad, Catia, Solidworks…) elde edilen çizim bilgilerilerinin alınan kamera görüntüsü ile eşleştirilmesi ve
bu eşleşim sonucu bazı işlemlere tabi tutulması cad destekli görüntü işleme olarak tanımlanabilir.

Cad Destekli görüntü işleme ile genelde aşağıdaki projeler yapılmaktadır

  • Cad görüntüsü ile belirtilen parçanın bulunması
  • Cad görüntüsü işe üretilen parça arasındaki farklılıkların bulunması
  • Cad görüntüsü bilinen parça ile üretilen parçanın ölçümlerinin yapılması
  • 3D eşleştirme (Cad verisi bilinen parçayı bulma) vb..

Cad verisini okumak ve yazmak için,  HALCON güçlü bir kütüphane desteği sunmaktadır. HALCON Cad dosyası içinde geçen POLYLINE, LWPOLYLINE, LINE, POINT, CIRCLE, ARC, ELLIPSE, SPLINE, BLOCK, INSERT gibi komutları okuyabilmekte, işleyebilmekte ve yazabilmektedir.

Aşağıdaki örnek, birden fala kamera ile alınan görüntülerin birleştirilip, pastal bilgilerini içeren CAD (DWG) dosyasının bu görüntünün üzerine yerleştirilmesi ve kumaştaki bozuk yerlerin (kirli, hatalı vb.) belirlenip, pastal bilgisinde bu yerlere gelen parçaların  işaretlenmesi amacıyla geliştirilmiş bir HALCON kodudur.

yukarıdaki resim, bir masa üzerine yerleştirilmiş kumaştan alınmış görüntüdür. Görüntü, 2×3 adet kamera kullanılarak alınmış ve morphology (mosaicking) kullanılarak birleştirilmiş ve tek bir görüntü olarak elde edilmiştir.

DWG(DXF) dosyasının bir kısmının görüntüsü ise

yukarıdaki gibidir. (DXF dosyası çok daha büyük olduğu için sadece bir kısmının önüzlemesini verdim)

HALCON programında yapılması gereken

  1. 2×3 adet matris şeklinde yerleştirilmiş kameralardan alınan görüntünün birleştirilip tek bir görüntü elde edilmesi (mosaicking dediğimiz bu işlem ileride bir makale konusu olabileceğinden burada detaya girilmeyecektir)
  2. Alınan kumaş görüntüsünün döndürülüp yatay eksene oturtulması (kumaş hafif eğimli/yan yerleştirilmiş olabilir
  3. DXF (Cad) dosyasındaki pastal bilgilerinin kumaş üzerine uyacak şekilde yerleştirilmesi
  4. Kumaştaki problemli yerlerin tespit edilmesi
  5. Kumaşta problemli yerlere denk gelen pastalların işaretlenmesi.

Programın çalışması

yukarıdaki gibi, yatay eksende 2 sıra, düşey eksende 3 sıra halinde yerleştirilmiş kameralardan alınmış görüntüler birleştirilir.

Kumaş eğik yerleştirilmiş dahi olsa, yatay eksene sıfır derece açı ile döndürülür.

CAD(DXF) dosyası okunur ve pastallar seçilir. (Cad dosyası gerekenden fazla veri içermektedir. etiketler, bilgiler, işaretler, çizgiler vb. Bunlar arasından sadece pastal bilgileri içerenler seçilir)

Sonunda, Cad dosyasındaki pastal bilgileri, kumaşa tam uyacak şekilde fit edilir. Kumaş üzerindeki hatalı yerler işaretlenir ve bunların hangi pastallara karşılık geldiği belirlenir.

Bu noktadan sonra kesim işlemi yapılacaksa, hangi parçaların hatalı olduğu bilinir ve otomatik olarak ayırt edilir.

Sistem, akıllı kesim otomasyonu gibi projelerde kullanılabilir.

Projede kullanılan resimler ve çalışan HALCON uygulaması için, bizimle (info@mavis.com.tr) iletişime geçebilirsiniz.

 

Fotografik Kalibrasyon

Herhangi bir nedenden dolayı, alınan görüntüler dikey ya da yatay eksende bir miktar uzama/çekme şeklinde deformasyona uğramış ise, ölçüm gibi uygulamalar bazı istenmeyen sonuçlar verebilir.

Dikey/Yatay bozulmalar neden meydana gelir?

  • Kameraların yatay ve dikey çözünürlüğü birbirinden farklı olabilir
  • Hareketli bir cismin görüntüsü alındığı için, görüntüde uzama meydana gelmiş olabilir
  • Çizgi taramalı (linescan) kameralarda, konveyör ya da dönme hızından çok daha yüksek hızda fotoğraf alınmış olabilir

Özetle, bir çok farklı sebepten dolayı görüntü olması gerekenden farklı çıkmış olabilir. İdealde, bu tür görüntüleri, kaynağında (kamera tarafı) düzeltmek ve yazılıma (görüntü işleme uygulaması) düzgün halini vermek gerekir. Ne yazık ki bu durum her zaman mümkün olmayabilir. Bu tür durumlarda, yazılım ile görüntüyü düzeltmek mümkündür.

Aşağıdaki kod, eliptik şekilde uzamış bir görüntünün, tekrar mükemmel daire şekline getirilmesini göstermektedir. (Eğer, üzerinde çalıştığımız nesnenin tam dairesel olduğunu biliyorsak, alınan görüntü eliptik bile olsa, bunu tam daire şekline getirme işlemi)

Soldaki şekli paint ile çizdim. Mükemmel daire yerine yatay eksende biraz genişleterek, elips haline getirdim. İstediğim, bir HALCON kodu ile, bu şekli tekrar mükemmel daire haline getirmek. Şeklin sadece yatay eksende bozulduğunu varsayıyoruz. Yani yüksekliği (boyu) sabit fakat yana doğru uzamış olan bu elipsi, boy ve en oranı korunacak şekilde ideal daireye geri dönüştürmek istiyoruz. Yazmamız gereken kısa HALCON kodu aşağıdaki gibi olabilir.


read_image (E, 'E.png')
bin_threshold (E, Region)
smallest_rectangle1(Region, Row1, Column1, Row2, Column2)
W := Column2 - Column1
H := Row2 - Row1
R := 1.0 * W / H
hom_mat2d_identity(HomMat2DIdentity)
hom_mat2d_scale_local (HomMat2DIdentity, R, 1, HomMat2DScale)
affine_trans_image (E, ImageAffinTrans, HomMat2DScale, 'constant', 'false')
affine_trans_region(Region, RegionAffineTrans, HomMat2DScale, 'false')

Kameralı Otomatik Halı Kesme Makinası

Günümüz halı üretim teknoloji gereği sürekli form şeklinde üretilen halıların hassas olarak kesilip halı haline getirilmesi gerekmektedir. Mavis olarak gerçekleştirdiğimiz kameralı halı kesme otomasyonunu, dünyanın en büyük halı üreticisi firmada devreye aldık.

Kameralar, dikey olarak yukarıdan aşağıya doğru kayan halıların arasındaki kesilecek rotayı belirler ve mikroişlemciye gönderir. Mikroişlemci her bir kesici kafayı sağa sola hareket ettirmek suretiyle rotayı izler.

Sonuç olarak sürekli form şeklindeki halılar, dikey olarak kesilmiş olur.

Sistemin çalışırhaldeki videosu :

Mavis Dikey Halı Kesme Makinası

Sistemin kameralı kontrol işlemleri Mavis tarafından yapılmıştır. Halı makinası, Anmak firması tarafından geliştirilmiştir.

Sensör Teknolojisinde Quantum Verimliliği

Quantum Verimliliği (Quantum Efficiency – QE)

Sensör teknolojisinde verimlilik faktörü olarak kullanılan quantum efficiency (QE) özetle birim zamanda sensör üzerine düşen fotonların, elektrona dönüştürülme oranı olarak tanımlanır.

Formüle edilmek istenirse Qe = e-/ph olarak tanımlanır. Burada;

ph : sensöre düşen toplan foton sayısı
e- : dönüştürülen toplam elektron sayısıdır.

Dolayısıyla, verimi yüksek bir sensörde en önemli unsur, sensör üzerine düşen fotonların olabildiğince fazlasını elektrona (akım) çevirebilmektir. Bu da, gelen fotonların, geriye yansıma olmaksızın, tamamını fotodiyot üzerine düşürebilmek ve fotodiyot üzerinden akıma çevirebilmek anlamına gelir.

Günümüzde yaygın olarak kullanılan sensörler Ön Yüzeyden Aydınlatma (Front Side Illumination) olarak bilinen sensörlerdir. Bu sensörlerde yapı sırasıyla (ve özetle)

Mikrolens – Renk Filtresi – Metal İletkenler – Fotodiyot şeklindedir.

Soldaki sembolik resim, Aptina sensörleri web sitesinden alınmıştır. Gelen ışınlar (foton) en altta yer alan fotodiyotlara inene kadar, yol üzerinde yer alan metal iletkenlere çarparak geri yansıyabilmektedir. Bir diğer sorun, dalga boyu çok kısa olan mavi ışığı oluşturan fotonların, n tipi iletken bölgesinde yüzey yansımasına tabi olması ve yeterince derine sızamamasıdır. Tüm bunların sonucunda özellikle karanlık ortamlarda ön yüzey aydınlatmalı (FSI) sensörler kulanılarak alınan görüntüler daha kalitesiz olmaktadır.

Bu sorunu çözmek için, ilk olarak Sony tarafından geliştirilen ve akabinde diğer major sensör üreticileri tarafından da desteklenen yeni teknoloji Arka Zemin Aydınlatmalı (BSI – Back Side Illuminated) sensörlerdir. Bu yeni tip sensörlerde temel buluş; fotodiyotlara doğru ilerleyen fotonların yolu üzerinde yer alan metal iletkenleri yol üstünden kaldırmaktır. Bunu yapabilmek için, n tipi iletken yolu biraz kısaltılmış, fotodiyotlar mikrolense daha yaklaştırılmış, metal iletkenler fotonların yol güzergahında değil de, en altta olacak şekilde yerleştirilmiştir. Sonuç; özellikle karanlık ortamlarda artan fotoğraf kalitesi olarak karşımıza çıkar.

Sony web sitesindeki başarılı anlatım ve illüstrasyon :

BSI nispeten yeni bir teknoloji olmasına rağmen, günümüzde cep telefonlarında bile yaygın olarak kullanılmaktadır. Sony Experia Arc S (ExMor), sonra HTC, iPhone4S BSI kulanan öncü modeller olarak pazarda yerlerini almışlardır.

Mavis olarak, line scan (çizgi taramalı) kamera olarak e2V Eliixa+ serisi kameralar kullanmaktayız.

İleride Line Scan (Çizgi Taramalı) GigEVision örnekler blog sayfalarımızda yer alacaktır.

Fabric/Leather Mesh and Pattern Identification Application for Car Seats

Automotive companies today offer users a wider range of choices. Specially with “Build your own car” option, user can change almost every detail in his/her car. Despite the this great convenience for customers, it brings lots of difficulties for manufacturers. In “Just In Time” production model, manufacturer must produce each model with “correct” details for “correct” user. This means, manufacturer must check every part in production line just after part is assembled.

BMW's build your own car site for US

We installed our HALCON based “Fabric Mesh and Pattern Identification Vision System” for one of the leading company of the world’s automotive supplier industry. The Company produces car seats, cockpits, internal door panels, sound systems, front- and back-end bumpers and exhaust systems. Our system is checking car seat’s size, model, fabric/leather color, pattern, texture and mesh and detecting original artikel number. If detected artikel number is different than the expected number, system is stopping production line and raising an alert signal/message.

Fabric patterns and colors has lots of variationVision system must distinguish more than hundreds of fabrics/leathers with lots of color and pattern combination. Furthermore, new models (fabrics/leathers/colors/patterns…) must be teach to the system easily. Sometimes patterns can be very close to each other so finding differences isn’t so easy even checking by eye. At first, we used HALCON 10 and Fast Fourier Transforms to detect textures. The algorithms run fine but the problem was in teaching methodology. Sometimes we have to write “special” codes for “special” products. But for end user (operator) we have to find easier way to define new models.

Some fabric patterns to distinguishFor our 2. version, we turned our matching algorithms (usually FFT and RFT) to HALCON 11’s sample based matching technology. By this newly technology not only we reduced our thousands of lines of codes to tens (!!!) but also teaching new models became very easily for end user.

HDevelop code redesigned by Yaqi Zeng (MVTec support team) is look like below.

dev_update_off ( )
dev_close_window ( )
list_image_files ('.', 'default', [], ImageFiles)
read_image (Image, ImageFiles[0])
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (3600, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('yellow')
*
* I. Creation of identifier
create_sample_identifier ('add_texture_info', 'true', SampleIdentifier)
* II. Adding Information for preparation
for Index := 0 to |ImageFiles|-1 by 1
    read_image (Image, ImageFiles[Index])
    tuple_split (ImageFiles[Index], '/', Substrings)
    tuple_split (Substrings[|Substrings|-1], '.', Substrings1)
    FileName := Substrings1[0]
    dev_display (Image)
    disp_message(WindowHandle, 'Image ' + FileName + ' added for preparation of training', 'image', 12, 12, 'blue', 'true')
    add_sample_identifier_preparation_data (Image, SampleIdentifier, Index, [], [], ObjectSampleIdx)
    set_sample_identifier_object_info (SampleIdentifier, Index, 'preparation_object_name', FileName)
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
endfor
*
* III. Preparation and training
*      use the preparation data to train the identifier
dev_clear_window ()
disp_message (WindowHandle, ['Prepare and train the sample identifier','(this might take some seconds)'], 'window', 12, 12, 'black', 'true')
prepare_sample_identifier (SampleIdentifier, 'true', [], [])
train_sample_identifier (SampleIdentifier, [], [])
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*
* IV. Applying
*     on randomly selected run-time image
RandomIndices := sort_index(rand(|ImageFiles|))
for Index := 0 to |ImageFiles|-1 by 1
    IndexR := RandomIndices[Index]
    read_image (Image, ImageFiles[IndexR])
    dev_display (Image)
    apply_sample_identifier (Image, SampleIdentifier, 1, 0, [], [], ObjectIdx, Rating)
    get_sample_identifier_object_info (SampleIdentifier, ObjectIdx, 'training_object_name', ResultObjectName)
    disp_message(WindowHandle, 'Identified as: '+ ResultObjectName, 'window',12, 12, 'green', 'true')
    stop()
endfor
*
* V. Clean-up
clear_sample_identifier (SampleIdentifier)

Source code and related images can be download by clicking this link.

partition_dynamic kullanımı

Bir region üzerinde işlem yaparken sık sık connection komutu ile region da kaç adet nesne olduğu ile ilgileniriz. connection komutu, birbirinden bağımsız nesneleri seçeceği için, nesneler arasında 1 pixel lik dahi bağlantı olsa, onu tek bir nesne olarak algılayacaktır. Özellikle OCR işlemi gibi, her nesnenin ayrı olarak değerlendirilmesi gereken durumlarda, bu problemi gidermek gerekir. Yollardan biri partition_dynamic komutunun kullanılmasıdır.

 

Yukarıdaki resimde görüldüğü gibi, 1 ve 2 ile 6 ve 7 arasını birer çizgi ile birleştirdim. Burada threshold komutu ile bir region oluşturduğumda ve hemen sonra connection ile her bir rakamı seçmek istediğimde,

yukarıdaki gibi bir seçim yapacaktır. (1-2 ve 6-7 nin tek bir nesne olarak seçildiğine dikkat edin)

partition_dynamic komutu tam da bu gibi durumlarda istenen sonuçları üretebilir. partition_dynamic, nesneleri dikey olarak bölmeye yarayan bir komuttur. Ortalama bir nesnenin genişliğini belirtip, belirli bir yüzde toleransı da verdiğimizde, komut nesleneri olması gerektiği yerden parçalayacaktır. (Aşağıdaki resimdeki gibi)

 

partition_dynamic komutuna verilecek, ideal nesne genişliği ne olmalıdır?

nesne genişliğini komutla ya da HDevelop içindeki Feature Inspection aracı ile görebiliriz.

Yukarıdaki resimde görüldüğü gibi, seçtiğim nesnenin özelliklerini (features) gözlemledim. İlgilendiğim width değerinin 85 olduğunu gördüm. Programda direk olarak bu değeri kullanabilirim.

Dilersem daha dinamik bir yapı kurarak, olması gereken değeri kendim belirlerim. Aşağıdaki kod, hem sabit olarak bu 85 değerini kullanan, hem de dinamik olarak kendi belirlediği değere göre (tuple_median) çalışan HDevelop kodudur.

 

read_image (Image, 'C:/Users/Mustafa/Desktop/Adsız.png')
threshold (Image, Regions, 0, 139)
connection(Regions, ConnectedRegions)
* Sabit 85 değerine göre partition
partition_dynamic(ConnectedRegions, Partitioned, 85, 20)

*kendi belirleyeceği değere göre partition
smallest_rectangle1(ConnectedRegions, Row1, Column1, Row2, Column2)
W := Column2 - Column1
tuple_median (W, WOrta)
partition_dynamic(ConnectedRegions, Partitioned, WOrta, 20)

Coşkunöz’de Sac Yırtık Kontrolü

Bursa Coşkunöz A.Ş. de, kalıptan çıkan sac parçalarda meydana gelen yırtıkları kamera ile kontrol eden uygulamamızı devreye aldık.

Robot, kalıp açılınca kesilen parçayı alıp, konveyör üzerine yüklemektedir. Konveyörde ilerleyen sac parça, kameranın altına geldiğinde, kesiklik oluşmuş ise algılanır ve hatalı olarak ayıklanır. Aşağıdaki resimde, sağlam ve yırtılmış sac örnekleri görülmektedir.