Processing+Arduino+WEBCAM ile görüntü renk ayrımı.
Bu proje ilk önce şeffaf sıvılarda kamera ile içerisindeki kirlilik tespit edilebilir mi? diye başladı. Öncelikle programlar arasındaki kir_bul_bardakta.pde bu amaçla yapıldı. (Programın temeli ise Volkan beyin sitesinden alındı. ) . Sonrasında ihtiyaçlarım doğrultusunda geliştirdim.
Dediğim gibi sıvı kirliliğine bakarken, aklıma RGB sensör ile yapılan projeler geldi. Sensorun görüş mesafesinin kısa olması ve pahalı olması acaba kamera ile renk tespiti yapabilir miyim sorusunu akla getirdi.
Elbette yapılabilirdi. Hem de uzak mesafeden ve çoklu çalışma da yapılabilirdi.
Bu şekilde çalışmaya başladım. Elimde sadece renk ayarı yapıldığında yakalayıp üzerine bir şekil çizen program var. Bu programı devamlı değişen şartlara göre anlık değiştirmem gerekiyordu.
O zaman içeriden yapılan tüm kontrollerin, buton, slider, drop down menü( Açılabilir menü) gibi kamera ekranının dışında olup ayarlanması gerekiyordu.
Processing birden fazla ekranı desteklese bile, tek ekranda yapmam da mümkün oldu.
Ekran 600×600 piksel olarak ayarlandı. Kamera ise biz değiştirmedikten sonra 500×500 gibi bir ekranda çalışıyordu. Kalan kısma ise bu araçlar eklendi.
Artık bu gelen bilginin işlenmesi gerekiyordu. Arduino ile haberleştirmem gerekiyordu. Arduino donanımsal seri kısmında seri monitör kullandığından, softserial kısmını PC ile haberleşme kısmına ayırdım. Bu şekilde PC ile haberleşecek ve gelen giden bilgileri seri monitörden takip edecektim.
Softserial kısmını PC ile haberleştirmek için FT232RL USB seri çevirici kullandım. Bu şekilde gelen bilgiyi ve giden bilgiyi de donanımsal seri vasıtasıyla seri monitörden izledim. ( Sizler bu izlemeyi yapmayacaksanız softserial yerine donanımsal seri portu kullanarak daha yüksek hızlarda seri haberleşme yapabilirsiniz. Gelen giden bilgileri processing ekranından da takip edebilirsiniz. )
Arduino, aşağıdaki bilgiyi aldığında Bunları index of ve sub string komutuyla , ve – işaretlerine göre böler. Bölünen değerler hala String şeklindedir. İşlem yapılabilmesi için int değere çevrilmelidir. Bunun için de String to int komutu vardır. Program içerisinde bu ayırma işlemini görebilirsiniz.
OK
217,70,83,319,277-
OK
211,70,102,186,269-
Bu bilgiler neyi gösteriyor :
217,70,83,319,277- Kırmızı,yeşil,mavi, Koordinat X, koordinat Y
Nasıl kullandım. Renk değerlerini programda kullanmadım. Fakat ilerleyen zamanlarda kullanılabilme olasılığı yüksektir. Mesela renklere biraz tolerans vererek doğru rengin algılandığını tespit edebilirim. Processing her ne kadar ayırıyor olsa da geniş bir tolerans aralığında ayırıyor. Arduino ise mesela 150-170 arası kırmızı değer varsa bunu işleme koy ya da kullanma gibi bir karşılaştırma yapabilir.
Ben ise bu arduino programında renk kısmını kullanmadım. Nasıl olsa doğru bilgi gelmiştir diyerek sadece X ve Y koordinatlarını kullandım. Yani renk seçimini processing yapıyor, malzemenin ayıklanma işini ise Arduino yapacaktı.
Bazı projelerde (RGB sensörlü) mekanizma yapmışlar. Bilya veya küpler teker teker sensör kısmına geliyor doğru kutulara gönderilmesi sağlanıyor. Ben mekanizma yapmadım ama temsili olarak koordinatlara kadar giden servo motor kullanımından faydalandım.
Servo motor kullanımı kütüphanesiz olarak yapıldı. Bu konudaki yazım buradadır.
Servo orta noktada dururken malzemenin hangi koordinatta olduğu bilgisi geldiğinde o koordinata doğru hamle yapar. Bu standart bir hamle değildir. Servo kolunun sağında bir cisim varsa sağa doğru, şayet solunda bir cisim gelmişse bunun için sola doğru hamle yapar. Bir de bunun yanı sıra cisim orta noktadan ne kadar uzaktaysa kol o kadar açıya göre gider. Bundan dolayı hem zaman kaybı önlenmiş olur hem de birden fazla olabilecek kolların birbirine çarpmaması sağlanmış olabilir.
Tabii ki bu tip projeleri, RGB sensör ile yapan kişiler, sensör pahalı olduğu için tek bir kontrol yapabiliyorlar. Fakat kamerada birden fazla görüntü işlemek mümkün olduğundan, düşüncenize göre 3-4 cisim aynı anda işleme konabilir. Bu da çoklu çalışmayı sağlayacaktır.
Bu çoklu çalışma nasıl mümkün olur. Processing programında kamera ekranında görünmez bir işaretleme alanı oluşturulur. Bu çizerek değil tabii ki. İF komutuyla karşılaştırma yaparak, işaretleme alanında olan tüm cisimler için koordinat belirlenir ve bu koordinat seri port ile arduinoya iletilir. Bundan dolayı birden fazla görünmez alan oluşturularak koordinatlar belirlenir ve arduinoya gönderilir. Mesela gönderirken
1. Bölge X,Y – 2. Bölge X,Y gibi gönderilir. O zaman arduino hangi bölgede cisim olduğunu hatta hangi bölgede hangi renk cisim olduğunu da tespit edebilir.
Doğruluk payı için ise processing cismin yerini, 30 kez bulur ve ortalamasını alarak doğru koordinatı arduinoya gönderir.
Başka bir bakış açısı. Aşağıdaki endüstriyel bant sistemine bakın. Burada bir bidon bant üzerinde gidiyor. Bidon rengi ya da üzerindeki etiket bilgisine eklenecek bir renk ile birden fazla üretimin aynı bant üzerinde gittiğini düşünün. Burada kamera bilgiyi gönderir ve o andaki enkoder bilgisini ve koordinat bilgisini de Arduino bilir. Sonrasında bu bant yürümeye devam eder. İleride mavi kırmızı yeşil diye 3 ayrı bant varsa Arduino enkoder durumuna göre ilk gördüğü mesafeden sonra hangi renk ile etiketlenmişse o bantlara bu bidonları iter. Bu şekilde kamera ve enkoder ile endüstriyel bir sistem oluşturmuş olursunuz. Aşağıdaki gibi sadece cismi tespit etmez hangi renk hangi madde gibi bilgilerine göre de tek bir bant diziliminde ayıklama yapılır. Bu da hem zaman tasarrufu sağlar Hem de hata payını önler. Aynı zamanda üretim sayıları da kameraya göre hatasız sayılacaktır.
Endüstriyel bir tasarım yapsam kameranın da hatası var mı diye düşünüp bir sensor da kameraya eşlik edecektir. Endüstri de geri bildirim çok önemlidir. Kamera hata yapıp algılamasa bile, Arduino bilgi almasa bile, sensor orada bir cisim vardı derse, o zaman bu ürünü kamera hatalı gördü ya da etiket tonu yanlış basılmış olabilir diye düşünerek göz kontrole yollamak yerinde olacaktır.
Endüstriyel makine ve kontrol sistemleri oluşturulurken bu tip problemlerin ve diğer problemlerin çıkabileceği düşünülüp önlem alınması gerekebilecektir.
Daha önceki yazılarımda anlatmıştım. Bazen ek devrelerle sistemi daha rahat kontrol edilebilecek şekle dönüştürebiliriz. Burada da büyük görüntü işleme sistemlerinin kolayca yapabileceği işleri daha düşük maliyetle yapabiliriz. Hatta bundan dolayı birden fazla yerde kullanabiliriz
Pahalı görüntü işleme sistemleri şişeyi ve bidonu algılayabilir. Biz ne yapabiliriz. Şişe dip alanı belirli olduğundan bir cisim yansımalı sensor ile dip kısmını ölçebiliriz. Kameraya ek olarak konulabilecek bir sensor bunu yapabilir. Ya da yükseklik sensoru konularak şişe farklılıkları da elde edilebilir. Her ne kadar kamera ile elde edilebilirse de, işin daha pratik olması açısından bu tip sensorlarla desteklendiğinde, çok noktalı ölçüm yapılarak sonucun daha doğru olması sağlanabilecektir.
Önemli bir nokta ise yukarıdaki resimde bidon dış ortam ışığında hareket ettiğinde ortam ışığının güneş etkisiyle değişmesi durumunda, algılama hatası yapabileceğini de göz ardı edemeyiz. Bundan dolayı, bant üzerinde kamera sisteminin bulunduğu yere bir dış ortamdan yalıtacak örtü koymak yerinde olacaktır. Ya da ölçüm kutusu diyelim. Kendi ışığına sahip olacak ve ölçüm yapılırken devamlı aynı ışık ortamı sağlanacaktır.
Işık ortamı için ışık ömrünü uzun süre kullanabilmek için enkoder bilgisiyle Arduino, malzeme kutuya girmeden ışığı açar ve sonrasında ölçüm bitince kapatabilir. Çünkü 24 saat yanan bir lamba, biz fark etmesek de ışık şiddetini azar azar yitirir. Bu sebeple farklı renk tonları elde edilip hatalara sebep olabilir.
Yukarıdaki resimde görüldüğü üzere sol taraftaki slider renk araçlarını kullanarak istediğimiz ton yakalanır ve bundan sonra aynı tip tona sahip cisimler geçer bilgisi alır. Unutmayın ki bizim gözümüz mavi gibi görse de ve ton farkını algılasa bile, ton farkını kamera daha iyi algılayıp renk ayrımı yapabilir. Bu da processing penceresinde alt tarafta renk değerlerini gösterirken belli olacaktır. Biz yeşili istemesek de slider tamamen kapansa bile, kamera o renk birleşiminde yeşil renk tonlarını yakaladıysa, bunu 0-255 arası olarak size gösterecektir.
Videoda ton farklılıklarını, Excel renk kartelası üzerinde gösterdim. Sizler de benzer testler yapabilirsiniz.
Aynı zamanda servo motorun malzemeyi nasıl işaret ettiğini görebilirsiniz. Malzeme ortaya yakın ise küçük bir derece ile hareket eder. Diğer resimde ise daha fazla dereceyle hareket ettiğini aynı zamanda sağa ve sola hareketini görebilirsiniz.
Not: Bu resimlerde koordinat bilgisini de görebiliyorsunuz. Bunu yukarıda anlattığım görünmez işaretleme sınırları belirler. Ekranın herhangi bir yerine aynı cisimden koysanız bile koordinat göremezsiniz. Mutlaka işaretli alanda olan cisimler değerlendirilir. Fakat ekranda birden fazla aynı renkten cisim varsa 1 tanesine odaklanır bazen de her birine gider. Bundan dolayı ekran üzerindeki, aynı renkli cisimlerin işaretli alanda olanlarını kontrol etmemiz gerekir.
Aşağıdaki resim ise şeffaf sıvı içerisinde bulunan yabancı maddeyi gösterir. Bu ilk program kirbul.pde dosyasına aittir.
Aşağıdaki resim ise yaptığım sistemin bağlantılarını gösterir.
Arduino servo motor kontrolü dijital 8 nolu pimdir. Servo motor +5V ve GND si Arduino üzerinden alınmıştır. Softserial ise 10 ve 11. Dijital pimlarden alınıp Usb seri çeviriciye bağlanmıştır. USB seri çeviricinin sadece Rx,TX, GND pimleri arduinoya bağlanmıştır soft serial olarak.
Webcam yok diyen, ya da eski olduğu için sorun yaşayan arkadaşlar.
Usb kameranız eski ise, renk farklılıklarında sorun yaratıyorsa, android telefonunuzu da webcam gibi kullanabilirsiniz. https://www.dev47apps.com/
Bu adresten indireceğiniz ve PC nize kuracağınız program.
Ayrıca, Android telefonunuza kuracağınız bu program ile (Free olan yeterli geliyor. yanlış seçmeyin para ödemeyin. )
https://play.google.com/store/apps/details?id=com.dev47apps.droidcam
Processing tarafından, wifi üzerinden bağlı bir kamera olarak görülebiliyor. Webcam yok ise android telefonunuzla bu programları deneyebilirsiniz.
Denediğim başka android kamera programları PC de tanınmıyor. Sadece google sayfasından IP üzerinden görebiliyorsunuz. Bunlar processing de işe yaramıyor. Fakat bu android program webcam gibi davranıp tüm kamera kullanan programlarla webcam yerine kullanılıyor. ( Belki benim görmediğim başka programlar da vardır bilemem ama bu programı denedim oluyor.)
TÜM dosyalara buradan ulaşabilirsiniz. ( Dosyalar içerisinde processing kütüphane linkleri de mevcuttur. )
Processing sitesinden kuruluma başlayabilirsiniz. https://processing.org/
En basit şekliyle yapılan program Kirbul.pde programı çalışması.
Daha geliştirilmiş haliyle projenin çalışması 1. video :
Çalışan sistemin nasıl yapıldığının açıklaması 2. video :
Bu videoda Processing kütüphane nasıl eklenir bunu bulacaksınız.