Resim ve Region döndürmek, görüntü işleme uygulamalarında çok sık karşılaşılan bir durumdur. Aşağıdaki kod, en yalın döndürme örneğidir. (HALCON da farklı alternatifler de mevcut olmakla birlikte)
Resim ve Region döndürmek, görüntü işleme uygulamalarında çok sık karşılaşılan bir durumdur. Aşağıdaki kod, en yalın döndürme örneğidir. (HALCON da farklı alternatifler de mevcut olmakla birlikte)
Bursa’da Robot entegratörü olarak çalışan iROB firması ile birlikte, Robot destekli %100 ölçüm esasına dayalı hassas ölçüm uygulamamız için ilk çalışma yapıldı.
Sistemin Çalışması
iROB tarafından kullanılan DENSO robot, hat üzerindeki soketleri alıp kameraya gösterecek, kamera bu esnada gerekli ölçümleri yapıp parçanın uygun olup olmayacağını belirleyecek.
Sistemin Zorlukları
Yapılan ön çalışmada, burada bahsedilen zorluklar aşılmış, hassas ölçüm için telecentrik lens ve 1.3 MP kamera kullanılmıştır. Alınan resimler incelendiğinde istenen hassasiyet değerlerine ulaşıldığı görülmüştür.
Yaprakların sağlam ya da hatalı olup olmadığının ayıklanmasında istenenler
gibi kontrollerdir.
bu kontrollerin gerçekleştirilmesinde, her birinde farklı yaklaşım söz konusu olabilir. İyi bir görüntü işleme algoritması ile bu kontroller yapılabilir. Kullandığımız yöntemlerden biri, yaprağın sol tarafı ile sağ tarafı arasındaki simetrinin aranmasıydı.
Yaprağın sol ve sağ tarafının bulunması :
Basit Yöntem
Elde edilen 2 region dan, üstte olan yaprağın sol kısmı, allta olan sağ kısmını verir.
Bu yöntemin dezavantajı, yaprağın sol ve sağ tarafı tam simetrik değilse (genelde de olmaz) tam ortadan bölünmüş dörtgen, yaprağı tam ortadan ikiye bölmüş olmaz.
Gelişmiş Yöntem :
Sonuçta, burada işi yapan asıl fonksiyon skeleton dur. skeleton fonksiyonunun yaprak resmine uyarlanmış hali, neredeyse yaprağın ortasından geçen damar ile aynı yolu izlemektedir.
Projenin tamamında, kameralı yaprak ayrıştırması (kameralı yaprak kontrolü) ile hızlı bir şekilde yaprakların sağlam olup olmadığı algılanabilmektedir.
Mavis olarak, son zamanlarda her zamankinden daha fazla ölçüm sistemi talebiyle karşılaşmaktayız. Üretici firmalar, daralan kar marjını sıfıra yakın hata oranlarıyla sübvanse edebileceklerinden, eskiye göre daha çok kalite kontrol ve ölçüm uygulamalarına yer vermeyi düşünüyor olmalılar. Hızlı ve hassas ölçüm dendiğinde, kameralı ölçüm sistemleri en cazip alternatif olarak görünmektedir. Mavis olarak, %100 ölçüm ve kontrol esasına dayalı görüntü işleme uygulamaları geliştirdiğimizden, var olan çözümlerimizi megapixel telecentric lens ve yüksek çözünürlükte kamera kullanarak hassas ölçüm yapabilecek şekle getirdik. Yine kendi geliştirdiğimiz USB IO modülü ile PLC ya da konveyör gibi dış ortamlarla haberleşmek te hızlı ve basit bir hale indirgendi. En önemlisi, ölçüm gibi nokta altı hassasiyet (subpixel precision) gerektiren durumlarda, HALCON un gücünü kullanan çözümlerimiz, müşteri tarafından beklenen tolerans değerlerine uyabilmemizi sağladı.
Dağınık Kalsın
Ölçüm yapmadan önce, ölçülecek parçanın açısal olarak dönmüş vaziyette olması, görüntü işleme ile ilgilenenlerin genelde pek hoşuna gitmeyen bir durumdur. Açısal olarak dönmüş bir parça üzerinden ölçüm yapılacak ise 2 farklı çözüm sözkonusu olabilir. Parçayı x yada y eksenine göre dik/yatay olacak şekilde (0 ya da 90 derece) döndürmek (ki bu durumda resim kalitesinden (en azından teorik olarak) feragat etmek gerekiyor) ya da parçanın halihazırdaki konumu üzerinden ölçüm yapmak.
HALCON ile her iki durumda da ölçüm yaptığımda aynı sonucu elde ettim. Zaten HALCON ölçüm için gen_measure_rectangle2 kullanıyordu ki, dönmüş prçanın dönüş açısını belirleyip (orientation_region) rectangle2 bu açıya göre verilirse, sistem zaten direk açısal dönmüş ölçümü yapacaktı. Dolayısıyla, dönmüş parçalar için hom_mat2d_rotate, affine_trans_image vb. komutlarla uzun uzadıya uğraşmaya gerek kalmamış olur. Ben yine de uğraştım. Denedim. Aynı sonucu verdiğini gördüm. (Beklenmeyen bir durum da değil ama yinede deneyip görmek daha ikna edici oluyor… Tıpkı şimdi measure_pairs ve gen_rectangle2_contour_xld kullanmak arasında fark olmayacağını göreceğim gibi…)
VYP Programında, Kamera ayarlarının (pozlama sürese, çalışma frekansı, fps oranı vb…) programa bildirildiği arabirime ini File dan yükleme özelliği eklendi.
Önceki versiyonlarda, Klasör ya da Kamera şeklinde olabilen seçeneklere son olarak ini File seçeneği eklendi. Sahadaki çalışmalarda, görüntü alma işlemleri genellikle uEye kamera programlarından olan uEye Demo ile gerçekleştirilmekte, daha sonra oradaki değerler VYP programına bildirilmekteydi. Şimdi 2 işi tek bir defada yapabilmek için, uEye kamera ayarlarını direk olarak yükleme seçeneği eklendi. Bunun en büyük avantajı IR Filter, Red Gamma Gain, Hotpixel Correction vb. tüm değişkenleri VYP içinden de ayrıca set etme zorunluluğunu ortadan kaldırması oldu. (Aksi halde Kamera üreticisinin sağladığı tüm fonksiyon seti için ayrı bir arayüz yapmak gerekecekti. Bu da neredeyse imkansız bir iş)
Son olarak, ini file yüklendikten sonra, kullanıcı isterse VYP üzerinden ayarları dilediğince değiştirebilecek. Örneğin ini file olarak yüklenen dosyada pozlama değeri 23.07 ise, kullanıcı bunu 24.01 gibi bir değere çektiğinde, tüm diğer ayarlamalar ini file dan gelmek kaydıyla, sadece pozlama değeri yeni değerine göre set edilmiş olacak.
Sonuçta uEye Demo ile alınan görüntünün birebir aynısı VYP içinden de alınmış oluyor.
ini File üzerine
ini file, en eski windows versiyonlarından beri oldukça yaygın olarak kullanılmaktaydı. Birçok program geliştirme ortamı (VB, Delphi, VS…) ini file işlemleri için API sunuyorlardı. Zamanla ini file yerini önce registry kaydına, daha sonra özellikle .NET yaygınlaşmasıyla birlikte xml dosyalarına bırakmıştır. (Dolayısıyla VS gibi .NET tabanlı güncel IDE ler daha az api desteği sunmaktadır) Buna rağmen ini File, gerek eskiyle uyum, gerek basit oluşu yüzünden hala güncelliğini ve yaygınlığını korumaktadır.
Aracın gövdesi üzerine yazılı VIN numarasını, 2 mt. kadar yüksekten okuyup OCR etme işi, gerçektende zorlu bir çalışmadır. (Mavis olarak nadiren telaffuz ettiğimiz bir kelime olmakla birlikte) Ford’da ki proje, sadece VIN (şase numarası) okunması işlemi değil, yazım kalitesinin (ve tabi doğruluğunun) da tesbit edilmesi işlemi idi.
75 mm. lens, 1.3 MP ethernet kamera, elektronik balast ve fluoresan aydınlatma ile kurduğumuz setup sonrası aldığımız ilk fotoğraflar, düşündüğümüz kadar zorlanmayacağımız sonucunu çıkardı. Gerçektende HALCON default OCR fonksiyonları ile bile, %90-95 lik bir başarı yüzdesi yakalanmıştı. Kendi öğreteceğimiz karakter setleri ile, bu oran %100 e çıkarılabilirdi.
Bugün, pratik – güçlü – akıllı bir OCR arayüzünü VYP içine entegre etmeyi düşünüyorum. Son zamanlarda OCR ile ilgili çok talep olduğundan tüm projelere uyarlanabilir olması gerekiyor.
Ford da PVS sisteminden gelen verilerin algılanması sağlandı. USB Seial converter şeklinde çalışan cihaz bazı sorunlar çıkarttı. İlginç olarak PCI slot üzerinden Serial connector olarak çalışan cihaz gayet düzgün çalıştı. (Kurulum seri portu olan bir PC de olduğu için böyle bir sorun yaşanmayacaktı)
Görünüşe göre, OCR işleminde de pek bir sorun çıkmayacak. Sonuçta başlangıçta hayli zor görünen, yürüyen hat üzerinden Şase no okuma işlemi düşündüğümüz kadar uğraştırmayacak.
Ya da biz artık OCR konusunda çok fazla yol katettik ve görüntü işleme ile ilgilenen birçok firmanın teklif bile vermek istemediği konular, bizim için neredeyse hazır çözüm durumunda.
Bugün, 4 yıldan daha uzun bir süre önce kurmuş olduğumuz bir projeye güncelleme yapmak gerekti. En başta projede değişiklikler yapabilmek (yazılımı re-compile edebilmek) için HALCON 7.1 i yeniden kurmak gerekti. Bunun için (ne olur ne olmaz) HALCON 8.1 ve HALCON 9.0 sürümlerini bilgisayarımdan kaldırdım. Kurulum yapıldıktan sonra, istenen değişikliklere göre modifiye edilmiş versiyonu derleyip çalıştırdım. Neyseki herşey yolunda gitti. Projede Native .NET kütüphaneleri yerine COM+ teknolojisi kullanılmıştı. Aslında değişen çok bir şey olmuyor. Nihayetinde aynı HALCON DLL leri çağırılıyor. Yine de en azından kodlama kalitesi olarak Native .NET yazılımı çok daha güçlü. Hiç değilse, değişken tanımlarını yapabiliyorsunuz. COM+ kulanımının gerektirdiği object kullanımı başta kullanışlı gelse de, VB programcısı değiliz ya, bir C# programcısı her değişkeni kendi tipinde tanımlamak ister. Değişken tanımlamada kişisel olarak takıntılı olduğumu kabul ediyorum. Name Condition olarak Pascal Case kullanımından, Camel Case kullanımına geçmek bile benim için zordu. Bir de bunlara sürekli boxing (type cast) işleçlerini eklemek hepten eziyet.
Neyseki tüm bunlar COM ile birlikte geçmişte kaldı da nadiren eski projelere destek vermek dışında günlük hayatta pek karşımıza çıkmıyorlar.
Bugünkü proje için Sabah 7:30 gibi yola çıktım. Bursa’ya gittim. Çalışma 3 saat sürdü. Renault Yeni Megane ve Fluence modelleri için fren kapağı tasarımları ve kontrolleri programa bildirildi. Programın exe si (uygulaması) yanı sıra UserControl modülü için DLL güncellemesi yapıldı. (MyViewControl isimli DLL i de güncellemek gerektiğini bulmam pek kolay olmadı) Mevcut kontrollere ilaveten Aktif ROI de, Intensity kontrolü de ekledim. Böylece farklı kapağın hattan kazara geçme şansı iyice sıfıra yaklaştı.
Birkaç saatliğine de olsa, HALCON 7.1 ile çalışmak zorunda kaldığımda, MVTec firmasının özellikle 7.1 – 8.0 geçişinde HDevelop tasarımında devasa yol katettiğini yeniden farkettim. Aynı geliştirme sürecini 8.0 dan 9.0 a geçişte söylemek pek mümkün değil. Bu durum artık görsel olgunluğa erişildiği şeklinde yorumlanabilir belki. Yine de bir sonraki versiyonu merakla bekliyorum.
Teknodrom firması ile birlikte geliştirilen bu projede amaç; konveyör üzerinde rastgele pozisyonda gelen parçaların, robot tarafından alınıp belirlenen bir yere yüklenmesini sağlamaktı. Daha önceden Teknodrom’da Emrah Hünerlitürkoğlu ile birlikte bilgisayar – robot arası seri protokol üzerinden haberleşme arabirimi geliştirmiştik. Elimizde hazır olduğu için aynı protokolü kullanarak bu projeye devam ettik. (İlerleyen aşamalarda, ethernet üzerinden haberleşmeye geçecektik.)
Projeye başlamadan önce, Teknodrom parçaları yakalamak için özel olarak Gripper geliştirdi. Projenin ilk gününde, Mavis tarafından Emre, Teknodrom tarafında Emrahla birlikte sistemin çalışacağı ortamı oluşturup, ilk fotoğrafları aldı. Gelen fotoğrafları inceleyip daha iyi bir sonuç almak için kamerayı ve lensi değiştirdik. Nihai setup (kurulum) sağlandıktan sonra, gerçek sistem üzerinde çalışılmaya başlandı.
2. gün ben yazılım üzerinde ben çalışmaya devam ederken, Emrah gripper ile manual olarak nesneleri yakalamaya çalıştı. Sonuçta yazılım gerekli koordinatları bulacak, gripper ise sorunsuz çalışacak hale getirildi. Artık yapılması gereken bilgisayar ile robotu konuşturmaktan ibaretti. Bu konuda en çok vakit harcadığımız nokta, yakalanacak nesnelerin farklı farklı olmasından dolayı her birinin tutma noktasının kendine özgü koordinatlar içeriyor olmasıydı. Boru şeklindeki parçayı farklı, dirsek şeklindeki parçayı farklı pozisyonlardan yakalamak gerekiyordu. Sonuçta her parça için sanal yakalama noktası belirleyip yazılımın bu sanal noktaya göre koordinatları robota iletmesiyle sorun çözüldü. (Müjdat Bey’in soruna el atmasıyla 🙂 )
Projenin 3. günü gece yarısı, tüm sistem sorunsuz ve seri olarak çalıştı. Böyle bir proje için 3 gün rekor derecede kısa bir süre sayılabilir. Daha önceden Mavis ve Teknodrom firmalarının birlikte çalışmış olmasının getirdiği avantajları kullandık. Elimizde hazır çözümlerimiz vardı. Yine de en önemli faktör, Mavis ve Teknodrom firmalarının kendi alanlarındaki profesyonelliklerinde yatıyordu. Kamera Kontrollü Robot Otomasyonu, böylece hayat bulmuş oldu. Yorgun geçen 3 günün sonunda sistemin daha da efektif çalışması için bazı iyileştirmelere karar verildi. Robotun daha hızlı çalışmasını sağlamak için, robot hareketini sürdürürken bilgisayarla konuşabilmesi (paralel processing) yapılacaktı. Bu değişiklikler PC tarafında da benzer bazı değişiklikleri gerektiriyordu. Robotla hem seri port üzerinden hem de digital Input / output (24V) modül üzerinden haberleşiliyordu. Bu durum, Hem robotun, hem PC nin senkronize olmasını gerektiriyordu ki, tamamıyla hareketli bir sistem üzerinde bu senkronizasyonu sorunsuz sağlamak pek kolay olmadı.
Tüm sistem, saat 10:30 gibi müşteriye demo kurulum olarak gösterilecekti. Sabahın erken saatlerinde paralel processing denemeleri yapıldı. Eğer bir sorun çıkarsa, zaten çalışan bir versiyon elimizde vardı. Bu garantiyle, son dakikaya kadar paralel processing denemelerine devam edildi. Nihayet demo başladığında, sistem kısaca tanıtılıp robot PLAY modunda çalıştırıldı.
Sonuç başarılıydı. Nihayetinde bu bir demo sistemdi ve amacına ulaşmıştı. Bundan sonra yapılması gereken, sistemi daha da iyileştirmekti.
Bugünlerde bu iyileştirmeler üzerine çalışmaktayız.
Bunlar genel olarak;
Kullanılan Bileşenler :
Sistemin Çalışması :
Projenin Zorlukları :
Proje Geliştirme Sürecinden Resimler