Facebook RSS Feed
 
Kinect & Leap Motion: Near Mode ve Seated Mode Kullanımları
Tarih: 30.08.2012, Platform: .NET 4.5, IDE: Visual Studio 2012, Level: 200



Kinect for Windows, bilgisayar karşısında kullanım için yakın mod ve oturma modu adında 2 özelliği destekliyor. Yakın mod, mesafe ölçümü ve iskelet algılamasının 40 cm mesafeye kadar yapılabilmesini sağlıyor. Oturma modu ise, sensörün yalnızca belden yukarıda bulunan 10 eklem noktasını algılamasını sağlıyor. Bu çalışmamızda yakın ve oturma modlarının detaylarına göz atıp, varolan uygulamalara eklenmesini ele alacağız...

Oturma Modu (Seated Mode)

Kinect'in belden aşağıda kalan eklemleri görmediği yada bu eklemlerin kullanımına görek duyulmadığı senaryolarda oturma modunu kullanıyoruz. Bu modda baş, boyun, omuzlar, dirsekler, el bilekleri ve ellerden oluşan 10 eklem algılanıp raporlanıyor. Diğer eklem noktaları "Not Tracked" olarak belirleniyor.

Normal modda iskelet algılaması arkaplana olan uzaklığa göre hesaplanırken, oturma modunda algılama harekete göre belirlenir. Yani, kişinin algılanabilmesi için hareket halinde olması gerekiyor. Oturma modunda, normal modda olduğu gibi en fazla 2 kişi takip edilebiliyor.

Oturma modunu etkinleştirmek için, SkeletonStream'in TrackingMode özelliği SkeletonTrackingMode.Seated olarak belirlenir. Normal moda dönüş için bu değer SkeletonTrackingMode.Default olarak değiştirilebilir. Kinect başlatıldıktan ve akışlar etkinleştirildikten sonra da mod değişimi yapılabilir, ancak o an algılanmış kişilerin yeni moda göre yeniden algılanmaları gerekir.

Yakın Mod (Near Mode)

Yakın mod ile Kinect'in derinlik sensörü 40 cm'e kadar algılama yapabiliyor. Kinect'in varsayılan mesafe algılama sınırları 150 cm ile 400 cm arasındadır. Yakın mod etkinleştirildiğinde, 40 cm'den 400 cm'e kadar aralıkta ölçüm gerçekleştirilebilir.

Derinlik akışında yakın modu etkinleştirmek için, DepthStream.Range özelliği DepthRange.Near olarak ayarlanır. Varsayılan uzaklık ayarları için DepthRange.Default değeri kullanılır. DepthStream üzerinde yapılan mesafe ayarı, iskelet tanımlamasını da etkiler. Uygulamanızda derinlik akışını kullanmayıp yalnızca iskelet algılama özelliğini kullansanız bile, yakın modun çalışabilmesi için derinlik akışını başlatmanız gerekir.

Uygulama

Yakın ve oturma modlarının varolan uygulamalara eklenmesini görmek için, "Kinect 103: İskelet Yapısına Ulaşım" yazımızda geliştirdiğimiz uygulamaya bu özellikleri ekleyeceğiz. İlgili kodları Window_Loaded metodunda Kinect'i yapılandırırken ilave edeceğiz. Yapacağımız yeni ayarlar ile, iskelet yapısını görselleştiren uygulamamız 40 cm'e kadar mesafede algılama yapabilecek.

Bu uygulamayı geliştirmek için, "KinectNearMode" adında bir WPF uygulaması oluşturup, proje referanslarına "Microsoft.Kinect.dll" dosyasını ekleyin. Uygulama kodları örnekteki gibi olacak:

[XAML] MainWindow.xaml

<Window x:Class="KinectNearMode.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Kinect Near Mode" 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>

[C#] MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Kinect;
 
namespace KinectNearMode
{
    /// <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();
 
                // Derinlik algılamasında yakın modu etkinleştir
                KinectSensor.KinectSensors[0].DepthStream.Range = DepthRange.Near;
 
                // Derinlik algılaması yakın moddayken iskelet algılamasını etkinleştir
                KinectSensor.KinectSensors[0].SkeletonStream.EnableTrackingInNearRange = true;
 
                // İskelet algılamasında oturma modunu kullan
                KinectSensor.KinectSensors[0].SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated;
 
                // Derinlik akışını başlat (Yakın modun aktif olabilmesi için gerekli)
                KinectSensor.KinectSensors[0].DepthStream.Enable();
 
                // İ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 event handler'ı 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)
        {
            if (KinectSensor.KinectSensors.Count > 0)
                KinectSensor.KinectSensors[0].Stop();
        }
    }
}

Yakın mod ile sağ ve sol ellere ait Z değeri, 0,400 değerine kadar inebilecek, yani sensör 40 cm'e kadar algılama yapabilecektir. (Buradaki 0,001'lik değer, 1mm'ye eşittir.)

-

Yakın ve oturma modları farklı özellikler olmalarına rağmen, çoğu uygulamada birlikte kullanılmaktadırlar. Bel ve aşağı bölgelerin algılanması uygulamanızda gerekli değilse, oturma modunun kullanılması performansı arttıracaktır...


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

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