我正在使用 Kinect 工具箱,所以我手里有一份ReplaySkeletonFrames
列表。我正在迭代此列表,获取第一个跟踪的框架并修改一些属性。
众所周知,当我们更改对象时,我们也更改了原始对象。
我需要复制一个骨架。
注意:我不能使用 CopySkeletonDataTo()
,因为我的框架是ReplaySkeletonFrame
,而不是"普通"Kinect 的ReplayFrame
。
我尝试制作自己的方法,逐个属性复制,但某些属性无法复制。 看...
public static Skeleton Clone(this Skeleton actualSkeleton)
{
if (actualSkeleton != null)
{
Skeleton newOne = new Skeleton();
// doesn't work - The property or indexer 'Microsoft.Kinect.SkeletonJoints'
// cannot be used in this context because the set accessor is inaccessible
newOne.Joints = actualSkeleton.Joints;
// doesn't work - The property or indexer 'Microsoft.Kinect.SkeletonJoints'
// cannot be used in this context because the set accessor is inaccessible
JointCollection jc = new JointCollection();
jc = actualSkeleton.Joints;
newOne.Joints = jc;
//...
}
return newOne;
}
如何解决?
通过更多的搜索,我最终得到了以下解决方案: 将骨架序列化到内存,反序列化为新对象
这是代码
public static Skeleton Clone(this Skeleton skOrigin)
{
// isso serializa o skeleton para a memoria e recupera novamente, fazendo uma cópia do objeto
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, skOrigin);
ms.Position = 0;
object obj = bf.Deserialize(ms);
ms.Close();
return obj as Skeleton;
}