OpenCV & Raspberry Pi

 HEDEFLER
1) Trafik ışıklarını algılayıp o an yanmakta olan ışığın rengine göre dur/geç konusunda karar veren,
2) Önündeki araçla arasındaki mesafeyi koruyabilen,
3) Yol çizgilerine sadık kalan,
…(eklenebilir ya da değiştirilebilir hedeflerle) hareket edecek bir araç.

AŞAMA -1-     (30.09.2017)
İlk aşama olarak Ağustos-Eylül (2017)  süreci daha çok araştırmaya dayalı geçti.
OpenCV kütüphanesini projemiz için verimli ve yeterli buldum. Bu süreçte aynı zamanda raspberry pi ile tanıştım. Aklımdaki fikir ikisini bir araya getirmekti.


Neden Raspberry Pi?

Raspberry Pi, kredi kartı büyüklüğünde ve oldukça uygun fiyata sahip bir bilgisayardır.  “Mini Bilgisayar” kavramı kendisine çeken ilk kavram oldu. Kullanım alanının çokluğu ikinci tercih nedenim.
O yüzden temel bilgisayar işlevlerini kullanabilirsiniz. Örneğin tarayıcısını kullanarak internete girebilir, videolar izleyebilir, müzik dinleyebilirsiniz.
Raspberry Pi, LibreOffice’i rahatlıkla çalıştırabiliyor.
GPIO portları ile sensörler bağlamanız ve sıcaklık, duman, yakınlık/uzaklık, ses vs. ölçmeniz ve işlemeniz mümkün.
Bununla birlikte motorlar bağlayarak hareket ettirebilmek de mümkün.
Aynı zamanda Raspberry Pi’yi düşük güç tükettiği için tekrarlayan ya da basit ama uzun işleri yaptırmak için kullanabilir, sürekli açık bir sunucu haline getirebilirsiniz. Örneğin dosya indirmek, USB’deki dosyalarınıza internet üzerinden erişmek gibi.

Öncelikle cihazın donanımına bir bakalım:
Raspberry Pi 3 Özellikleri:
·         Broadcom BCM2837 chipset 1.2 Ghz 4 çekirdekli ARM Cortex-A53 işlemci (64bit mimariyi destekliyor)
·         VideoCore IV 3D çift çekirdekli çoklu ortam/grafik işlemcisi. (OpenGL ES 2.0 desteği)
·         1 GB LPDDR2 bellek (RAM)
·         Dahili 802.11n WiFi (Kablosuz ağ bağlantısı)
·         Bluetooth 4.1 (Bluetooth LE)
·         SD kart yuvası
·         4xUSB 2.0 bağlantısı
·         1xHDMI çıkışı (ses çıkışını destekliyor)
·         1×3.5mm kulaklıklık çıkışı
·         1x Ethernet portu
·         Ekran (DSI) ve kamera (CSI) bağlantısı için destek
·         40 pin GPIO portları
·         MicroUSB güç girişi (maks 2.5A @ 5V)

Kutu İçeriği ve Diğer Gereksinimler

Kutunun içeriğinden elektrostatik poşet içeresinde Raspberry Pi 3 ve güvenlik/kullanım bilgileri dışında hiç bir şey çıkmıyor.

Maliyet

Raspberry Pi 3 modeli yurt dışında 30 £ civarı satılıyor. Hem fazla beklememek hem de gümrük ve vergi masraflarından kaçınmak için Türkiye’den almak daha mantıklıydı.Biz 138TL’ye denk aldık. Ülkemizdeki robot ve elektronik satan internet sitelerinden kolaylıkla temin edilebilmekte.
8 GB Class 10 MicroSD tercih ettik 15-20TL. Kullanımınıza bağlı olarak daha yüksek kapatiseli ve hızlı kartlara da yönlenebiliriz
Cihazı beslemek için telefon ya da tablet adaptörlerini kullandık.

Yazılım ve Desteklenen İşletim Sistemleri

Raspberry Pi için hazırlanan ve resmi olarak desteklenen yazılım Raspbian, yani Raspberry + Debian.
Oldukça hafif olan bu işletim sistemi Pi için optimize edilmiş ve hafifletilmiş bir Linux dağıtımı.
Bununla birlikte biraz daha gelişmiş ve bilgisayara yakın arayüz arayanlar için Ubuntu MATE‘in Raspberry Pi 3 ve 2 için hazırladığı sürümler öneriliyor. Bu sürümler daha görsel ve masaüstü kullanımı için daha kolay, yazılım depoları da biraz daha geniş.
Snappy Ubuntu Core ise daha çok server gibi kullanım için geliştirilmiş ve Canonical tarafından hazırlanan Ubuntu dağıtımı.
Bununla birlikte Windows 10 IoT sürümü de Raspberry Pi ile destekleniyor. Ancak bu sürümden alıştığımız Windows arayüz ve uygulamalarını çalıştırmayacaktır.
Bununla birlikte OpenELEC veya OSMC gibi ortam merkezi ve medya kutusu olarak çalıştırabilecek işletim sistemleri de mevcut.
Ayrıca AndroidAndroid TV ve Chromium OS üzerine çalışan geliştiriciler de mevcut. Ancak bu sistemler hem tam optimize değil hem de Pi’nin kullanım amacından biraz uzak.
Biz RASPBIAN kurduk.
Sensörler ve motorları da kontrol edebilecek biraz da veri işleyebilecek bir IoT aracı/geliştirme kiti olarak oldukça makul özelliklere sahip.


Raspberry pi kullanımında üç yöntem gördüm; 
1) HDMI kablosu ile bir monitöre raspberry pi' ı bağlayarak klavye ve mouse ile kullanacağımız NetBeans, VS, Dev++ gibi bir IDE üzerinde OpenCV kullanarak raspberry pi'ı direkt mini bir bilgisayar gibi kullanabiliriz. 
2) Uzak masaüstü programı kullanarak da erişebiliriz.
3) Benim tercihim olan son yöntem ise; monitöre ihtiyaç duymadan (çünkü monitörümüz yok) direkt laptopta yazmak. Normalde Linux'un kendisi bir IDE'ye (NetBeans gibi) ihtiyaç duymadan da ufak güncellemelerle C/C++ gibi dillerdeki kodları derleyebilir. Sadece OpenCv Library'lerini indirip birkaç ayar yapmak yeterliymiş o yüzden. Ayrıca raspberry pi kendi bilgisayarımız gibi performanslı bir makine değil. Kendi bilgisayarımızdan yazmak daha mantıklı geldi. 

Raspberry Pi Kamera(D)

Kamera olarak ilk denemeler için kendi orijinal kamerası olan WaveShare firmasının ürettiği, Raspberry Pi orjinal kamera modülü ile uyumlu CSI konektörü üzerinden bağlanan kamerasını tercih ettim; Raspberry Pi Kamera(D)



Özellikler:
·         Tüm Raspberry Pi modelleri ile uyumludur
·         5 megapiksel OV5647 sensör, sabit odaklı lens modülü
·         CCD boyutu: 1/4 inç
·         Kamera çalışma gerilimi 3-5V'dur. 
·         Diyafram (F): 2.8
·         Odak uzaklığı: 3.37mm
·         Görüş açısı: 72.4 derece
·         İdeal çözünürlük: 1080p
·         Kamera flat kablosu 60V'u desteklemektedir. 
·         2592 × 1944 fotoğraf çözünürlüğü
·         1080p30, 720p60 and 640x480p60/90 video kaydedebilme
·         Boyutlar:  25mm x 24mm x 9mm


Neden OpenCV?
OpenCV (Open Source Computer Vision) açık kaynak kodlu görüntü işleme kütüphanesidir. 1999 yılında İntel tarafından geliştirilmeye başlanmış daha sonra Itseez, Willow, Nvidia, AMD,  Google gibi şirket ve toplulukların desteği ile gelişim süreci devam etmektedir. İlk sürüm olan OpenCV alfa 2000 yılında piyasaya çıkmıştır. İlk etapta C programlama dili ile geliştirilmeye başlanmış ve daha sonra birçok algoritması C++ dili ile geliştirilmiştir. Open source yani açık kaynak kodlu bir kütüphanedir ve BSD lisansı ile altında geliştirilmektedir. BSD lisansına sahip olması bu kütüphaneyi istediğiniz projede ücretsiz olarak kullanabileceğiniz anlamına gelmektedir.  OpenCV platform bağımsız bir kütüphanedir, bu sayede Windows, Linux, FreeBSD, Android, Mac OS ve iOS platformlarında çalışabilmektedir. C++, C, Python, Java, Matlab, EmguCV kütüphanesi aracılığıyla da Visual Basic.Net, C# ve Visual C++ dilleri ile topluluklar tarafından geliştirilen farklı wrapperlar aracılığıyla Perl ve Ruby programlama dilleri ile kolaylıkla OpenCV uygulamaları geliştirilebilir.



OpenCV kütüphanesi içerisinde görüntü işlemeye (image processing) ve makine öğrenmesine (machine learning) yönelik 2500’den fazla algoritma bulunmaktadır. Bu algoritmalar ile yüz tanıma, nesneleri ayırt etme, insan hareketlerini tespit edebilme, nesne sınıflandırma, plaka tanıma, üç boyutlu görüntü üzerinde işlem yapabilme, görüntü karşılaştırma, optik karakter tanımlama OCR (Optical Character Recognition) gibi işlemler rahatlıkla yapılabilmektedir.

 

OpenCV Bileşenleri

OpenCV kütüphanesini daha iyi anlamak için mimarisinden ve OpenCV’yi oluşturan bileşenlerden bahsetmek istiyorum.
  • Core: OpenCV’nin temel fonksiyonları ve matris, point, size gibi veri yapılarını bulundurur. Ayrıca görüntü üzerine çizim yapabilmek için kullanılabilecek metotları ve XML işlemleri için gerekli bileşenleri barındırır.
  • HighGui: Resim görüntüleme, pencereleri yönetme ve grafiksel kullanıcı arabirimleri için gerekli olabilecek metotları barındırır. 3.0 öncesi sürümlerde dosya sistemi üzerinden resim dosyası okuma ve yazma işlemlerini yerine getiren metotları barındırmaktaydı.
  • Imgproc: Filtreleme operatörleri, kenar bulma, nesne belirleme, renk uzayı yönetimi, renk yönetimi ve eşikleme gibi neredeyse tüm fonksiyonları içine alan bir pakettir. 3 ve sonra sürümlerde bazı fonksiyonlar değişmiş olsada 2 ve 3 sürümünde de bir çok fonksiyon aynıdır.
  • Imgcodecs: Dosya sistemi üzerinden resim ve video okuma/yazma işlemlerini yerine getiren metotları barındırmaktadır.
  • Videoio: Kameralara ve video cihazlarına erişmek ve görüntü almak ve görüntü yazmak için gerekli metotları barındırır. OpenCV 3 sürümü öncesinde bu paketteki birçok metot video paketi içerisindeydi.
Tüm OpenCV modülleri için http://docs.opencv.org/3.0-beta/modules/refman.html adresine göz atabilirsiniz.

Alternatif Görüntü İşleme Kütüphaneleri

Görüntü işleme projelerinizde kullanacağınız kütüphaneyi amacınıza uygun olarak seçmeniz önemlidir. Bu seçimi yaparken ne yapmak istediğinize doğru karar vermelisiniz, örneğin sadece kameradan (usb, ip vs.) görüntü almak için projenize OpenCV entegre etmenize gerek olmayabilir. Bu gibi durumlar için ve OpenCV’nin neden iyi olduğunu anlayabilmek amacıyla alternatif olarak görüntü işleme kütüphanelerine de bakalım.
  • MATLAB: Matlab için bir görüntü işleme kütüphanesi olarak bahsetmek doğru değildir fakat içerisinde görüntü işlemeye yönelik temel algoritmaları barındırmaktadır.Dördüncü nesil ve çok amaçlı bir programlama dilidir. Akademik araştırmalarınızda, performansın önemli olmadığı durumlarda temel görüntü işlemleri için tercih edebilirsiniz.Matlab kullanarak OpenCV Kütüphanesi ile etkileşimli olarak da uygulamalarda geliştirmek mümkündür.
  • Halcon: Endüstriyel projeler için tercih edilen, kendi içerisinde geliştirme ortamının yanı sıra çeşitli programlama dilleri (C, C++, VS C++, C#, VB.NET) için kütüphanesi bulunan, yapay görme (machine vision) odaklı ticari bir yazılımdır. İçerisinde birçok hazır fonksiyon bulundurur bu sayede hızlı uygulamalar geliştirilebilir. OpenCV açık kaynak kodlu, ücretsiz bir kütüphanedir ve computer vision odaklıdır.Bu yönleri ile Halcon’dan ayrılmaktadır.
  • OpenFrameworks: Açık kaynak olarak geliştirilen bu kütüphane C++ programlama dili için geliştirilen bu proje OS X, Linux, Embedded Linux (ARM), iOS, Android platformlarında çalışabilmektedir. OpenCV kütüphanesinin bir çok algoritmasını kullanır ve temel çıkış amacı kolay ve hızlı uygulama geliştirmektir. Örneğin OpenCV ile 2t sürede gerçekleştirdiğiniz bir işi 1t sürede gerçekleştirebilirsiniz, bunun temel sebebi ise bir çok fonksiyonu aracılığıyla standart hale getirilmiş olan işleri tek satır ile yapabilmesidir (Nesne tespiti,takibi renk belirleme, karşılaştırma vb.).
  • CIMG: Açık kaynak kodlu bir görüntü işleme kütüphanesidir. Windows, Linux ve OS X platformu üzerinde çalışmaktadır. Sadece C++ dili için desteği bulunmaktadır fakat yazılmış wrapperlar ile Java ve Python ile de uygulama geliştirilebilmektedir. Birçok algoritmayı barındırmaktadır fakat OpenCV kadar performanslı ve geniş bir algoritma altyapısına sahip değildir.
  • Fiji: Java platformu için geliştirilmiş açık kaynak kodlu GPL lisansına sahip bir görüntü işleme kütüphanesidir. Windows, Linux ve MAC OSX Intel 32-bit veya 64-bit üzerinde çalışır. Bilimsel görüntü analizi için geliştirilmiştir. Genetik, hücre biyolojisi, nöro-bilim gibi alanlar için özelleştirilmiş algoritmalara sahiptir.
Endrov, ImageJ, Lead tools, Pink, Image Magick, Boost ise görüntü işleme kütüphanelerinden bazılarıdır.


Yorumlar

Bu blogdaki popüler yayınlar

Python ile Görüntü İşleme Örnekleri

İlişkisel Veritabanı Modeli