我需要创建一个使用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)都不需要来自另一个的信息。
提前致谢!
答案 0 :(得分:1)
查看ReactiveExtensions框架可能很酷。它非常干净地处理异步事件流。
您可以针对数据源编写LINQ并执行非常有趣的可组合操作。
http://msdn.microsoft.com/en-us/data/gg577609.aspx
你基本上会有两个IEnumerable序列(无限循环的东西)以给定的间隔产生帧。然后,您可以使用Rx“查询”这些序列。 RX为您处理所有复杂的线程问题,使您的消费者代码简洁明了。
要清楚,您不希望每次都创建新线程。您可以创建两个无限的枚举,每个枚举在自己的线程上运行,并在每次迭代时产生结果。这样他们甚至不会“死”