【发布时间】:2016-03-05 05:19:43
【问题描述】:
我使用 WPF 和 Microsoft Kinect SDK v2 创建了一个 Kinect 应用程序。
我已使用以下代码成功在所有关节点上显示图像:
// Draw
if (joint.JointType == JointType.SpineShoulder)
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri(@"C:\Users\myimage.jpg", UriKind.Relative);
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
var img = new Image { Source = bitmap, Height = 50, Width = 50 };
Canvas.SetLeft(img, point.X - img.Width / 2);
Canvas.SetTop(img, point.Y - img.Height / 2);
canvas.Children.Add(img);}
现在不是每个关节上的图像,我想合并 3 个关节 (spine_shoulder - center joint , shoulder right , shoulder left) 这是我的意见并将图像叠加到它们上,以便图像根据关节位置的变化进行旋转。
我尝试使用this article 中解释的代码,但没有运气......
让我们假设如果我们将图像覆盖在任何块的顶部,它会如何显示 它将如何旋转https://www.youtube.com/watch?v=pAljofdcMw8
按照@Vangos 的建议,我尝试如下
public partial class Window1 : Window
{
public static ObservableCollection<string> selectedImg = new ObservableCollection<string>();
KinectSensor _sensor;
MultiSourceFrameReader _reader;
IList<Body> _bodies;
private static string imagepath = @"C:\Users\demo.png";
CameraMode _mode = CameraMode.Color;
public Window1()
{
InitializeComponent();
imageItems.ItemsSource = Page1.folders;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
_sensor = KinectSensor.GetDefault();
if (_sensor != null)
{
_sensor.Open();
_reader = _sensor.OpenMultiSourceFrameReader(FrameSourceTypes.Color | FrameSourceTypes.Depth | FrameSourceTypes.Infrared | FrameSourceTypes.Body);
_reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;
}
}
void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
var reference = e.FrameReference.AcquireFrame();
// Body
using (var frame = reference.BodyFrameReference.AcquireFrame())
{
if (frame != null)
{
canvas.Children.Clear();
_bodies = new Body[frame.BodyFrameSource.BodyCount];
frame.GetAndRefreshBodyData(_bodies);
foreach (var body in _bodies)
{
if (body.IsTracked)
{
// COORDINATE MAPPING
foreach (Joint joint in body.Joints.Values)
{
if (joint.TrackingState == TrackingState.Tracked)
{
// 3D space point
CameraSpacePoint jointPosition = joint.Position;
// 2D space point
Point point = new Point();
if (_mode == CameraMode.Color)
{
ColorSpacePoint colorPoint = _sensor.CoordinateMapper.MapCameraPointToColorSpace(jointPosition);
point.X = float.IsInfinity(colorPoint.X) ? 0 : colorPoint.X;
point.Y = float.IsInfinity(colorPoint.Y) ? 0 : colorPoint.Y;
}
else if (_mode == CameraMode.Depth || _mode == CameraMode.Infrared) // Change the Image and Canvas dimensions to 512x424
{
DepthSpacePoint depthPoint = _sensor.CoordinateMapper.MapCameraPointToDepthSpace(jointPosition.);
point.X = float.IsInfinity(depthPoint.X) ? 0 : depthPoint.X;
point.Y = float.IsInfinity(depthPoint.Y) ? 0 : depthPoint.Y;
}
//// Draw a images based on joint type
JointType _start = JointType.SpineShoulder;
JointType _center = JointType.ShoulderRight;
JointType _end = JointType.ShoulderLeft;
if (joint.JointType == JointType.SpineShoulder)
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri(imagepath, UriKind.Relative);
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
var img = new Image { Source = bitmap, Height = 50, Width = 50 };
//Add a RotateTransform
img.RenderTransformOrigin = new Point(0.5, 0.5);
double angle = Extension.Angle(body.Joints[_start], body.Joints[_center], body.Joints[_end]);
img.RenderTransform = new RotateTransform(angle);
Canvas.SetLeft(img, point.X - img.Width / 2);
Canvas.SetTop(img, point.Y - img.Height / 2);
canvas.Children.Add(img);
}
}
}
}
}
}
}
}
}
enum CameraMode
{
Color,
Depth,
Infrared
}
【问题讨论】:
-
@Vito Gentile 你能帮帮我吗?
标签: c# wpf c#-4.0 kinect kinect-sdk