我需要使用 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)都不需要来自对方的信息。
提前致谢!