Windows için Kinect SDK

kinect   PDC 10’da yapılan Kinect demolarından beri beklediğim bir gelişmeydi Windows için Kinect Yazılım Geliştirme Kit’inin (SDK) beta sürümünün yayınlanması. Özellikle de MVP Summit 2010’da da birebir kullanma şansı bulduktan sonra daha da iştahla bekler olmuştum. Nihayet geçtiğimiz haftalarda beklemem sona erdi ve Kinect for Windows SDK yayınlandı. Şimdilik sadece Windows 7 sürümlerinden (x86 ve x64) ve ticari olmayan kullanımlar için kullanabileceğiniz bu sürümü http://fth.by/kinectsdk adresinde bulabilirsiniz. C++ desteğiyle unmanaged geliştiricileri hedef alan SDK’da C# ve VB.Net desteği ile de managed geliştiriciler unutulmamış. Managed bir geliştirici olarak yazımın devamında örneklerimi C# üzerinden veriyor olacağım.

   Kinect için yazılım geliştirebilmek adına bilgisayarınızın sahip olması gereken bir grup minimum gereksinim bulunmakta. Bu gereksinimler;

  • Windows 7 (x86 veya x64)
  • Çift çekirdek 2.66 GHz veya üzeri işlemci
  • Windows 7 uyumlu ve DirectX 9.0c destekli bir ekran kartı
  • 2 GB hafıza
  • Visual Studio 2010 Express veya üzeri sürümleri
  • ve tabi ki USB/güç kaynağı adaptörü bulunan bir Kinect sensor

Konuşma özelliklerini kullanabilmek için;

   Her ne kadar yazılımsal olarak neler yapabileceğimizi anlatmakta sabırsızlansam da, Kinect ile yapabileceklerimizi daha iyi anlayabilmek adına öncelikle donanımsal olarak Kinect’i tanımamızda fayda olacaktır.

Kinect Mimarisi

   Kinect’i paketinden çıkardığınızda göreceğiniz en belirgin özelliği ön tarafında yer alan 3 adet göz olacaktır. Bu üç gözden sağ ve sol taraftakiler 3 boyutlu derinliği algılamakta kullanılan sensorlar iken ortada yer alan göz ise RGB görüntü alabilen bir kameradır. 3 boyut verisi için kullanılan iki gözden soldaki  lazer projeksiyonu ile veri toplarken, sağdaki ise kızıl ötesi ışınları toplamaktadır.

image

   Kinect’in ön alt bölümünden bir seri mikrofon yerleşik bulunmakta, bu sayede de farklı konumlardaki sesler rahatlıkla algılanabildiği gibi aynı zamanda ortamdaki sesi  bozan etkenleri saf dışı bırakması için yeterli girdiyi de alabilmektedir.

   Bir destek üzerinden yer alan Kinect’in üst bölümü, bu destekte yer alan motor mekanizması sayesinde dikeyde +/-28 derece hareket edebilmektedir. Her ne kadar bir uygulama aynı anda Kinet’in birden fazla sensorunu kullanabiliyor olsa da, aynı anda sadece bir uygulama Kinect’i kullanabilmektedir.

Kinect Yazılım Mimarisi

   Kinect, sensorları vasıtasıyla topladığı verileri ses, görüntü ve derinlik akışı olarak iletmektedir. Bu veriler Doğal Kullanıcı Ara yüzü (Natural User Interface, NUI) kütüphanesince yorumlanarak uygulamalara iletmektedir. RGB kamera tarafından alınan görüntüler tahmin edilenin aksine video olarak değil resimler olarak iletilmektedir. Görüntü akışı 640×480 ve 1280×1024 olmak üzere iki farklı çözünürlükte iletilmektedir. Bu iki çözünürlükte ise saniyede sırasıyla 30 ve 15 çerçeve veri akışı olmaktadır. RGB kamera verisinin video olarak değil de resim olarak iletilmesinin en önemli sebebi programsal olarak işlenebilmesini önemli ölçüde kolaylaştırmaktır. Bir dizi olarak yerleştirilen mikrofonlar sayesinde Kinect, akustik kanyak konumlandırması (örneğin sesin hangi yönden geldiği) ve istenmeyen sesleri (prazitleri) azaltma gibi yeteneklere sahip olmaktadır. Kinect’in en önemli özelliklerinden birisi olan derinlik algısı ise  derinlik akışı üzerinden gelmektedir. Derinlik veri akışı sayesinde her bir pikselle gelen iki boyutlu x-y pozisyon ve renk bilgisi dışında derinlik bilgisi de alınabilmektedir. Derinlik bilgisi her piksel ile birlikte 16 bit olarak sunulmakta ve 320×240 ile 80×60 çözünürlükleri desteklemektedir. Veri içeriği Kinect’in ne şekilde ilklendirildiğine bağlı olarak değişmektedir;

  • Salt derinlik bilgisi için ilklendirilmesi durumunda; 16 bitlik verinin low-order 12 bit’i (0-11) derinlik sensoruna en yakın nesnenin milimetre cinsinden uzaklığı göstermektedir. Geri kalan 4 bit ise kullanılmamaktadır.
  • Derinlik ve oyuncu indeksi bilgisi için ilklendirilmesi durumunda; 16 bitlik verinin low-order 3 bit’i (0-2) bu piksele denk gelen ve takip edilen bir iskelet bulunması durumunda bu iskeletin indeks bilgisini vermektedir. Geri kalan bit’ler ise derinlik sensoruna en yakın nesnenin milimetre cinsinden uzaklığı göstermektedir.

  Alınan derinlik bilgisi sayesinde çok daha iyi ve doğru şekil algısı algoritmalarının yazılabilmesine imkan sunmaktadır.

   Kinect, sensorları vasıtasıyla gelen bilgiler sayesinden bir insanın 3 boyutlu olarak hareketlerini yakalayabilmekte, yüzünü ve sesini tanımlayabilmektedir. Bu bilgiler sayesinde aynı anda 6 kişiyi takip edebilen Kinect, bu 6 kişi içerisinden ise aynı anda sadece ikisi üzerinde hareket analizi yapabilmekte ve bu iki kişinin her birinin vücudundaki 20 kesişim noktasına ait bilgileri verebilmektedir. Kinect tarafından takip edilebilen bu 20 kesişim noktasının nereler olduğunu (Kinect yazılarında paylaşılması bir klasik olduğu üzere) aşağıdaki Leonardo da Vinci’nin Vitruvius Adamı (Vitruvian Man) üzerinde görebilirsiniz;

Vitruvius Adamı üzerinden Kinect kesişim noktaları

   Aşağıda, pek çoğunuzun çıktısını alarak baş ucunda tutacağınıza inandığım, Vitruvius Adamı üzerinde gösterdiğim kesişim noktalarını programsal olarak belirtmekte kullanılan JointID enum’unde yer alan değerleriyle bir Kinect iskeletini bulabilirsiniz;

JointID enum değerleri ile kesişimlerin belirtildiği bir Kinect iskeleti

    Kinect’in iskelet algılaması ile ilgili düşülmesi gereken önemli bir nokta da, en etkin ve doğru ölçümleri 1.2 metre ile 3.5 metre arasında yapabildiğidir. Derinlik akışı kadar Kinect’in güçlü olduğu bir diğer nokta olan iskelet takibi ve kesişim bulma oldukça hızlı çalışmaktadır. Bu hızının yanında herhangi bir eğitim gerektirmemesi de önemli bir artıdır.

   Kinect hakkında bu kadar teorik bilgi sanırım yeterli olacaktır; fakat kodlamaya geçmeden önce geliştirme ortamını hazırlamamız gerekli. Yazımın başlarında Kinect için uygulama geliştirmek için gerekli olan donanım ve uygulamalardan bahsetmiştim. Bilgisayarınızın bu isterleri karşılaması sonrasındaki adım Kinect SDK’sını indirmek olmalı. SDK kurulum ardında gerekli olan sürücüler sistemimize yüklenmiş olacağından artık Kinect’i bilgisayarımıza rahatlıkla bağlayabiliriz.

Kinect bağlantı kablosu

   Eğer Kinect’iniz XBOX 360 ile birlikte geldiyse bu noktada önemli bir problemi fark edeceksiniz; Kinect’inizin kablosu bilgisayarınızın USB girişi ile uyumlu değil!

Kinect güç adaptörü

   Bu durumda Microsoft tarafından satışa çıkartılmış olan yukarıdaki güç adaptörünü ($34.99) almanız gerekecektir. USB bağlantı noktası ve harici güç kaynağından oluşan bu adaptör sayesinde Kinect verileri bilgisayarınıza iletirken, ihtiyacı olan gücü de sağlayabiliyor olacaktır. Her ne kadar Kinect bir kısım güç ihtiyacını USB kablosu üzerinden alabiliyor olsa da buradan gelen enerji tüm fonksiyonalitelerin çalışması için yeterli olmayacaktır.

Kinect Sensor   Eğer Kinect sensor’ü ayrı olarak satın almış iseniz size güzel bir haberim var; harici bir güç adaptörü almanıza gerek yok. İhtiyacınız olan her şey gelen paket içerisinde bulunacaktır.

Şimdi, ellerimizi koda bulaştırma zamanı… Bir Kinect uygulaması geliştirirken ilk yapmanız gereken Microsoft.Research.Kinect.dll kütüphanesini referans olarak eklemek olmalı. İkinci adım ise projenizin platform hedefinin x86 olduğuna emin olmak. SDK x86 olarak çalıştığı için x64 ya da AnyCPU olarak derlenen uygulamalar çalışmayacaktır.

   Uygulamanız içerisinde NUI API’sini kullanacağınız durumlarda;

using Microsoft.Research.Kinect.Nui

   Ses API’sini kullanacağınız durumlarda ise;

using Microsoft.Research.Kinect.Audio

  şeklinde ilgili using satırlarını eklemelisiniz.

   Tüm bu adımlar ardından, Kinect ile etkileşimde kullanmak üzere Runtime nesnesi ilklendirilmelidir. Bu nesne ilklendirilirken uygulamanızın Kinect’i hangi amaçla kullanacağını belirtmek üzere Initialize fonksiyonu ilgili parametrelerle çağırılmalıdır. Örneğin, aşağıdaki kod yardımıyla Kinect çalışma zamanı derinlik, görüntü akışını almak ve iskelet takibi için ilklendirilecektir;

kinect = new Runtime();
kinect.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseColor);

   Şimdi adım adım görüntü, derinlik akışını okuma ve derinlik bilgilerini kullanmayı görelim. Görüntü akışını başlatmak için, öncelikle hangi formatta görüntü almak istediğimizi belirtmemiz gerekli;

kinect.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);

    Bu kod parçacığıyla; görüntü akışını sırasıyla video formatında, önbellekte 2 resim olacak şekilde 640×480 çözünürlükte ve renkli olarak almak istediğimizi belirtmekteyiz. Yazımın başlarında  görüntü için iki çözünürlük seçeneğimiz olduğundan bahsetmiştim : 640×480 ve 1280×1024; fakat çözünürlüğün Kinect’in performansında doğrudan bir etkisi olması nedeniyle gerekmemesi durumunda 1280×1024 çözünürlüğü kullanmamanızı tavsiye ederim. Görüntü akışının açılmasını takiben gelen veriyi yakalayabilmek için VideoFrameReady olayını dinliyor olmalıyız;

kinect.VideoFrameReady += kinect_VideoFrameReady;

private void kinect_VideoFrameReady(object sender, ImageFrameReadyEventArgs e) {
   //gelen görüntü burada işlenecek
}

Görüntü verisi

   Görüntü akışına benzer şekilde derinlik bilgisine ulaşılması da mümkündür. Aynı görüntü akışında olduğu gibi derinlik için de öncelikli olarak akışın başlatılması, ardından olay bildirimine abone olmak gerekli;

kinect.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
kinect.DepthFrameReady += kinect_DepthFrameReady;

private void kinect_DepthFrameReady(object sender, ImageFrameReadyEventArgs e){
   //Gelen derinlik bilgisi burada işlenecek
}

Görüntü verisi

   Yukarıdaki kod parçacığında; derinlik akışı sırasıyla, derinlik akışı formatıyla, önbellekte 2 resim olacak şekilde 320×240 çözünürlükte ve derinlik ile oyuncu indeksi bilgisini almak istediğimizi belirtmekteyiz.

    Görüntü ve derinlik akışına ulaşmadaki kolaylık iskelet takibi için de sunulmakta. Dikkat edilmesi gereken tek nokta; iskelet takibi için öncelikle derinlik veri akışının açılmış olması gereğidir. Ardından aşağıda kodla iskelet takibi verisine ulaşmanız mümkün olacaktır;

kinect.SkeletonFrameReady += kinect_SkeletonFrameReady;

private void kinectNui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) {
   //Gelen veri burada işlenecek
}

İskelet verisi

   Son olarak; aşağıda Kinect üzerinde yazılım geliştirmeye başladığınızda karşılaşabileceğiniz bazı hatalar ve çözüm önerilerini bulabilirsiniz;

  • Runtime.Initialize çağrıldığında InvalidOperationException hatası alınması : Kinect cihazınızın bilgisayarınıza bağlı ve güç adaptörünüz prize takılı olduğundan emin olun.
  • VideoStream.Open / DepthStream.Open çağrılarında InvalidOperationException hatası alınması : Runtime.Initialize çağrısı sırasında doğru parametreleri verdiğinize, birbirleri ile uyumlu değerlere sahip olduklarına emin olun.
  • Uygulamanızı test ederken INuiInstanceHelper.dll bulunamadı hatası alınması : Kinect SDK’sının kurulumu sırasında Visual Studio’nun açık olması kaynaklı alınan bir hatadır. Tüm açık Visual Studio uygulamalarını kapatıp sonrasında projenizi yeniden açmanız sonrasında problem düzelecektir.

   Bir giriş yazısı için yeterince detaylı bilgi verebildiğimi umuyorum. Devam makalelerimde görüntü, derinlik, iskelet takibi ve ses verilerinin işlenmesi konusuna daha detaylı değiniyor olacağım.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir