Обнаружение пользователя Kinect
Я занимаюсь разработкой приложения. Когда датчик kinect обнаруживает скелет, этот человек может работать с ним, если другой человек приближается к существующему пользователю, он обнаруживает второго человека.
Я хочу ограничить пользователя, датчик kinect сначала обнаруживает его, если другой пользователь приходит, это не должно обнаруживать другого.
заранее спасибо
4 ответа
Также посмотрите ответ Jurgeon D на определение игрока Kinect SDK, так как он касается индекса скелета. @Fixus также прав в том, что вы можете использовать идентификатор. Но если вы имеете в виду, что обнаружено более 2 человек, то обнаруживается только один, не программирующий, а аппаратное обеспечение Kinect и @FelixK. был прав.
Скелетный индекс
void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
SkeletonFrame sf = e.SkeletonFrame;
//check which skeletons in array are active and
// use that array indexes for player index
SkeletonData player1 = sf.Skeletons[playerIndex1];
SkeletonData player2 = sf.Skeletons[playerIndex2];
}
Скелетные идентификаторы
void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
SkeletonFrame sf = e.SkeletonFrame;
if (sf.TrackingState == SkeletalTrackingState.Tracked)
{
int ID1 = sf.TrackingID;
}
Также код для обнаружения людей
DepthImageFrame depthFrame;
short[] rawDepthData = new short[depthFrame.PixelDataLength];
depthFrame.CopyPixelDataTo(rawDepthData);
Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4];
int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask;
if (player > 0)
{
//do something
}
Kinect обнаружит нового пользователя, потому что это его работа:) НО помните, что у каждого пользователя есть свой идентификатор, поэтому вы всегда знаете, что первый пользователь первый, а второй - второй. Таким образом, вы можете работать только со скелетом пользователя, с которым хотите работать
Если я правильно понимаю ваш вопрос, это невозможно, вы не сможете изменить поведение Kinects и то, как оно обнаруживает пользователей (если в Framework нет ничего; я не думаю, что что-то есть).
Вы должны решить это в своем коде.
KinectManager kinectManager = KinectManager.Instance;
AvatarController avatarCtrl = avatar ? avatar.gameObject.GetComponent<AvatarController> () : null;
if (kinectManager != null && kinectManager.IsInitialized () && avatar != null && avatarCtrl && kinectManager.IsUserTracked (avatarCtrl.playerId)) {
//User detected. You can do the remaining thing.
}
В одном из руководств по быстрому старту kinect есть метод для обнаружения только одного пользователя. Я попробовал это для моего собственного приложения, и это сработало.
using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame == null)
return;
Skeleton[] skeletons= new Skeleton[skeletonFrame.SkeletonArrayLength];
skeletonFrame.CopySkeletonDataTo(skeletons);
if (skeletons.All(s => s.TrackingState == SkeletonTrackingState.NotTracked))
return;
Skeleton skeleton = (from s in skeletons
where s.TrackingState == SkeletonTrackingState.Tracked
select s).FirstOrDefault();
if (skeleton == null) return;
// TODO: Do something to the skeleton data...
}