Ford’da 2 yeni Proje

Ford, Gölcükteki üretim tesislerinde 2 yeni kameralı kontrol projesi için Mavis ile çalışmaya karar verdi.

Gölcükte üretilen Ford Transit ve Connect tüm modelleri için kullanılacak olan 2 farklı kameralı kontrol projesi için ihale açan Ford, ihale sonucu firmamız ile çalışmaya karar verdi. Ford mühendisleri ile yapılan ilk analiz ve çalışma sonucu proje ayrıntıları çıkartıldı. Buna göre;

  • Ford merkezi PVS sisteminden gelen bilgiler okunacak ve bu bilgilere göre kontroller yapılacak
  • Barkod okuyucu aracın üzerindeki barkod bilgisi ile PVS sisteminden gelen bilgiyi karşılaştıracak
  • PVS sisteminden aracın özellikleri hakkında diğer bilgiler de alınacak (combi, uzun, yüksek vs.)
  • Aracın içindeki koruyucu soket başlıklarının varlık kontrolü yapılacak
  • Aracın arkasında yer alabilecek tüm logo ve yazıların (Tourneo, Transit, 110 T220, Limited vb.) yerleri, pozisyonları ve doğru modele doğru yazı takılıp takılmadığı kontrol edilecek
  • Tüm kontroller araç hat üzerinde hareket halindeyken yapılacak

Araçların farklı alt modeller için çok farklı dinamiklere sahip olabilmesi, sistemin hareketli olarak çalışacak olması, kullanıcının yeni yazı / logo tanıtabilmesi gibi özellikler projede gerçekleştirilecek olan çözümler olacaktır.

Kameralı Çoklu Karekod Okumada Geliştirilmiş Filtreleme

Mavis, Kameralı çoklu karekod okuma programını daha da geliştirerek, çok zor yüzeylerden (metal, shrink, bandajlı paketler vb.) dahi yüksek kalitede karekod okuyabilecek hale getirdi.

Mevcut versiyonu ile çoklu karekod okumada hızı ve başarı oranı ile rakipsiz olan sistem, yeni görüntü işleme özellikleri ile desteklenerek daha akıllı hale getirildi.

Mavis VYP, kameralı çoklu karekod okuma programı, özellikle ilaç paketleri gibi, üzerinde çok sayıda karekod (datamatrix) içeren paketlerde, tek seferde tüm karekodları okumaya yarayan gelişmiş bir çözüm sunmaktaydı. Geçen süre içinde çeşitli ilaç firmaları ve ecza depolarına yapılan demolar, alınan numuneler ve üretim hattında çalışan uygulamalarda genel beklenti,  shrink yada bandaj olarak ifade edilen, paketlerin üzerinde naylon olmasının getirdiği bazı güçlüklere rağmen güvenilir ve hızlı bir okuma kalitesinin yakalanması idi.

Mavis; çok farklı sektörlerdeki görüntü işleme bilgi birikimini ve optik bilgisini birleştirerek ortaya kalıcı ve %100 tutarlı bir çözüm sunmaktadır. Bu çözümün anahtar bileşenleri Mavis tarafından geliştirilen özel soft aydınlatma ve Mavis tarafından kullanılan görüntü işleme kütüphanesi (HALCON) nin avantajlarıdır.

Çoğu kez, naylon ambalaj altından okuma yapmak güçlükler içermektedir. Naylon ambalajın kat yerleri, yansıma yaparak altta kalan karekodu kapatabilir, okunmasını engelleyebilir.

Mavis, geliştirdiği özel teknikler ile bu sorunu çözmüştür.

Geliştirilmiş Görüntü İşleme Tekniklerinin Karekodlara Uygulanması

Geliştirilmiş filtreleme kullanmadan, çoklu karekod okuma yapıldığında, karekodlar net olmadığı için %100 başarı sağlanamamaktadır. Gerek shrink (naylon) ambalajın ışığı yansıtması, gerek kamera focus mesafesinin net olmaması, gerek ürünün hareketli olması gibi sebepler, görüntü kalitesini azaltmaktadır. Mavis, tüm bu etkenlere rağmen %100 okuma başarısı yakalayacak çözüm geliştirmiştir.

Sistemin başarısının özünde, gelişmiş görüntü işleme (yapay görme) tekniklerinin kullanılması yatmaktadır.

Sistem ilk olarak görüntüde kaç aday karekod olduğuna karar verir. Aday karekod sayısını belirledikten sonra, akıllı bir algoritma görüntüyü iyileştirecek filtreleri ardışıl olarak uygular ve her bir uygulamadan sonra aday karekodların tamamının okunup okunmadığını test eder. Akılı algoritma 7 farklı filtreleme ile çalışır. Her defasında görüntüyü daha da iyileştirecek parametreleri kendisi dinamik olarak seçer.

Bunu nasıl yapar?

Soldaki büyütülmüş orijinal karekod görüntüsünde, görüntünün bulanık olduğu görülmektedir. Görüntüyü netleştirmek ve siyah-beyaz ayrımını keskinleştirmek için 7 filtre ardışıl olarak uygulanır.

1. Histogram da yığılma varsa, yığılma kaldırılacak şekilde filtrasyon uygulanır. Bu filtreler : median_image, mean_image, gray_openingshape, gray_closing_rectangle, emphasize, illumination ve gen_contour_nurbs_xld fonksiyonlarıdır.

Program bu fonksiyonları, sırasıyla dener ve her denemeden sonra yeni histogram dağılımına bakar. Elde edilen yeni histogramın daha iyi olduğuna karar verirse, uygulamış olduğu son filtrasyon değerine göre yeniden karekod okumaya çalışır ve orijinal resme göre başarı oranına bakar. Eğer başarım yüzdesi artım yönündeyse, artık bu işlenmiş ve filtrelenmiş fotoğrafı baz alır ve buna göre karekodları ayırıştırır.

Histogram dağılımı iyileştirilmiş (artık gözle bile daha net bir fotoğraf elde edildiği görülmektedir) Bu yeni fotoğraf üzerinden karekod okumak artık çok daha kolay olacaktır. İşin en güzel yanı, tüm bu 7 filtreyi ardışıl olarak uygulamak, ortalama işlem gücüne sahip bir PC de bile, 500 ms. nin altında sürmektedir.

Mavis, konveyör üzerinde hareketli karekodları da okuyabilmektdir. Geliştirilen ürün, hemen her yere uyarlanabilir şekilde ve portatiftir. Daha fazla bilgi için, bizimle iletişime geçildiğinde, hazır çoklu karekodlar (ilaç kutuları) ile demo yapabiliriz.

Nereye Bakıyor Bu Adamlar

1976 yapımı, Zeki Alasya Metin Akpınar filmini burada saygıyla ve de takdirle anarak konuya girmek istiyorum.

Geçtiğimiz fuarlardan birinde, hala hatırladığım ısrarcı bir ziyaretçimiz vardı. İstediği şey “belirli bir yere bakan insanların sayısı” nı bulan bir uygulamaydı. Ziyaretçimiz, projesinin gizliliğinden ötürü olsa gerek, detaya girmekten kaçındığı için, eldeki isterlere göre bir çözüm önerememiştim. Mavis olarak elbette kameralı yapay görme sistemleri yapmaktayız ama bu tür ilginç bir alanda uygulamamız / çalışmamız yoktu.(Fuarlar en ilginç diyalogların yaşandığı yerlerdir zaten) Ve yine hatırladığım kadarıyla, yurtdışında böyle bir çözümün olduğundan bahsediyordu. Mavis olarak en çok sevdiğimiz cümle de işte budur. Eğer herhangi bir kameralı kontrol uygulaması, dünyanın herhangi bir yerinde gerçekleştirilmiş ise, Mavis bunu yapabilecek teknolojiye sahiptir. Bu durumda müşteri ne görmek istediğini bilir, ne araması gerektiğini bilir, hatta çoğu kez neyin mümkün olup, neyin mümkün olmadığını da bilir. Beklentileri de netleşmiştir. Kısaca bilinçlenmiştir ve bizim için çoğu kez bu tür müşteri bulmak kolay değildir.

Tekrar konumuza dönersek, fuarda o gün bu tür bir uygulama yapmadığımızı söylemiştim sanırım.

Şimdi sözümü geri alıyorum.

Veee distribütörü olduğumuz USB uEye XS kameralarının, yüz tanıma özelliklerinin tanıtımına başlıyorum.

Ortalama olarak yarım kibrit kutusu büyüklüğündeki bu muhteşem kamera, görüntü işleme (yapay görme) uygulamalarındaki süper performansının yanısıra yüz tanıma ile ilişkili etkileyici özellikler sunmaktadır.

Aşağıdaki resimde de göründüğü gibi, görüntüye kaç kişinin girdiği, her birinin hangi yöne baktığı, yüz merkezlerinin koordinat bilgisi ve yüzün dönme açısı (0/90/180/270) gibi bilgileri verebilmektedir. Üstelik tüm bu bilgileri kendi programlarınızdan da kullanabilirsiniz. Geliştiriciler (yazılımcılar) kamera ile birlikte ücretsiz olarak gelen gelişmiş API ile tüm kamera fonksiyonlarına kendi C++, C#, VB, Delphi vb. uygulamalarından API ya da ActiveX olarak erişebilirler.

konuyla ilgili detaylı video için bu videoyu izleyebilirsiniz.

IDS uEye kameralar için www.ids-imaging.com adresini ziyaret edebilirsiniz.

Not : Burada bahsedilen yüz tanıma, parmak izi tanıma sistemlerinde olduğu gibi yüz ile yüzün sahibini eşleştirme uygulaması değildir. Sadece fotoğraf içindeki yüzü tespit eden ve onun merkez koordinatları ile yönünü bulan bir özelliktir. Parmak izi gibi kullanılan yüz tanıma (ve kimlik bulma) sistemleri de vardır. Genelde hazır çözümlerdir ve Mavis olarak bu konuyla bir ilgimiz yoktur.

Renault’ta %100 Native Görüntüleme Sistemi ve uEye XS kamera

Mavis olarak Oyak – Renault Bursa fabrikasında yeni bir sistemi devreye aldık. Planlı duruş döneminde modernizasyon çalışması olarak adlandırılabilecek çalışmada, kameralı görüş sistemi devreye alındı.

Uygulama ile, Motor Montaj hattında, keçe varlığı kontrol edilmektedir. Bu uygulamayı diğerlerinden ayıran fark ise, Mavis tarafından Delphi ile geliştirilmiş tek ticari uygulama olmasıdır.  Mavis görüntü işleme uygulamalarını HALCON kütüphanesini kullanarak geliştirmektedir. HALCON şüphesiz en gelişmiş ve en hızlı görüntü işleme kütüphanesidir ve Mavis olarak HALCON kullanmanın avantajlarını yaşamaktayız. Buna rağmen, bu uygulama ciddi bir görüntü işleme arabirimine ihtiyaç duymuyordu. Dolayısıyla araya ilave bir katman (kütüphane, framework) sokmadan çok hızlı bir şekilde görüntü alıp genişçe bir monitörde (LCD TV) display etmek en mantıklı yöntemdi.

Projede IDS firmasının UI-1008XS marka kamerası kullanılmıştır.

son derece küçük bir tasarımı olan bu kamera mükemmel denecek kalitede sonuçlar vermektedir. Genel özellikleri :

– 8 Megapixel CMOS Sensör
– 3280×2464 çözünürlük (Snapshot Modundayken)
– 1280×720 çözünürlük (15 frame/sec realtime modunda)
– Entegre Otofokus lens
– Yüz Tanıma
– Elektronik resim stabilize etme
– EMC Regülasyonu: FCC Class B, CE Class B

gibi özelliklere sahiptir. Ortalama olarak yarım kibrit kutusu ebatlarında olduğundan, çok geniş uygulama alanlarına sahip olabilir.

Mavis olarak, Renault için ledli aydınlatma sistemi kullanmayı uygun gördük. Kameranın oto kontrast ayarını da etkinleştirip, 24 saat tüm ışık koşullarında hep aynı ışık şiddetinin ve dolayısıyla aynı görüntü kalitesinin yakalanmasını sağladık.

Delphi 2010 ile geliştirilen program, direk olarak IDS uEye API kullandığından, son derece hızlı Native bir windows uygulaması olmuştur. Kamera sürücüleri dışında hiçbir ilave program, kütüphane vb. kuruluma ihtiyaç duymayan yazılım, tüm windows uygulamalarında çalışabilecek yetenektedir ve sadece 600 KB büyüklüktedir.

Kameralı Çoklu Karekod Okuma ve SAP Entegrasyonu

İTS (İlaç Takip Sistemi) nin devreye girmesiyle birlikte İlaç üretici firmalar ve ecza depoları, Karekod lu otomasyon sistemine ağırlık vermeye başladı. Mavis, genelde el terminali ile tek tek okutmak suretiyle yapılan karekod okutma işlemine, alternatif olarak  çoklu karekod okuyucu sistemi geliştirmiştir.

SAP ile entegre çalışabilen sistem, karekod okuyuculu bir el terminalinin yapabileceğinden çok daha fazlasını sunmaktadır. Bunlar;

  • Aynı anda ve yüksek hızda çoklu (çok sayıda) karekod okuyabilme
  • Farklı yüksekliklerdeki ilaçların karekodlarını okuyabilme
  • Açık zemin üzerine koyu (dark on light) ya da koyu zemin üzerine açık (light on dark) karekodları aynı anda okuyabilme
  • Farklı boylardaki (w x h) karekodları okuyabilme
  • farklı ışık koşullarındaki karekodları okuyabilme
  • Excel, veritabanı, istatistik, rapor çıktısı alabilme
  • SAP ile %100 Entegrasyon
  • Karekod değerlerini (eğim, okuma başarısı, baskı kalitesi vb.) gösterebilme
  • Shrink ya da bandajlı (overlap) bağlı ambalajları okuyabilme
  • Dijital çıkış sinyali verebilme (Okuma başarılı / başarısız)
  • Veritabanı ya da var olan sistemle haberleşebilme (Okuyacağı karekodları önceden bilme)
  • Koli Barkodu / Kutu Barkodu üretebilme
  • 1D barkodları da (Code 39, Ean8, Ean 13 vb.) okuyabilme

gibi özelliklerdir.

(Edit : Yazılım Eylül 2010 tarihinde daha da geliştirilerek, okuma yüzdesini daha da rtırmıştır. Konu hakkında detaylı bilgi için buraya tıklayınız)

Sistem Bileşenleri :

  • Karekodların görüntüsünü almaya yarayan kamera (lar)
  • Aydınlatma Sistemi (Fluoresan ya da led ışıklandırma)
  • Windows işletim sistemi yüklü PC (netbook)
  • Mavis VYP yazılımı

Mavis Akıllı Karekod Okuma Teknolojisinin anahtar özellikleri:

Sistem 2 veya daha çok sayıda kamera ile donatılmıştır. Kameralar farklı yükseklikler ve ışık şiddetlerine göre konfigüre edilmiştir. El tipi bir okuyucuya göre çok daha geniş bir alanı, farklı yükseklikleri ve farklı tipleri tarayarak, sonuçları birleştirir ve çok kısa bir süre içinde tüm karekodları başarıyla okur.

Sistem, okuma başarısını artırmak amacıyla, okuma kalitesini beğenmemiş ise, otomatik olarak kamera pozlama süresini değiştirerek çok sayıda resim alır ve en ideal resim sonucuna göre işlem yapar.

Sonuç olarak kameraların toplam görüş alanına giren karekodların tümü başarıyla okunmuş olur.

Örnek Proje Resimleri :

Örnek Proje, Bir ilaç deposunda, konveyör üzerinde ilaç kasası içinde giden ilaçların, kamera altına geldiğinde fotoğrafının çekilmesi ve karekodlarının okunması şeklinde çalışmaktadır. 2 kamera kullanılmıştır. Her bir kamera farklı yüksekliğe focus olmuştur ve farklı konfigüre edilmiştir. Aşağıda, her iki kameradan alınan görüntüler, bu görüntülerin içerdiği karekodların okunması ve yazılımın her iki görüntüyü ortak olarak değerlendirmesi gösterilmektedir.

Solda ve hemen altında sırasıyla 1. ve 2.  kameradan alınan resimler görünmektedir. Görüldüğü gibi, birçok farklı türden ilaç kullanılmıştır. Yazılım her bir kameraya giren karekodları değerlendirecektir.

1. kamera yüksek ya da yükseğe yakın karekodları, 2. kamera ise yüzeye yakın karekodları okuyacak şekilde ayarlanmıştır. Yazılım, karekod okuma başarısı çok yüksek olduğundan, her iki kamerada da aynı karekodları okuyabilir. Mavis tarafından geliştirilen algoritmalar, iki defa okunan barkodları tespit ederek, sonuç olarak tek bir defa okuma bilgisini iletecektir.

Gerçek bir ecza deposu koşullarında yapılmış olan bu çalışmada fluoresan aydınlatma ve 1.3 MegaPizel kameralar ile yapılmıştır. Mavis, Led tabanlı aydınlatma ve 5-10 Megapixel kameralar kullanarak sistemi ürün haline getirmektedir.

Yazılım Ekran Görüntüleri (Üzerine tıklayarak görüntüyü büyütebilirsiniz) :

Motoman Robot için Yeni Parça Tanıtımı

Mavis, Teknodrom firması ile birlikte Kameralı Robot Otomasyonu sistemlerine devam ediyor.

Sistem,

  • kamera ile konveyör üzerinde hareketli parçanın pozisyon ve açı bilgilerinin hesaplanması
  • Parçanın tutulabilirliğinin tes edilmesi ve gripper tutma noktası bulunması
  • Hesaplanan bilgilerin robota iletilmesi
  • Robotun parçayı alıp istenilen yere yerleştirmesi

şeklinde çalışmaktadır. Mavis VYP programı, sınırsız sayıda parça tanıtmaya izin vermektedir.

Yeni tanıtılan parça ve ekran görüntüsü:

Mavis VYP programı, FANUC, Kuka, Denso marka robotlar ile de çalışacak kapasitededir. Haberleşme RS232 ya da Ethernet üzerinden olabilir. Kameraya önce düzgün parça gösterilerek öğretilir, sistem daha sonra aldığı diğer resimlerde bu düzgün parçayı arar ve parça robot tarafından tutulabilecek şekilde ise, koordinatlar robota iletilir.

Barkod Printer, Seri Port, USB, C# üzerine… – 2

makalenin ilk versiyonunda (http://www.mavis.com.tr/blog/?p=233) Barkod printer üzerine genel bir giriş yapmıştık.

Barkod yazıcıya anlayacağı dilden (PPLA, PPLB, ZPL ..) etiket tasarlamanın en kolay yolu, genelde barkod yazıcının kendi CD si ile birlikte gelen tasarım programını kullanmaktır. (PPLA PPLB komutlarını açıklayan PDF dosyayı buradan indirebilirsiniz)  Etiket görsel olarak istenilen şekilde tasarlanır. Yazıcıdan çıktı denemeleri alınır. En ideal etiket tasarımında karar verildikten sonra, yazıcıya gönderilecek dosyanın kaynak kodu elde edilir. Bazı programlarda PPLA / PPLB kodunu göster seçeneği var, bazı programlarda ise bunu yapmak için Windows arabiriminde “Print To File” işaretlenerek, yazıcıya göndereceği veriyi bir dosyaya yazdırması sağlanır.

Yukarıdaki resim, Zebra yazıcılar ile birlikte ücretsiz gelen ZebraDesigner programında Print To File işleminin yapılmasını gösterir. Etiket, görsel olarak istenildiği gibi tasarlanır. Yazıcıya gönderme işleminde, görsel tasarım dışında, baskı tipi (termal transfer, direk baskı – ribon-), renk doygunluğu (density) etiket boy ve boşluk bilgileri gibi başlık (Header) bilgileri de yer alır. Bunları tek tek kodlamak için ciddi bir Programmers Guide hatmedilmelidir. (Kısmen eğlenceli de olsa, çoğu kez zaman kaybından başka bişey de değildir)

“Print To File” seçeneği işaretlenerek oluşturulmuş örnek bir barkod tasarım bilgisi :

Q160,019
q831
rN
S1
D7
ZT
JB
OD
R335,0
N
GW104,104,6,48,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿ¿
A152,24,2,2,1,1,N,"ZD:01.01.10"
A152,48,2,2,1,1,N,"QC:235-167"
A152,72,2,2,1,1,N,"01.06.2010"
A152,96,2,2,1,1,N,"03L131051BH"
P1

ilk başta yer alan satırlar (1..10 arası) barkodun başlık bilgileri, geri kalan yazılacak verilere ilişkin koordinatlar ve data ları içerir. GW ile başlayan satır, etikette bir grafik olduğunu gösterir. Bu örnekte ben grafik kullandım, çünkü C# içinden  grafiği düzgün bastırabilmek için kodda bazı düzenlemeler yapmak gerekmektedir.

Gerçek hayatta, her barkod üzerindeki bilgiler değişeceği için, etiketin üzerindeki bu bilgileri de değiştirerek yazıcıya göndermek gerekmektedir. Bu yüzden orijinal etiket dosyasını aşağıdaki gibi değiştirdim.

Q160,019
q831
rN
S1
D7
ZT
JB
OD
R335,0
N
GW104,104,6,48,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿ¿
A152,24,2,2,1,1,N,"*LINE1*"
A152,48,2,2,1,1,N,"*LINE2*"
A152,72,2,2,1,1,N,"*LINE3*"
A152,96,2,2,1,1,N,"*LINE4*"
P1

amacım; ** arasında geçen değişkenleri *LINE1* gibi, program ile RunTime anında değiştirebilmek.

Bunun için, Print To File yaparak elde ettiğim dosyayı, edit edip (not defteri vb. bir programla) yukarıdaki gibi düzenleyerek, bildiğim bir yere (diyelim ki C:\PrnTmp klasörüne) bildiğim bir isimle (mesela Template.prn) kaydedelim.

Şimdi, bu dosyayı okuyup, dinaik olarak değiştirip yazıcıya gönderen C# kodum aşağıdaki gibi olacaktır.

		public void PrintBarcode(String L1, String L2, String L3, String L4)
		{
			String tempFile = "C:\\PrnTmp\\Template.prn";
			String PrinterName = "ZDesigner TLP 2844";
			StreamReader SR = new StreamReader(tempFile, Encoding.Default);
			String all = SR.ReadToEnd();
			SR.Close();

			all = all.Replace("*Line1*", L4);
			all = all.Replace("*Line2*", L3);
			all = all.Replace("*Line3*", L2);
			all = all.Replace("*Line4*", L1);

			RawPrinterHelper.SendStringToPrinter(PrinterName, all);

		}

Bu rutin, verdiğim 4 değişkeni orijinal barkod tasarımında yerine koyar ve bu verdiğim değerlere göre barkod basar.
Grafiklerin doğru basılabilmesi için, StremReader nesnesi, Encoding.Default parametresi ile çağırılmalıdır.

Buradaki, RawPrinterHelper USB bağlantı üzerinden direk barkod basan sınıfın adıdır. Bir sonraki makalede bu sınıftan bahsetmeyi düşünüyorum. Tabii, seri ya da paralel port üzerinden yazıcıya erişmek için bu sınıfı kullanmaya gerek olmadığını belirtmeye gerek yok sanırım.

Makalenin son bölümünde, bu sınıf açık kaynak kodu ile birlikte yer almaktadır.

Makalenin Son Bölümü : Bölüm – 3

VYP ye bir standart kontrol daha eklendi

Mavis, Kameralı Kontrol yazılımı VYP ye, yeni bir standart kontrol daha ekledi : “Araparça Boy ve Yükseklik Ölçümü”.

Standart kontrol, kullanıcı tarafından görsel olarak parametreleri değiştirilmek suretiyle uyarlanabilen kontrollerdir. Mavis VYP, Standart kontroller (alan bulma, var-yok kontrolleri, pozisyon kontrolleri, renk kontrolleri vb.), Gelişmiş kontroller (karekod, ocr vb.) ve projeye özgü kontrollerden oluşmaktadır.

Araparça Boy ve Yükseklik Ölçümü :

Karmaşık parçalar grubunda belirli özellikleri bilinen bir parçanın seçilip, en boy yükseklik gibi değerlerinin ölçülebilmesine yarar.

Son yapılan ilave değişiklikle birlikte (01.07.2010) araparça ölçümünde döndürme işlemi, sonda değil başta yapılmaktadır. Böylece Clip Region (sp_eliminate_run) işlemi daha sağlıklı değer verdiğinden daha hassas ölçüm mümknü olmaktadır.

Yukarıdaki şekilde, mavi dörtgen içindeki civatanın boyunu ölçmeye çalışalım. Normalde mavi dörtgen içine, hem civata hem de somun girdiğinden, ilave kontroller yapılmaksızın sadece civatayı ölçmek mümkün değildir. Mavis VYP ye yeni eklenen “Araparça Ölçüm” kontrolü ile görsel olarak programlama yapmaksızın bu kontrol bildirilebilmektedir.

Şekilde görüldüğü gibi, Araparça kontrolü kullanılarak, somun ve civatadan oluşmuş şeklin sadece  civata kısmının boyu ölçülebilmektedir.

Görev Parametreleri

  • Standart ReduceDomain İşlemi
  • Standart ApplyThreshold İşlemi
  • Standart ApplySelection İşlemi
  • Clip değişkeni : ölçülecek araparçanın min ve max Run değeri (bu değerler arasındaki parçalar dikkate alınır)
  • CheckHeight : Yükseklik ölçümü isteniyorsa bool 1 (yes, on, ok, evet değerlerinden biri) kullanılır
  • CheckWidth : Genişlik ölçümü isteniyorsa kullanılır
  • CheckLong : Uzun kenar ölçümü isteniyorsa (en ya da boy, hangisi daha büyükse)
  • CheckShort : Kısa kenar ölçümü isteniyorsa (en ya da boy. hangisi daha kısaysa)
  • RHeight : minHeight..maxHeight arası değer (beklenen geçerli yükseklik değeri. CheckHeight değeri 1 ise anlamlı)
  • RWidth : minWidth..maxWidth arası değer (beklenen geçerli genişlik değeri. CheckWidth değeri 1 ise anlamlı)
  • RLong : minLong..maxLong arası beklenen uzun kenar değeri. (CheckLong değeri 1 ise anlamlı)
  • RShort : minShort..maxShort arası beklenen kısa kenar değeri. (SheckShort değeri 1 ise anlamlı)

alt programın HALCON ve C# kodlarını edinmek ve yorum yapmak için, blog sitesinde veya bizimle (info@mavis.com.tr) yazışabilirsiniz.

Mavis Targovishte’de

Mavis Yapay Görme Ekibi, Bulgaristan Targovishte deki bir tesiste, kameralı kontrol kurulumu için yerinde çalışmalar yaptı. 1 gün boyunca süren çalışmalarda, üretim esnasında ve laboratuvar ortamında birçok farklı tip ürün üzerinde çalışılarak sonuca varıldı. Yapılan çalışmalar, proje sahibine rapor olarak sunulacaktır. Proje gerçeklenme aşamasında, daha detaylı bilgi verilecektir.

Mavis, Bugün Bulgaristanda kurulumunu yaptığı bir diğer proje olan robot kontrollü kameralı kontrol sisteminin kontrol ve iyileştirme çalışmalarına devam etmektedir.

VYP ye Yeni Bir Standart Kontrol

Mavis VYP Kameralı Kontrol Yazılımı standart kontrollerine yeni bir tane daha eklendi : Parça Yönelimi.

Mavis VYP de, kameralı kontroller 3 gruba ayrılır.

  • Standart Kontroller
  • Projeye Özgü Kontroller
  • Gelişmiş Kontroller

Bir projenin sadece standart kontroller kullanılarak gerçeklenmesi en ideal durumdur. Projeye özgü kontroller bazı durumlarda kaçınılmaz olabilir. VYP, standart kontrol setini zenginleştirerek Projeye özgü kontrolleri olabildiğince minimuma indirgemiştir.

Standart kontrol kullanmanın avantajları

  • Kod yazımına gerek kalmaz
  • Defalarca test edilmiş olduğundan hatalara açık değildir
  • İyi Dökümante edilmiş ve eğitimlerde anlatılmış olduğundan kullanıcılar kolay uyum sağlar
  • Modüler / parametrik  olduğundan zahmetsizce uyarlanabilir
  • Güncelleştirmeler veya arayüz iyileştirmelerinden var olan tüm kurulumlar ek işlem yapılmaksızın yükseltilmiş olur

Parça Yönelimi :

Bu kontrol, sıkça karşılaştığımız “ters yönde takılmış” parçaları yakalamaya yarar. Kullanıcı arayüzü oldukça basittir.

Zorunlu kullanıcı seçimleri

  • bağlantı noktası (_juncPoint)
  • parçanın doğrultusu (_partDirection) Yatay / Dikey
  • parçanın beklenilen yönelimi (_expectingOrientation) Sol / Sağ / Üst / Alt

Opsiyonel kullanıcı seçimleri

  • Yaklaşma dörtgeninin kenar uzunluğu (_juncHeight) Varsayılan Değer : 10

Böylece sadece 3 seçimle birlikte kullanıcı parçanın olması gereken yönü sisteme kolayca bildirmiş olur.

(VYP Parça Yönelimi İçeren Kontrolleri Çalıştırıyor)

VYP Ekranında %800 zoom edildiğinde, parçanın yönelimi görülüyor.

Yönelim kullanıcının beklediği doğrultuda ise yeşil ok, aksi halde kırmızı ok (ters istikamete) ekranda belirecektir.


Yeni kontrolün C# kodlaması :

 

		private bool CheckDirection(JobDefs job)
		{

			if (masterFailed)
			{
				DrawCurrentRoi(job, false);
				return false;
			}

			HObject ho_ImageReduced;
			HObject ho_Region, ho_SelectedRegions, ho_Open, ho_Rect;
			HTuple hv_R1, hv_C1, hv_R2, hv_C2;

			bool retval = false;

			// Initialize local and output iconic variables 
			HOperatorSet.GenEmptyObj(out ho_ImageReduced);
			HOperatorSet.GenEmptyObj(out ho_Region);
			HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
			HOperatorSet.GenEmptyObj(out ho_Open);
			HOperatorSet.GenEmptyObj(out ho_Rect);

			ho_ImageReduced.Dispose();
			if (imagesource.ReduceJobDomain(job, out ho_ImageReduced))
			{
				ho_Region.Dispose();
				imagesource.ApplyThreshold(job, ho_ImageReduced, out ho_Region);

				if (job.ValDouble("area") > 0)
				{

					ho_SelectedRegions.Dispose();
					imagesource.ApplySelection(job, ho_Region, out ho_SelectedRegions);

					int openR = job.VarInt32("OpeningRadius", 1);
					ho_Open.Dispose();
					HOperatorSet.OpeningCircle(ho_SelectedRegions, out ho_Open, openR);

					imagesource.DisplayObj(ho_Open, "blue");

					// Yaklaşma Bölgesini oluşturalım
					HOperatorSet.SmallestRectangle1(ho_Open, out hv_R1, out hv_C1, out hv_R2, out hv_C2);
					int tutamac = job.VarInt32("_juncPoint", 3); //L R U D
					int rHeight = job.VarInt32("_juncHeight", 10); // Yaklaşma Dörtgeninin Yüksekliği
					int yonelim = job.VarInt32("_partDirection", 0); // Horizontal, Vertical
					int beklenenYon = job.VarInt32("_expectingOrientation", 0); // L R U D

					if (tutamac == 0) // Soldan tutturulmuş				
						HOperatorSet.GenRectangle1(out ho_Rect, hv_R1, hv_C1-rHeight, hv_R2, hv_C1);
					else if (tutamac == 1) // Sağdan tutturulmuş				
						HOperatorSet.GenRectangle1(out ho_Rect, hv_R1, hv_C2, hv_R2, hv_C2 + rHeight);
					else if (tutamac == 2) // Üstten tutturulmuş				
						HOperatorSet.GenRectangle1(out ho_Rect, hv_R1 - rHeight, hv_C1, hv_R1, hv_C2);
					else if (tutamac == 3) // Alttan tutturulmuş				
						HOperatorSet.GenRectangle1(out ho_Rect, hv_R2, hv_C1, hv_R2 + rHeight, hv_C2);

					imagesource.SetColor("yellow");

					ho_ImageReduced.Dispose();
					HOperatorSet.ReduceDomain(imagesource.Image, ho_Rect, out ho_ImageReduced);

					ho_Region.Dispose();
					if (imagesource.ApplyThreshold(job, ho_ImageReduced, out ho_Region))
					{
						double yRow = job.ValDouble("row"); // yaklaşma Row
						double yCol = job.ValDouble("column"); // yaklaşma col

						HOperatorSet.DispCross(imagesource.DisplayHandle, yRow, yCol, 12, 0);

						if (yonelim == 0) // Yatay bir parça ise
						{
							double pC1 = TupleToDbl(hv_C1);
							double pC2 = TupleToDbl(hv_C2);

							double lFark = Math.Abs(pC1 - yCol); // merkez ile sol noktanın farkı
							double rFark = Math.Abs(pC2 - yCol); // merkez ile sağ noktanın farkı

							//imagesource.SetColor("blue");
							if (beklenenYon == 0) // Soldan bekleniyor
							{
								retval = lFark > rFark; // Solda bekleniyordu, geldi.
								imagesource.SetColor(retval ? "green" : "red");
								if (retval)
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, yRow, hv_C1, 1);
								else
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, yRow, hv_C2, 1);

							}
							else if (beklenenYon == 1) // Sağdan bekleniyor
							{
								retval = rFark > lFark;
								imagesource.SetColor(retval ? "green" : "red");								
								if (retval)
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, yRow, hv_C2, 1);
								else
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, yRow, hv_C1, 1);
							}
						} 
						else  // Dikey Parça
						{
							double pR1 = TupleToDbl(hv_R1);
							double pR2 = TupleToDbl(hv_R2);

							double uFark = Math.Abs(pR1 - yRow); // merkez ile üst noktanın farkı
							double dFark = Math.Abs(pR2 - yRow); // merkez ile alt noktanın farkı

							if (beklenenYon == 2) // Üstte bekleniyor
							{
								retval = uFark > dFark;
								imagesource.SetColor(retval ? "green" : "red");
								if (retval)
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, hv_R1, yCol, 1);
								else
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, hv_R2, yCol, 1);
							}
							else if (beklenenYon == 3) // Altta bekleniyor
							{
								retval = dFark > uFark;
								imagesource.SetColor(retval ? "green" : "red");
								if (retval)
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, hv_R2, yCol, 1);
								else
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, hv_R1, yCol, 1);
							}

						}
						PutLog(job, retval, "Parça Beklenen Yönde " + (retval ? "Geldi" : "Gelmedi"));
					}

				}
				else RedLog(job, "Seçili Bölg Bulunmamadı!");
			}
			else RedLog(job, "ROI indirgenemedi!");

			ho_ImageReduced.Dispose();
			ho_Region.Dispose();
			ho_SelectedRegions.Dispose();

			int compela = job.VarInt32("Complement", 0);
			if (compela == 1) retval = !retval;

			if (!retval)
			{
				DrawCurrentRoi(job, retval);
				int masterJob = job.VarInt32("MasterJob", 0);
				if (masterJob == 1)
					masterFailed = true;
			}

			return retval;
		}