0

我需要使用 Kinect SDK 和 c# 制作一个使用 Kinect 的控制台应用程序。由于它是一个控制台应用程序,我发现轮询是检索我需要处理的帧的最佳方式。我需要从深度相机和 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);
    }
}

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)都不需要来自对方的信息。

提前致谢!

4

1 回答 1

1

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

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

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

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

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

于 2012-06-11T01:19:45.287 回答