Мне нужно создать консольное приложение, которое использует Kinect, с Kinect SDK и C#. Поскольку это консольное приложение, я нашел опрос наилучшим способом получения кадров, которые мне нужно обработать. Мне нужно будет получить кадры с камеры глубины и камеры rgb, выполнить некоторую обработку затем в отдельных потоках (один для изображения глубины и один для изображения rgb) и дать пользователю выход для каждого из двух обработанных кадров. То, как я думал об этом, следующее:Опрос датчиков Kinect на консольном приложении
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;
}
}
Палач представляет методы, которые обрабатывают кадры, полученные от 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) не нуждается в информации от другой.
Заранее благодарен!
Nice! Я займусь этим. Одна из вещей, которые, по моему мнению, были не очень хороши в моем коде, - это процесс создания нового потока каждый раз, когда предыдущий поток умер, и то, что вы предложили, похоже, является хорошим способом справиться с этой проблемой. Благодаря! Любые другие предложения (и объяснения других возможных причин, по которым мой текущий код плох) будут оценены, хотя! –
Только что нашел это: https://github.com/Aesir/ObservableKinect Звучит интересно –