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.

Delik-Perçin Boyutlarının ve Birbirleri Arasındaki Mesafelerin Kontrolü

Otomotiv sektöründe hizmet veren bir firmada bakır malzeme üzerindeki delik ve perçinlerin bulunup,boyutlarının ve birbirleri arasındaki mesafelerin kontrol edilmesi amaçlı bir sistem devreye aldık.

Geliştirdiğimiz arayüz sayesinde program farklı modellere uyarlanabiliyor. Modelin tanıtılması için operatör tarafından ürünün ölçümleri yapıldıktan sonra gerçek değerleri girilerek kaydedilmelidir. Tanıtılan modeldeki piksel-milimetre oranı kullanılarak ölçüm sonucunda bulunan piksel değerleri milimetre cinsinden ifade edilmektedir.

Deliğin bulunması :

var_threshold (ImageReduced, Region, 75, 75, 0.2, 2, 'dark')
closing_circle(Region, RegionClosing, 2.5)
opening_circle(RegionClosing, RegionOpening, 7)
connection(RegionOpening, ConnectedRegions)
select_shape_std(ConnectedRegions, SelectedRegions, 'max_area', 70)
smallest_circle (SelectedRegions, Row, Column, Radius)
gen_circle(Circle, Row, Column, Radius)
set_color(WinHandle, 'blue')
disp_region(Circle, WinHandle)

Perçinin bulunması :

var_threshold (ImageClosing, Region, 20, 20, 0.3, 3, 'light')
connection (Region, ConnectedRegions)
closing_rectangle1 (ConnectedRegions, RegionClosing, 10, 50)
opening_rectangle1 (RegionClosing, RegionOpening, 4, 120)
connection (RegionOpening, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions, ['area', 'height'], 'and', [1000, 180], [2800, 290])
count_obj (SelectedRegions, Number)
if (Number = 2)
    union1 (SelectedRegions, RegionUnion)
    smallest_rectangle1 (RegionUnion, Row1, Column1, Row2, Column2)
    gen_rectangle1 (Rectangle1, Row1, Column1, Row2, Column2)
    w := Column2 - Column1
    h := Row2 - Row1
    area_center(Rectangle1, Area5, Row5, Column5)
    set_color(WinHandle, 'blue')
    disp_region(Rectangle1, WinHandle)
endif

Delik çapı,perçin eni-boyu,merkezlerinin satır-sütun değerleri kullanılarak mesafeler bulunuyor. OK-NOK durumlarını gösteren örnek program görüntüleri :

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.

Kale Oto Radyatör’de Yırtık, Patlak, Kesik vb. Kontrolleri

Kale Oto Radyatör’ün Gebze Çayırova’daki fabrikasındaki sistemimizi devreye aldık. Radyatörler kalıptan çıktıktan sonra parçada yırtık ve patlak benzeri durumlar kontrol ediliyor.

Radyatör üzerinde kontrol edilen nokta olan kenar kısmında, küçük büyük yırtıklar oluşabiliyor.

Genelde yukarıdaki gibi büyük patlaklar oluşuyor ancak sistemin çok küçükleri bile yakalayabilmesi açısından ancak elimizle hatalı parça oluşturabildik ve bunu da sistemin kontrolünden geçirdik. Aşağıdaki resimde görüldüğü gibi yazılımımız bunu da doğru bir şekilde hatalı parça olarak gördü. Buradaki patlak 1-1,5 mm civarındadır ve bu da müşterimizin istediği limitlerin çok altındadır.

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)

E-Kart’da Kart Üzerinde Barkod ve Pin-Puk Numaralarının Kontrolü

Banka kartları, Gsm kartları vb. çeşitli kartların üretimini yapan Eczacıbaşı E-Kart Elektronik Kart Sistemleri A.Ş. firmasındaki projemizi devreye aldık. Kart üzerinde yapılması istenen kontroller:

  • Barkod’ların okunması
  • Barkod’ların sıralı şekilde devam etmesi kontrolü
  • Pin ve Puk numaralarının yazdığı alanın kapalı olması kontrolü.

Kart, kamera önüne geldiğinde kontrollere başlanır ve herhangi bir kontrol hatalı ise makine durdurulur. OK durumunda üretim devam eder.

Barkod Kontrolü:
Kart üzerinde barkodun yeri kullanıcı tarafından önceden girilmiştir. Kontrol esnasında barkod okunur ve hafızaya alınır. Bir sonraki kart geldiğinde okunan yeni barkodun numarası hafızadaki numara ile kontrol edilerek sırasının doğruluğu tespit edilir.

Kullanıcı Artan yada Azalan şekilde sırayı belirtebilir, barkodun Tipini seçebilir ve barkodda bulunan Son-Ek’in varlığını belirtebilir. Aynı şekilde 2. barkod kontrolü de eklenebilir.

 
Pin-Puk Numaralarının Kontrolü (scratch-off kontrolü):
Pin ve Puk numalarının üzeri scratch ile düzgün şekilde kapatılması gerekiyor. Scratch’in altından numaranın gözükmesi, kenarlarında yada ortasında oluşan bir bozulma istenmemektedir.

Aşağıda bazı hatalı durumları görmektesiniz.