可以透過KinectSensor的ElevationAngle去取得到傾角角度,也可以透過該屬性去改變傾角角度
但官方有建議不要太頻繁的去轉動,有可能會造成馬達損毀
如果有想要左右移動的開發者可以自行安裝馬達,利用arduino或8051等晶片去控制
XAML:
<Window x:Class="KinectAdjustTiltAngle.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="700" Width="646" Loaded="Window_Loaded" Unloaded="Window_Unloaded">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="530*" />
<ColumnDefinition Width="94*" />
</Grid.ColumnDefinitions>
<Image Name="image" Height="640" Width="480" Margin="12,20,38,0"></Image>
<Slider Height="629" Margin="513,20,81,0" Name="sliderKinectAngle" VerticalAlignment="Top" Minimum="-27" Maximum="27" Orientation="Vertical" Grid.ColumnSpan="2" PreviewMouseUp="sliderKinectAngle_PreviewMouseUp" />
<Label Name="labelCurrentAngle" Content="目前角度" Height="28" HorizontalAlignment="Left" Margin="19,323,0,0" VerticalAlignment="Top" Grid.Column="1" />
</Grid>
</Window>
Code:
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Kinect;
using System.Threading;
namespace KinectAdjustTiltAngle
{
///
/// MainWindow.xaml 的互動邏輯
///
public partial class MainWindow : Window
{
private KinectSensor sensor = KinectSensor.KinectSensors[0];
private byte[] dataByte;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (!sensor.IsRunning)
{
sensor.ColorFrameReady += VideoFrameReady;
sensor.ColorStream.Enable();
sensor.Start();
}
labelCurrentAngle.Content = @"目前角度" +
((int)sensor.ElevationAngle).ToString();
sliderKinectAngle.Value = (int)sensor.ElevationAngle;
}
private void Window_Unloaded(object sender, RoutedEventArgs e)
{
if (sensor.IsRunning)
{
sensor.Stop();
}
}
private void VideoFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
bool hasData = false;
using (ColorImageFrame frame = e.OpenColorImageFrame())
{
if (frame == null)
{
}
else
{
dataByte = new byte[frame.PixelDataLength];
frame.CopyPixelDataTo(dataByte);
hasData = true;
}
}
if (hasData)
{
BitmapSource source = BitmapSource.Create(640, 480, 96, 96,
PixelFormats.Bgr32, null, dataByte, 640 * 4);
image.Source = source;
}
}
private void sliderKinectAngle_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (sensor != null && sensor.IsRunning)
{
sensor.ElevationAngle = (int)sliderKinectAngle.Value;
labelCurrentAngle.Content = @"目前角度" + ((int)sliderKinectAngle.Value).ToString();
}
Thread.Sleep(new TimeSpan(hours: 0, minutes: 0, seconds: 1));
}
}
}
轉動前
轉動後
參考資料:
http://tw-hkt.blogspot.tw/2012/03/kinect_10.html

