Обнаружение пользователя 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...

}
Другие вопросы по тегам