Отслеживание лица высокой четкости Kinect V2 - несколько лиц
Я довольно долго работал с Kinect V2 в WPF. В настоящее время я написал модуль для извлечения контуров лица из цветового потока с помощью HighDefinitionFaceFrameSource
а также HighDefinitionFaceFrameReader
, По сути, я использую faceModel
а также faceAllignment
свойства из HightDefinitionFaceFrameResult
рассчитать путь вокруг лица. Затем я сопоставляю его с цветным потоком, который дает мне изображение лица человека. Затем я рисую поток цветов в WriteableBitmap
, который я показываю в моем окне XAML. Данные пути на данный момент отбрасываются.
Этот метод отлично работает для одного человека. Однако когда я попытался расширить его до шести человек, это замедлило рендеринг моей визуализации! Похоже, что это влияет только на рендеринг, так как фреймы лица, кажется, поступают как обычно, использование процессора и памяти также не пострадали. Похоже, это происходит, когда я обрабатываю несколько лицевых рамок высокого разрешения.
Я также заметил, что примеры Microsoft SDK отслеживают только одно лицо с HighDefinitionFaceFrameSource
, Возможно, в SDK есть ограничение?
Кому-нибудь удалось отследить шесть человек HignDefinitionFaceFrameSource
& Reader
?
1 ответ
После дальнейшего тестирования мне стало очевидно, что Kinect SDK не позволит вам иметь несколько HighDefinitionFaceFrameSource
с установленным идентификатором отслеживания. Таким образом, мне кажется, что только одно лицо может быть отслежено в то время. Обратите внимание, что я могу ошибаться, и, возможно, кто-то из команды Microsoft Kinect может дать более определенный ответ, но это то, что я узнал.
Вот как мне удалось обойти это ограничение. Я перебираю список отслеживаемых тел и устанавливаю идентификатор отслеживания для каждого лица индивидуально. Это позволяет мне отслеживать лицо в течение некоторого времени, захватить все необходимые данные, прекратить отслеживать его, перейти к следующему лицу и повторить. Конечно, у этого есть много недостатков - ваш поток данных отслеживания лиц не такой "плавный", как должен был бы быть, визуализация имеет "пробелы" в данных - небольшие, но заметные. Однако это всего лишь обходной путь, и я все еще ищу лучшее решение.
В ответ на ваш комментарий, Sergio, вы можете установить лицо как активное, назначив ему текущий действительный идентификатор отслеживания.
// update the face frame source to track this body
if (FaceFrameSources[bodyFrameIndex].TrackingId != trackingId)
{
FaceFrameSources[bodyFrameIndex].TrackingId = trackingId;
}
//set all the tracking face data to false
// update the high definition face frame source to track this body / face
if (_highDefinitionFaceFrameSources[bodyFrameIndex].TrackingId != trackingId)
{
_highDefinitionFaceFrameSources[bodyFrameIndex].TrackingId = trackingId;
}
Здесь trackingId - это текущий идентификатор отслеживания из вашего списка объектов Body. Ваш скелетный трекер должен обновлять это значение в каждом кадре.
Настройка TrackingId
значение в HighDefinitionFaceFrameSource
до 0 отключит отслеживание для этого объекта.