void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
var reference = e.FrameReference.AcquireFrame();
// Color
using (var frame = reference.ColorFrameReference.AcquireFrame())
{
if (frame != null)
{
//将图像转入writeablebitmmap
FrameDescription colorFrameDescription = frame.FrameDescription;
using (KinectBuffer colorBuffer = frame.LockRawImageBuffer())
{
this.colorBitmap.Lock();
// verify data and write the new color frame data to the display bitmap
if ((colorFrameDescription.Width == this.colorBitmap.PixelWidth) && (colorFrameDescription.Height == this.colorBitmap.PixelHeight))
{
frame.CopyConvertedFrameDataToIntPtr(
this.colorBitmap.BackBuffer,
(uint)(colorFrameDescription.Width * colorFrameDescription.Height * 4),
ColorImageFormat.Bgra);
this.colorBitmap.AddDirtyRect(new Int32Rect(0, 0, this.colorBitmap.PixelWidth, this.colorBitmap.PixelHeight));
}
this.colorBitmap.Unlock();
}
if (_mode == CameraMode.Color)
{
camera.Source = frame.ToBitmap();
}
}
}
// Depth
using (var frame = reference.DepthFrameReference.AcquireFrame())
{
if (frame != null)
{
if (_mode == CameraMode.Depth)
{
camera.Source = frame.ToBitmap();
}
}
}
// Infrared
using (var frame = reference.InfraredFrameReference.AcquireFrame())
{
if (frame != null)
{
if (_mode == CameraMode.Infrared)
{
camera.Source = frame.ToBitmap();
}
}
}
// 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
System.Windows.Point point = new System.Windows.Point();
if (_mode == CameraMode.Color)
{
ColorSpacePoint colorPoint = _sensor.CoordinateMapper.MapCameraPointToColorSpace(jointPosition);
point.X = float.IsInfinity(colorPoint.X) ? 0 : colorPoint.X / 2;
point.Y = float.IsInfinity(colorPoint.Y) ? 0 : colorPoint.Y / 2;
//获取肩肘腕,脊椎中间坐标
switch (joint.JointType)
{
case JointType.WristLeft:
WristLeft.X = point.X;
WristLeft.Y = point.Y;
break;
case JointType.ElbowLeft:
ElbowLeft.X = point.X;
ElbowLeft.Y = point.Y;
break;
case JointType.ShoulderLeft:
ShoulderLeft.X = point.X;
ShoulderLeft.Y = point.Y;
break;
case JointType.SpineShoulder:
SpineShoulder.X = point.X;
SpineShoulder.Y = point.Y;
break;
case JointType.ShoulderRight:
ShoulderRight.X = point.X;
ShoulderRight.Y = point.Y;
break;
case JointType.ElbowRight:
ElbowRight.X = point.X;
ElbowRight.Y = point.Y;
break;
case JointType.WristRight:
WristRight.X = point.X;
WristRight.Y = point.Y;
break;
case JointType.ThumbRight:
ThumbRight.X = point.X;
ThumbRight.Y = point.Y;
break;
case JointType.HandLeft:
HandLeft.X = point.X;
HandLeft.Y = point.Y;
break;
}
}
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 / 2;
point.Y = float.IsInfinity(depthPoint.Y) ? 0 : depthPoint.Y / 2;
}
// Draw 红色圆,直径10
Ellipse ellipse = new Ellipse
{
Fill = System.Windows.Media.Brushes.Red,
Width = 10,
Height = 10
};
Canvas.SetLeft(ellipse, point.X - ellipse.Width / 2);
Canvas.SetTop(ellipse, point.Y - ellipse.Height / 2);
canvas.Children.Add(ellipse);
}
}
DrawHand(body.HandLeftState,HandLeft);
lefthandheight = HandLeft.Y;
Addangle(lefthandheight,HandLeft);
rightshoulderangle = GetAngle(SpineShoulder, ShoulderRight, ElbowRight);
rightelbowangle = GetAngle(ShoulderRight, ElbowRight, WristRight);
if (elbowrightflag)
{
DrawingLine(ShoulderRight, ElbowRight);//连接肩肘
DrawingLine(ElbowRight, WristRight);//连接肘腕
//DrawingLine(WristRight, ThumbRight);
//计算肘角度并添加到canvas
//rightwristangle = GetAngle(ElbowRight,WristRight,ThumbRight);
Addangle(rightelbowangle, ElbowRight);
//Addangle(rightwristangle, WristRight);
}
if (shoulderrightflag)
{
DrawingLine(ShoulderRight, ElbowRight);//连接肩肘
DrawingLine(SpineShoulder, ShoulderRight);//连接肩和肩中
//计算肩角度并添加到canvas
Addangle(rightshoulderangle, ShoulderRight);
}
if (issend)
{
rightshoulder = Convert.ToInt32(rightshoulderangle+155);
rightelbow = Convert.ToInt32(rightelbowangle + 100);
lefthigh = Convert.ToInt32(lefthandheight+100);
switch (body.HandLeftState)
{
case HandState.Open:
lefthand = 100;
break;
case HandState.Closed:
lefthand = 200;
break;
case HandState.Lasso:
lefthand = 300;
break;
case HandState.NotTracked:
lefthand = 100;
break;
case HandState.Unknown:
lefthand = 100;
break;
}
srightshoulder = Convert.ToString(rightshoulder);
srightelbow = Convert.ToString(rightelbow);
slefthigh = Convert.ToString(lefthigh);
slefthand = Convert.ToString(lefthand);
txtStatus.Text = srightelbow;
//com.Write($"s{srightshoulder}{srightelbow}{slefthigh}190{slefthand}");
//Thread.Sleep(20); 延时
if (flag == 1)
{
com.Write("s");
//Thread.Sleep(5);
com.Write(srightshoulder);
//Thread.Sleep(5);
com.Write(srightelbow);
flag = 2;
}
else if (flag == 2)
{
com.Write(slefthigh);
//Thread.Sleep(5);
com.Write("190");
flag = 3;
}
else if (flag == 3)
{
com.Write(slefthand);
//Thread.Sleep(5);
flag = 1;
}
//com.Write("s");
//Thread.Sleep(5);
//com.Write($"{srightshoulder}{srightelbow}{slefthigh}190{slefthand}");
//com.Write(srightshoulder);
//Thread.Sleep(5);
// com.Write(srightelbow);
//Thread.Sleep(5);
// com.Write(slefthigh);
//Thread.Sleep(5);
//com.Write("190");
//Thread.Sleep(5);
//com.Write(slefthand);
// Thread.Sleep(5);
}
}
}
}
}
}
这是一个Kinect程序 其中这个大函数是一个事件触发函数 我用的是wpf 我想将我数据处理的值通过串行口通信发送过去,但是当发送两个数据的时候就会卡死的了,该怎么解决我这个问题?具体的串行口通信代码都在最后面 前面是一些数据的chu'l