Facebook RSS Feed
 
Kinect & Leap Motion: Kinect 103: İskelet Yapısına Ulaşım
Tarih: 23.07.2012, Platform: .NET 4.0, IDE: Visual Studio 2010, Level: 100



Kinect'in öne çıkan en etkileyici özelliği, şüphesiz iskelet yapımızı tanımlamasıdır. Windows için tasarlanan Kinect, aynı anda 2 kişiye ait 20 eklem noktasının 3 boyutlu pozisyonunu ve eklemler arası açıyı uygulamamıza rapor eder. Kinect 103 çalışmamızda, eklem pozisyonlarına ulaşmanın üzerinde duracağız.

Öngereksinimler

Kinect ile uygulama geliştirmek için, www.kinectforwindows.com adresinden Kinect SDK'yı indirip kurmanız gerekiyor. Temel bilgiler için önce Kinect 101 yazımıza göz atabilirsiniz.

Çalışma Mantığı

İskelet yapısının algılanmasında, Kinect'in üzerindeki lazer projektörü ve algılayıcısı görev alır. Projektör, görüş açısına sürekli lazer ışını gönderir. Algılayıcı ise, ışığın yansıma hızını hesaplayarak derinlik görüntüsü çıkarır. Kinect'in içerisindeki görüntü işleme algoritması ile iskelet yapısı oluşturulur.

Kinect, bir kişiye ait 20 eklem noktasının X, Y ve Z koordinatlarını uygulamamıza rapor eder. Aynı anda 1 yada 2 kişinin iskelet yapısına ulaşılabilir. 6 Kişinin de hareketi belirlenerek, örneğin, en aktif yada merkeze en yakındaki kişinin takibi sağlanabilir. Algılanan iskelet bilgisi, saniyede 30'a kadar tetiklenen eventler ile uygulamamıza iletilir.

Algılanan Eklemler

İskelet bilgisi içerisinde bulunan eklem noktaları aşağıdaki gibidir:

- - Head: Baş
- Shoulder Center: Boyun
- Shoulder Left: Sol Omuz
- Shoulder Right: Sağ Omuz
- Elbow Left: Sol Dirsek
- Elbow Right: Sağ Dirsek
- Wrist Left: Sol El Bileği
- Wrist Right: Sağ El Bileği
- Hand Left: Sol El
- Hand Right: Sağ El
- Spine: Karın
- Hip Center: Kuyruk Sokumu
- Hip Left: Sol Kalça
- Hip Right: Sağ Kalça
- Knee Left: Sol Diz
- Knee Right: Sağ Diz
- Ankle Left: Sol Ayak Bileği
- Ankle Right: Sağ Ayak Bileği
- Foot Left: Sol Ayak
- Foot Tight: Sağ Ayak

Uygulama

Geliştireceğimiz örnek uygulamada, sağ ve sol elimizin  X, Y ve Z koordinatlarına ulaşmanın üzerinde duracağız. Ardından; baş, boyun, omuz ve el pozisyonlarımızı göstereceğiz.

Performans ve görsellik açısından, Kinect uygulamalarında WPF kullanımını tercih ediyoruz. Yeni oluşturacağımız WPF uygulamamızın proje referanslarına "C:\Program Files\Microsoft SDKs\Kinect\v1.5\Assemblies" klasöründe yer alan "Microsoft.Kinect.dll" dosyasını ekleyerek, Kinect özelliklerine uygulamamızdan erişeceğiz.

Adım 1: Ellere Ait Parametrelerin Gösterimi

İlk uygulamamızın amacı, sağ ve sol elimizin 3 boyutlu koordinatlarını göstermek olacak. Kinect, her bir eklemin X ve Y koordinatını -1 ile 1 arasında double değeri olarak raporlar. İlgili eklem, görüş açısının en solundayken -1, ortasındayken ara değerleri ve en sağındayken de 1 değerini alır. Z değeri de, eklemin Kinect'e kaç metre uzaklıkta olduğunu gösterir. Örneğin, "1.60245" değeri, sensörden 1.6 metre uzakta olduğumuzu gösterir.

Öncelikle uygulamamızın arayüzüne birkaç label ekleyeceğiz. Her label, bir pozisyonun değerini gösterecek. ("Sağ El X" gibi.)

[XAML] MainWindow.xaml

<Window x:Class="Kinect103_SkeletonTracking.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Kinect 103: İskelet Görünümü" Height="522" Width="660" WindowStartupLocation="CenterScreen"
        Loaded="Window_Loaded" Closing="Window_Closing">
    <Grid>
        <!-- Sağ ve sol ele ait parametreler burada gösterilecek -->
        <Label Name="label1" Content="Sol El:" FontSize="15" HorizontalAlignment="Left" Margin="6,4,0,0"
               VerticalAlignment="Top" />
        <Label Name="label2" Content="X:" FontSize="15" HorizontalAlignment="Left" Margin="61,4,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSolElX" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="89,4,0,0"
               VerticalAlignment="Top" Width="56" HorizontalContentAlignment="Right"
               Foreground="#FF003DFF" />
        <Label Name="label3" Content="Y:" FontSize="15" HorizontalAlignment="Left" Margin="156,4,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSolElY" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="184,4,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
        <Label Name="label4" Content="Z:" FontSize="15" HorizontalAlignment="Left" Margin="250,4,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSolElZ" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="278,4,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
        <Label Name="label5" Content="Sağ El:" FontSize="15" HorizontalAlignment="Left" Margin="6,24,0,0"
               VerticalAlignment="Top" />
        <Label Name="label6" Content="X:" FontSize="15" HorizontalAlignment="Left" Margin="61,24,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSagElX" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="89,24,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
        <Label Name="label7" Content="Y:" FontSize="15" HorizontalAlignment="Left" Margin="156,24,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSagElY" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="184,24,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
        <Label Name="label8" Content="Z:" FontSize="15" HorizontalAlignment="Left" Margin="250,24,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSagElZ" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="278,24,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
    </Grid>
</Window>

Daha sonra, uygulamamızın Kinect ile haberleşecek kodlarını ekleyeceğiz. Özetleyecek olursak,
- "Window_Loaded" eventi içerisinde Kinect'i başlatıyoruz.
- Hareket yumuşatma parametrelerini tanımlayarak SkeletonStream'i açıyoruz.
- İskelet pozisyonlarını yakalayacağımız "Kinect_SkeletonFrameReady" eventini oluşturuyoruz.
Hareket yumuşatma parametreleri ("TransformSmoothParameters"), eklem hareketleri algılanırken oluşabilen titremeleri filtreler ve daha düzgün hareketlere ulaşmamızı sağlar. (Bu parametreleri ilerleyen yazılarımızda detaylandıracağız.)

Bu yapılandırmadan sonra, Kinect her iskelet hareketi işlediğinde, "Kinect_SkeletonFrameReady" eventini tetikler. İskelet algılama hızına göre saniyede 0 ile 30 arasında rapor hızı değişir. (Görüntü ve derinlik verisiyle eş zamanlı değildir.)

Uygulamamızda, tetiklenen eventin argümanları aracılığıyla önce "OpenSkeletonFrame" metoduyla algılanan tüm iskeletlerin verisini elde edeceğiz. Bu iskeletler arasından ilk algılananı seçerek, eklem verisine ulaşacağız. Örneğin, sağ elimizin X pozisyonuna, "skeleton.Joints[JointType.HandRight].Position.X" kodu ile ulaşarak, double türünden değerini elde edeceğiz.

Uygulamamızı sonlandırırken de, "Window_Closing" eventi içerisinde "Stop" metodundan yararlanarak Kinect'i durduracağız.

Bu işlemleri yaparak ellerimizin pozisyon değerlerini gösterecek uygulama kodu aşağıdaki gibi olacak:

[C#] MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using Microsoft.Kinect;
 
namespace Kinect103_SkeletonTracking
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        // Tüm tanımlanan iskeletlere ait veriyi tutacak iskelet dizisi
        private Skeleton[] skeletons = new Skeleton[6];
 
        // Takip edilecek ve işlenecek iskelet
        private Skeleton skeleton;
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // Kinect bağlıysa, belirtilen parametrelere göre ilk Kinect'i yapılandır
            if (KinectSensor.KinectSensors.Count > 0)
            {
                // Hareket yumuşatma parametreleri
                TransformSmoothParameters tsp = new TransformSmoothParameters();
                tsp.Smoothing = 0.55f;
                tsp.Correction = 0.1f;
                tsp.Prediction = 0.1f;
                tsp.JitterRadius = 0.4f;
                tsp.MaxDeviationRadius = 0.4f;
 
                // Sisteme bağlı ilk Kinect'i başlat
                KinectSensor.KinectSensors[0].Start();
 
                // İskelet verisi akışını belirtilen hareket yumuşatma parametrelerine göre başlat
                KinectSensor.KinectSensors[0].SkeletonStream.Enable(tsp);
 
                // İskelet verisi güncellendiğinde tetiklenecek eventi oluştur
                KinectSensor.KinectSensors[0].SkeletonFrameReady
                    += new EventHandler<SkeletonFrameReadyEventArgs>(Kinect_SkeletonFrameReady);
            }
        }
 
        private void Kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            try
            {
                // Gelen iskelet verisini skeletons dizisine kopyala
                if (e.OpenSkeletonFrame() != null) e.OpenSkeletonFrame().CopySkeletonDataTo(skeletons);
 
                // İlk algılanan iskeleti seç
                skeleton = (from s in skeletons
                           where s.TrackingState == SkeletonTrackingState.Tracked
                           select s).FirstOrDefault();
            }
            catch (Exception)
            {
                // Hata oluşursa skeleton'un parametrelerini temizle.
                // Bu frame'de veri işlemesi yapmayacağız.
                skeleton = null;
            }
 
            // İskelet algılanmışsa:
            if (skeleton != null)
            {
                // Ellere ait pozisyon bilgisini işle:
                PozisyonGoster(skeleton);
            }
        }
 
        /// <summary>
        /// Ellere ait X, Y ve Z pozisyonlarını gösterir.
        /// </summary>
        /// <param name="skeleton">İskelet yapısı</param>
        private void PozisyonGoster(Skeleton skeleton)
        {
            // Sağ elin X, Y, Z pozisyonlarını göster:
            lblSagElX.Content = skeleton.Joints[JointType.HandRight].Position.X.ToString("0.000");
            lblSagElY.Content = skeleton.Joints[JointType.HandRight].Position.Y.ToString("0.000");
            lblSagElZ.Content = skeleton.Joints[JointType.HandRight].Position.Z.ToString("0.000");
 
            // Sol elin X, Y, Z pozisyonlarını göster:
            lblSolElX.Content = skeleton.Joints[JointType.HandLeft].Position.X.ToString("0.000");
            lblSolElY.Content = skeleton.Joints[JointType.HandLeft].Position.Y.ToString("0.000");
            lblSolElZ.Content = skeleton.Joints[JointType.HandLeft].Position.Z.ToString("0.000");
        }
 
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // Uygulama kapanmadan Kinect'i durdur.
            if (KinectSensor.KinectSensors.Count > 0)
            {
                foreach (KinectSensor sensor in KinectSensor.KinectSensors)
                    sensor.Stop();
            }
        }
    }
}

Uygulamayı çalıştırdığımızda, görüntüdeki gibi eklem pozisyonlarımızı göreceğiz.

-

Kinect'in sizi algılaması birkaç saniye alacaktır. Uygulama işleyişinde problem yaşarsanız, Kinect'in bağlı olduğu USB hub'ına bağlı diğer cihazları çıkararak yeniden deneyin.

Adım 2: Biraz Görsellik...

İkinci adımda, algılanan iskelet yapısını görselleştireceğiz. Öncelikle MainWindow'a bir canvas elementi ekleyeceğiz. (Canvas, alt elemanları olarak belirlenen objeleri istenilen pozisyonda göstermek ve hareket ettirmek için kullanılır.) Devamında, seçtiğimiz eklemleri temsil edecek ellipse elementlerini canvas üzerinde pozisyonlandırarak iskelet görünümü elde edeceğiz.

İlk adımda geliştirdiğimiz uygulamaya bir canvas ve 6 tane ellipse ekleyelim:

[XAML] MainWindow.xaml

<Window x:Class="Kinect103_SkeletonTracking.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Kinect 103: İskelet Görünümü" Height="522" Width="660" WindowStartupLocation="CenterScreen"
        Loaded="Window_Loaded" Closing="Window_Closing">
    <Grid>
        <!-- Sağ ve sol ele ait parametreler burada gösterilecek -->
        <Label Name="label1" Content="Sol El:" FontSize="15" HorizontalAlignment="Left" Margin="6,4,0,0"
               VerticalAlignment="Top" />
        <Label Name="label2" Content="X:" FontSize="15" HorizontalAlignment="Left" Margin="61,4,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSolElX" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="89,4,0,0"
               VerticalAlignment="Top" Width="56" HorizontalContentAlignment="Right"
               Foreground="#FF003DFF" />
        <Label Name="label3" Content="Y:" FontSize="15" HorizontalAlignment="Left" Margin="156,4,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSolElY" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="184,4,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
        <Label Name="label4" Content="Z:" FontSize="15" HorizontalAlignment="Left" Margin="250,4,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSolElZ" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="278,4,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
        <Label Name="label5" Content="Sağ El:" FontSize="15" HorizontalAlignment="Left" Margin="6,24,0,0"
               VerticalAlignment="Top" />
        <Label Name="label6" Content="X:" FontSize="15" HorizontalAlignment="Left" Margin="61,24,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSagElX" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="89,24,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
        <Label Name="label7" Content="Y:" FontSize="15" HorizontalAlignment="Left" Margin="156,24,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSagElY" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="184,24,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
        <Label Name="label8" Content="Z:" FontSize="15" HorizontalAlignment="Left" Margin="250,24,0,0"
               VerticalAlignment="Top" />
        <Label Name="lblSagElZ" Content="0.000" FontSize="15" HorizontalAlignment="Left" Margin="278,24,0,0"
               HorizontalContentAlignment="Right" VerticalAlignment="Top" Width="56" Foreground="#FF003DFF" />
        
        <!-- İskelet yapısını temsil edecek görünüm burada oluşturulacak -->
        <Canvas Name="cnvSkeleton" Height="423" Width="638" HorizontalAlignment="Left" VerticalAlignment="Top"
                Margin="0,60,0,0">
            <Ellipse Name="elpBas" Canvas.Left="300" Canvas.Top="58" Height="30" Width="30"
                     Fill="#FF0062FF" Stroke="{x:Null}"/>
            <Ellipse Name="elpSolEl" Canvas.Left="101" Canvas.Top="119" Height="30" Width="30"
                     Fill="#FF0062FF" Stroke="{x:Null}"/>
            <Ellipse Name="elpSagEl" Canvas.Left="506" Canvas.Top="119" Height="30" Width="30"
                     Fill="#FF0062FF" Stroke="{x:Null}"/>
            <Ellipse Name="elpBoyun" Canvas.Left="300" Canvas.Top="100" Height="30" Width="30"
                     Fill="#FF0062FF" Stroke="{x:Null}"/>
            <Ellipse Name="elpSolOmuz" Canvas.Left="236" Canvas.Top="119" Height="30" Width="30"
                     Fill="#FF0062FF" Stroke="{x:Null}"/>
            <Ellipse Name="elpSagOmuz" Canvas.Left="371" Canvas.Top="119" Height="30" Width="30"
                     Fill="#FF0062FF" Stroke="{x:Null}"/>
        </Canvas>
    </Grid>
</Window>

"Kinect_SkeletonFrameReady" eventi içerisine ekleyeceğimiz "EklemGoster" metodu, jointlerden aldığı -1 ile 1 arasındaki X ve Y değerlerini, canvasın genişlik ve yüksekliğine orantılayarak, her bir ellipsein üstten ve soldan uzaklıklarını belirleyecek.

[C#] MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using Microsoft.Kinect;
 
namespace Kinect103_SkeletonTracking
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        // Tüm tanımlanan iskeletlere ait veriyi tutacak iskelet dizisi
        private Skeleton[] skeletons = new Skeleton[6];
 
        // Takip edilecek ve işlenecek iskelet
        private Skeleton skeleton;
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // Kinect bağlıysa, belirtilen parametrelere göre ilk Kinect'i yapılandır
            if (KinectSensor.KinectSensors.Count > 0)
            {
                // Hareket yumuşatma parametreleri
                TransformSmoothParameters tsp = new TransformSmoothParameters();
                tsp.Smoothing = 0.55f;
                tsp.Correction = 0.1f;
                tsp.Prediction = 0.1f;
                tsp.JitterRadius = 0.4f;
                tsp.MaxDeviationRadius = 0.4f;
 
                // Sisteme bağlı ilk Kinect'i başlat
                KinectSensor.KinectSensors[0].Start();
 
                // İskelet verisi akışını belirtilen hareket yumuşatma parametrelerine göre başlat
                KinectSensor.KinectSensors[0].SkeletonStream.Enable(tsp);
 
                // İskelet verisi güncellendiğinde tetiklenecek eventi oluştur
                KinectSensor.KinectSensors[0].SkeletonFrameReady
                    += new EventHandler<SkeletonFrameReadyEventArgs>(Kinect_SkeletonFrameReady);
            }
        }
 
        private void Kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            try
            {
                // Gelen iskelet verisini skeletons dizisine kopyala
                if (e.OpenSkeletonFrame() != null) e.OpenSkeletonFrame().CopySkeletonDataTo(skeletons);
 
                // İlk algılanan iskeleti seç
                skeleton = (from s in skeletons
                           where s.TrackingState == SkeletonTrackingState.Tracked
                           select s).FirstOrDefault();
            }
            catch (Exception)
            {
                // Hata oluşursa skeleton'un parametrelerini temizle.
                // Bu frame'de veri işlemesi yapmayacağız.
                skeleton = null;
            }
 
            // İskelet algılanmışsa:
            if (skeleton != null)
            {
                // Ellere ait pozisyon bilgisini işle:
                PozisyonGoster(skeleton);
 
                // İskelet yapısını göster:
                EklemGoster(skeleton);
            }
        }
 
        /// <summary>
        /// Ellere ait X, Y ve Z pozisyonlarını gösterir.
        /// </summary>
        /// <param name="skeleton">İskelet yapısı</param>
        private void PozisyonGoster(Skeleton skeleton)
        {
            // Sağ elin X, Y, Z pozisyonlarını göster:
            lblSagElX.Content = skeleton.Joints[JointType.HandRight].Position.X.ToString("0.000");
            lblSagElY.Content = skeleton.Joints[JointType.HandRight].Position.Y.ToString("0.000");
            lblSagElZ.Content = skeleton.Joints[JointType.HandRight].Position.Z.ToString("0.000");
 
            // Sol elin X, Y, Z pozisyonlarını göster:
            lblSolElX.Content = skeleton.Joints[JointType.HandLeft].Position.X.ToString("0.000");
            lblSolElY.Content = skeleton.Joints[JointType.HandLeft].Position.Y.ToString("0.000");
            lblSolElZ.Content = skeleton.Joints[JointType.HandLeft].Position.Z.ToString("0.000");
        }
 
        /// <summary>
        /// Eklemleri temsil eden elipsleri canvas üzerinde konumlandırır.
        /// </summary>
        /// <param name="skeleton">İskelet yapısı</param>
        private void EklemGoster(Skeleton skeleton)
        {
            // Elipsleri, ilgili iskelet parametrelerine göre konumlandır:
            ElipsKonumlandir(elpBas, skeleton.Joints[JointType.Head]);
            ElipsKonumlandir(elpBoyun, skeleton.Joints[JointType.ShoulderCenter]);
            ElipsKonumlandir(elpSolOmuz, skeleton.Joints[JointType.ShoulderLeft]);
            ElipsKonumlandir(elpSagOmuz, skeleton.Joints[JointType.ShoulderRight]);
            ElipsKonumlandir(elpSolEl, skeleton.Joints[JointType.HandLeft]);
            ElipsKonumlandir(elpSagEl, skeleton.Joints[JointType.HandRight]);
        }
 
        /// <summary>
        /// Belirtilen ellipse elementini, belirtilen joint'e ait X ve Y değerine göre konumlandırır.
        /// </summary>
        /// <param name="ellipse">Konumlandırılacak ellipse</param>
        /// <param name="joint">Pozisyon parametrelerinin alınacağı joint</param>
        private void ElipsKonumlandir(FrameworkElement ellipse, Joint joint)
        {
            // Ellipse'in canvas'ın sol ve üst kenarından uzaklığı.
            Canvas.SetLeft(ellipse, (joint.Position.X + 1) * (640 / 2));
            Canvas.SetTop(ellipse, (480 - (joint.Position.Y + 1) * (480 / 2)));
        }
 
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // Uygulama kapanmadan Kinect'i durdur.
            if (KinectSensor.KinectSensors.Count > 0)
            {
                foreach (KinectSensor sensor in KinectSensor.KinectSensors)
                    sensor.Stop();
            }
        }
    }
}

Uygulamayı çalıştırdığımızda, elipslerin eklemlerimize göre konumlandığını göreceğiz.

-

Üzerinde çalıştığımız örnek, Kinect'in raporladığı iskelet yapısına nasıl erişildiğini ve bu verinin temelde nasıl kullanılabileceğini gösteriyor. Bu veriler ile farklı uygulama türleri geliştirmenin üzerinde ilerleyen yazılarımızda duracağız...


Ek Dosya: Uygulama Kodları
Okunma Sayısı: 5278

comments powered by Disqus
 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi