Facebook RSS Feed
 
Kinect & Leap Motion: Eklem Açılarına Ulaşım
Tarih: 07.10.2012, Platform: .NET 4.5, IDE: Visual Studio 2012, Level: 200

Özellikle modelleme çalışmalarında ve medikal uygulamalarda, eklemlerin birbirlerine olan açılarına ihtiyaç duyuyoruz. Kinect, Joint Orientation adı altında 20 eklem noktamızın duruş açısını algılayabiliyor. Yazımızda, temel olarak bir ekleme ait açı bilgisine ulaşmanın üzerinde duracağız.

Öngereksinimler

Eklem açılarına ulaşabilmek için, Kinect for Windows SDK'nın 1.5 yada üzeri bir sürümünü kullanıyor olmanız gerekmektedir.

Temel Bilgiler

Eklemler arası açı 2 şekilde rapor ediliyor. İlki, absolute player orientation. Hip center (kuyruksokumu) ekleminin Kinect'e göre koordinatı referans alınarak elde ediliyor. Diğeri ise hierarchical rotation. Bu modelde ise, eklemlerin birbirlerine olan açıları hesaplanıyor. Bu hesaplamalara göre her bir eklemin X, Y ve Z açıları elde edilebiliyor.

Uygulama

Sağ elimizin absolute ve hierarchical yapıda açılarını elde edeceğimiz bir uygulama geliştireceğiz. Uygulamamızın görüntüsü şöyle olacak:

-

Projeyi geliştirmek için, Visual Studio ile "KinectEklemAcilari" adında bir proje oluşturarak, proje referanslarına "Microsoft.Kinect.dll" dosyasını ekleyin. Arayüze ait kodlarımız aşağıdaki gibi olmalı:

[XAML] MainWindow.xaml

<Window x:Class="KinectEklemAcilari.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Kinect Eklem Açıları" Height="240" Width="480"
        Loaded="Window_Loaded" Closing="Window_Closing"
        WindowStartupLocation="CenterScreen">
    <Grid>
        <GroupBox Header="Absolute Rotation" HorizontalAlignment="Left" Margin="10,9,0,0"
                  VerticalAlignment="Top" Height="182" Width="215" FontSize="20">
            <Grid Margin="0">
                <TextBlock HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap"
                           Text="X:" VerticalAlignment="Top" FontSize="20"/>
                <TextBlock HorizontalAlignment="Left" Margin="11,42,0,0" TextWrapping="Wrap"
                           Text="Y:" VerticalAlignment="Top" FontSize="20"/>
                <TextBlock HorizontalAlignment="Left" Margin="10,74,0,0" TextWrapping="Wrap"
                           Text="Z:" VerticalAlignment="Top" FontSize="20"/>
                <TextBlock x:Name="txt4_Copy" HorizontalAlignment="Left" Margin="10,106,0,0"
                           TextWrapping="Wrap" Text="W:" VerticalAlignment="Top" FontSize="20"/>
                <TextBlock x:Name="txtAbsX" HorizontalAlignment="Left" Margin="50,10,0,0"
                           TextWrapping="Wrap" Text="00.000" VerticalAlignment="Top" FontSize="20"
                           Width="80" TextAlignment="Right"/>
                <TextBlock x:Name="txtAbsY" HorizontalAlignment="Left" Margin="50,42,0,0"
                           TextWrapping="Wrap" Text="00.000" VerticalAlignment="Top" FontSize="20"
                           Width="80" TextAlignment="Right"/>
                <TextBlock x:Name="txtAbsZ" HorizontalAlignment="Left" Margin="50,74,0,0"
                           TextWrapping="Wrap" Text="00.000" VerticalAlignment="Top" FontSize="20"
                           Width="80" TextAlignment="Right"/>
                <TextBlock x:Name="txtAbsW" HorizontalAlignment="Left" Margin="50,106,0,0"
                           TextWrapping="Wrap" Text="00.000" VerticalAlignment="Top" FontSize="20"
                           Width="80" TextAlignment="Right"/>
            </Grid>
        </GroupBox>
        <GroupBox Header="Hierarchical Rotation" HorizontalAlignment="Left" Margin="239,9,0,0"
                  VerticalAlignment="Top" Height="182" Width="215" FontSize="20">
            <Grid Margin="0">
                <TextBlock HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap"
                           Text="X:" VerticalAlignment="Top" FontSize="20"/>
                <TextBlock HorizontalAlignment="Left" Margin="11,42,0,0" TextWrapping="Wrap"
                           Text="Y:" VerticalAlignment="Top" FontSize="20"/>
                <TextBlock HorizontalAlignment="Left" Margin="10,74,0,0" TextWrapping="Wrap"
                           Text="Z:" VerticalAlignment="Top" FontSize="20"/>
                <TextBlock x:Name="txt4_Copy1" HorizontalAlignment="Left" Margin="10,106,0,0"
                           TextWrapping="Wrap" Text="W:" VerticalAlignment="Top" FontSize="20"/>
                <TextBlock x:Name="txtHX" HorizontalAlignment="Left" Margin="50,10,0,0"
                           TextWrapping="Wrap" Text="00.000" VerticalAlignment="Top" FontSize="20"
                           Width="80" TextAlignment="Right"/>
                <TextBlock x:Name="txtHY" HorizontalAlignment="Left" Margin="50,42,0,0"
                           TextWrapping="Wrap" Text="00.000" VerticalAlignment="Top" FontSize="20"
                           Width="80" TextAlignment="Right"/>
                <TextBlock x:Name="txtHZ" HorizontalAlignment="Left" Margin="50,74,0,0"
                           TextWrapping="Wrap" Text="00.000" VerticalAlignment="Top" FontSize="20"
                           Width="80" TextAlignment="Right"/>
                <TextBlock x:Name="txtHW" HorizontalAlignment="Left" Margin="50,106,0,0"
                           TextWrapping="Wrap" Text="00.000" VerticalAlignment="Top" FontSize="20"
                           Width="80" TextAlignment="Right"/>
            </Grid>
        </GroupBox>
    </Grid>
</Window>

Eklem açılarını algılayacak uygulama kodlarımız da:

[C#] MainWindow.xaml.cs

using System;
using System.Linq;
using System.Windows;
using Microsoft.Kinect;
 
namespace KinectEklemAcilari
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        KinectSensor kinect;
        Skeleton[] skeletons = new Skeleton[6];
 
        // Uygulamanın göstereceği eklem
        JointType gosterilecekEklem = JointType.HandRight;
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // Kinect bağlıysa, belirtilen parametrelere göre başlat
            if (KinectSensor.KinectSensors.Count > 0)
            {
                kinect = KinectSensor.KinectSensors[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
                kinect.Start();
 
                // İskelet verisi akışını belirtilen hareket yumuşatma parametrelerine göre başlat
                kinect.SkeletonStream.Enable(tsp);
 
                // İskelet verisi güncellendiğinde tetiklenecek event handler'ı oluştur
                kinect.SkeletonFrameReady +=
                    new EventHandler<SkeletonFrameReadyEventArgs>(Kinect_SkeletonFrameReady);
            }
        }
 
        private void Kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            Skeleton iskelet;
 
            try
            {
                // İskelet verisini al
                if (e.OpenSkeletonFrame() != null)
                    e.OpenSkeletonFrame().CopySkeletonDataTo(skeletons);
 
                // İlk algılanan iskeleti seç
                iskelet = (from s in skeletons
                           where s.TrackingState == SkeletonTrackingState.Tracked
                           select s).FirstOrDefault();
            }
            catch (Exception)
            {
                iskelet = null;
            }
 
            // İskelet algılanmışsa veriyi işle
            if (iskelet != null && iskelet.TrackingState == SkeletonTrackingState.Tracked)
            {
                // Absolute Rotation
                txtAbsX.Text = iskelet.BoneOrientations[gosterilecekEklem].
                    AbsoluteRotation.Quaternion.X.ToString("00.000");
                txtAbsY.Text = iskelet.BoneOrientations[gosterilecekEklem].
                    AbsoluteRotation.Quaternion.Y.ToString("00.000");
                txtAbsZ.Text = iskelet.BoneOrientations[gosterilecekEklem].
                    AbsoluteRotation.Quaternion.Z.ToString("00.000");
                txtAbsW.Text = iskelet.BoneOrientations[gosterilecekEklem].
                    AbsoluteRotation.Quaternion.W.ToString("00.000");
 
                // Hierarchical Rotation
                txtHX.Text = iskelet.BoneOrientations[gosterilecekEklem].
                    HierarchicalRotation.Quaternion.X.ToString("00.000");
                txtHY.Text = iskelet.BoneOrientations[gosterilecekEklem].
                    HierarchicalRotation.Quaternion.Y.ToString("00.000");
                txtHZ.Text = iskelet.BoneOrientations[gosterilecekEklem].
                    HierarchicalRotation.Quaternion.Z.ToString("00.000");
                txtHW.Text = iskelet.BoneOrientations[gosterilecekEklem].
                    HierarchicalRotation.Quaternion.W.ToString("00.000");
            }
        }
 
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // Uygulama kapanırken, Kinect çalışıyorsa Kinect'i durdur
            if (kinect.IsRunning)
                kinect.Stop();
        }
    }
}

Uygulamayı çalıştırdığınızda, sağ elinize ait eklem açısı değerlerinin Kinect tarafından nasıl algılandığını göreceksiniz. Bu değerleri 3 boyutlu modelleme uygulamalarına göndererek yada kendi uygulamanızda kullanarak algılanan kişinin model görüntüsünü oluşturabilirsiniz...


Ek Dosya: Belirtilmemiş.
Okunma Sayısı: 1891

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