在并行线程之间共享kinect流数据
Sharing kinect stream data between parallel threads
我要解决的问题是,我将来自不同项目的 classes 合并到一个项目中。这些 classes 中的函数使用作为其 class 成员的 KinectSensor 变量并识别不同的手势。我正在尝试 运行 并行线程中的手势识别功能,但想知道如何将 kinect 数据传递给它们。
有没有一种方法可以在单个程序的线程之间并行共享 kinect 传感器流数据(颜色流、深度流等)数据 运行ning?像"skeleton frame ready"这样触发的事件会被所有接收kinect流数据的线程接收到吗?
我正在使用 kinect 360,在 c# 中使用 sdk 1.8
KinectSensor对象代表一个Kinect,一个Kinect只能被一个程序使用
如果您谈论的两个线程是同一程序的一部分,您可以"share the streams"通过简单地共享对同一对象的访问。
但是,颜色流、深度流和骨架流是通过向事件注册回调方法来获得的。所以你可以做的是:
- 将对同一个 KinectSensor 对象(预初始化)的引用共享给两个线程;
在每个线程中,注册一个深度、颜色和骨架流的回调,它更新线程本地变量中的流内容(或仅由一个线程使用) :
// Reference to the single KinectSensor object
private KinectSensor kinectSensor;
// Local variables with depth, color and skeletal information
private Skeleton[] skeleton_thread1;
private Skeleton[] skeleton_thread2;
private short[] depth_thread1;
private short[] depth_thread2;
private byte[] color_thread1;
private byte[] color_thread2;
// ...
// Register callbacks (you must so this both in thread1 and thread2)
// Assume that here we are refererring to thread1
kinectSensor.ColorFrameReady += new EventHandler<ColorFrameReadyEventArgs>(kinectSensor_ColorFrameReady1);
kinectSensor.DepthFrameReady += new EventHandler<DepthFrameReadyEventArgs>(kinectSensor_DepthFrameReady1);
kinectSensor.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinectSensor_SkeletonFrameReady1);
// ...
private void kinectSensor_SkeletonFrameReady1(object sender, SkeletonFrameReadyEventArgs e)
{
this.skeletonFrame_thread1 =
using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame != null)
{
this.skeleton_thread1 = new Skeleton[skeletonFrame.SkeletonArrayLength];
skeletonFrame.CopySkeletonDataTo(this.skeleton_thread1);
// Do stuff
}
else
{
// Do stuff
}
}
}
private void kinectSensor_ColorFrameReady1(object sender, ColorImageFrameReadyEventArgs e)
{
using (ColorImageFrame colorImageFrame = e.OpenColorImageFrame())
{
if (colorImageFrame != null)
{
this.color_thread1 = new byte[colorImageFrame.PixelDataLength];
colorImageFrame.CopyPixelDataTo(this.color_thread1);
// Do Stuff
}
else
{
// Do stuff
}
}
}
private void kinectSensor_DepthFrameReady1(object sender, DepthImageFrameReadyEventArgs e)
{
using (DepthImageFrame depthImageFrame = e.OpenDepthImageFrame())
{
if (depthImageFrame != null)
{
this.depth_thread1 = new short[depthImageFrame.PixelDataLength];
depthImageFrame.CopyPixelDataTo(this.depth_thread1);
// Do Stuff
}
else
{
// Do stuff
}
}
}
我要解决的问题是,我将来自不同项目的 classes 合并到一个项目中。这些 classes 中的函数使用作为其 class 成员的 KinectSensor 变量并识别不同的手势。我正在尝试 运行 并行线程中的手势识别功能,但想知道如何将 kinect 数据传递给它们。
有没有一种方法可以在单个程序的线程之间并行共享 kinect 传感器流数据(颜色流、深度流等)数据 运行ning?像"skeleton frame ready"这样触发的事件会被所有接收kinect流数据的线程接收到吗?
我正在使用 kinect 360,在 c# 中使用 sdk 1.8
KinectSensor对象代表一个Kinect,一个Kinect只能被一个程序使用
如果您谈论的两个线程是同一程序的一部分,您可以"share the streams"通过简单地共享对同一对象的访问。
但是,颜色流、深度流和骨架流是通过向事件注册回调方法来获得的。所以你可以做的是:
- 将对同一个 KinectSensor 对象(预初始化)的引用共享给两个线程;
在每个线程中,注册一个深度、颜色和骨架流的回调,它更新线程本地变量中的流内容(或仅由一个线程使用) :
// Reference to the single KinectSensor object private KinectSensor kinectSensor; // Local variables with depth, color and skeletal information private Skeleton[] skeleton_thread1; private Skeleton[] skeleton_thread2; private short[] depth_thread1; private short[] depth_thread2; private byte[] color_thread1; private byte[] color_thread2; // ... // Register callbacks (you must so this both in thread1 and thread2) // Assume that here we are refererring to thread1 kinectSensor.ColorFrameReady += new EventHandler<ColorFrameReadyEventArgs>(kinectSensor_ColorFrameReady1); kinectSensor.DepthFrameReady += new EventHandler<DepthFrameReadyEventArgs>(kinectSensor_DepthFrameReady1); kinectSensor.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinectSensor_SkeletonFrameReady1); // ... private void kinectSensor_SkeletonFrameReady1(object sender, SkeletonFrameReadyEventArgs e) { this.skeletonFrame_thread1 = using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) { if (skeletonFrame != null) { this.skeleton_thread1 = new Skeleton[skeletonFrame.SkeletonArrayLength]; skeletonFrame.CopySkeletonDataTo(this.skeleton_thread1); // Do stuff } else { // Do stuff } } } private void kinectSensor_ColorFrameReady1(object sender, ColorImageFrameReadyEventArgs e) { using (ColorImageFrame colorImageFrame = e.OpenColorImageFrame()) { if (colorImageFrame != null) { this.color_thread1 = new byte[colorImageFrame.PixelDataLength]; colorImageFrame.CopyPixelDataTo(this.color_thread1); // Do Stuff } else { // Do stuff } } } private void kinectSensor_DepthFrameReady1(object sender, DepthImageFrameReadyEventArgs e) { using (DepthImageFrame depthImageFrame = e.OpenDepthImageFrame()) { if (depthImageFrame != null) { this.depth_thread1 = new short[depthImageFrame.PixelDataLength]; depthImageFrame.CopyPixelDataTo(this.depth_thread1); // Do Stuff } else { // Do stuff } } }