在控制台应用程序上轮询Kinect传感器

时间:2012-06-10 23:23:42

标签: c# multithreading console kinect polling

我需要创建一个使用Kinect的控制台应用程序,使用Kinect SDK和c#。由于它是一个控制台应用程序,我发现轮询是检索我需要处理的帧的最佳方法。我需要从深度相机和rgb相机中检索帧,然后在单独的线程中进行一些处理(一个用于深度图像,一个用于rgb图像),并为两个中的每一个提供输出给用户处理过的帧。我一直在考虑这样做的方式如下:

1 - 创建2个线程,第一个是轮询rgb摄像头并进行处理的方法,第二个是轮询深度摄像头并进行处理的方法

2 - 开始线程

3 - 输入一些停止条件循环

4 - 单独检查每个线程是否处于活动状态,如果没有,则再次创建它们并再次启动它们

我已经制定了一个遵循这些步骤的测试程序并且它可以工作,但我不确定这是最好的方法。我的测试程序是

class Program
{
    private static ClassExecutioner Executioner;
    private static Class1 Cls;

    static void Main(string[] args)
    {
        Executioner = new ClassExecutioner();
        Cls = new Class1();

        Thread fThread = new Thread(new ThreadStart(processA));
        Thread sThread = new Thread(new ThreadStart(processB));
        fThread.Start();
        sThread.Start();

        while (true)
        {
            if (!fThread.IsAlive)
            {
                fThread = new Thread(new ThreadStart(processA));
                fThread.Start();
            }

            if (!sThread.IsAlive)
            {
                sThread = new Thread(new ThreadStart(processB));
                sThread.Start();
            }
        }

    }
    static void processA()
    {
        String frameA = Cls.pollA();
        Executioner.CallA(frameA);
    }
    static void processB()
    {
        String frameB = Cls.pollB();
        Executioner.CallB(frameB);
    }
}

Class 1方法表示kinect上摄像机的轮询

class Class1
{
    private int a;
    private int b;

    public Class1()
    {
        a = 0;
        b = 0;
    }

    public String pollA()
    {
        String frame = "this is " + a % 100;
        a++;
        return frame;
    }

    public String pollB()
    {
        String frame = "I am " + b % 100;
        b++;
        return frame;
    }
}

Executioner表示处理从Kinect

获得的帧的方法
class ClassExecutioner
{

    public ClassExecutioner()
    {
    }

    public void CallA(String frameA)
    {
        Random rand = new Random();
        int time = rand.Next() % 1000000000;
        //'processing' - wait some time
        for (int i = 0; i < time; i++)
        {
        }
        // finishes the processing of the 'frame' from stream A
        Console.WriteLine(frameA);
    }

    public void CallB(String frameB)
    {
        Random rand = new Random();
        int time = rand.Next() % 1000000000;
        // 'processing' - wait some time
        for (int i = 0; i < time; i++)
        {
        }
        // finishes the processing of the 'frame' from stream B
        Console.WriteLine(frameB);
    }
}

该程序非常简单,但很好地说明了我想要对Kinect流做什么。问题是,我不确定这是最好的方法,或者即使它在一个实用的Kinect应用程序中完全可行。请记住,目前,每个处理(深度和rgb)都不需要来自另一个的信息。

提前致谢!

1 个答案:

答案 0 :(得分:1)

查看ReactiveExtensions框架可能很酷。它非常干净地处理异步事件流。

您可以针对数据源编写LINQ并执行非常有趣的可组合操作。

http://msdn.microsoft.com/en-us/data/gg577609.aspx

你基本上会有两个IEnumerable序列(无限循环的东西)以给定的间隔产生帧。然后,您可以使用Rx“查询”这些序列。 RX为您处理所有复杂的线程问题,使您的消费者代码简洁明了。

要清楚,您不希望每次都创建新线程。您可以创建两个无限的枚举,每个枚举在自己的线程上运行,并在每次迭代时产生结果。这样他们甚至不会“死”