【问题标题】:Kinect v2 facetracking - how to get started?Kinect v2 面部跟踪 - 如何开始?
【发布时间】:2014-08-04 22:42:16
【问题描述】:

我刚刚获得了全新的适用于 Windows v2 的 Kinect,我有一些旧 SDK 中的程序想要移植,并且从 msdn 中移植应该很容易。从 SDK 附带的示例中,我觉得我对新功能有了一些不错的了解,我得到了颜色、深度和身体(旧骨架)的工作。现在我只是不想让面部跟踪运行起来。我的问题从这里开始。

如果我想要颜色数据:

_kinectSensor = KinectSensor.GetDefault();            
_colorFrameReader = _kinectSensor.ColorFrameSource.OpenReader();
_colorFrameReader.FrameArrived += _colorFrameReader_FrameArrived;
_kinectSensor.Open();

如果我想要身体数据:

_bodyFrameReader = _kinectSensor.BodyFrameSource.OpenReader();
bodyFrameReader.FrameArrived += this.Reader_FrameArrived;
_kinectSensor.Open();

但如果我想获取人脸数据,我从来没有得到回调:

var faceFrameSource = new FaceFrameSource(KinectSensor.GetDefault());
_faceFrameReader = faceFrameSource.OpenReader();
_faceFrameReader.FrameArrived +=_faceFrameReader_FrameArrived;
_kinectSensor.Open();

谁能帮助我了解如何让面部跟踪在 kinect v2 sdk 中工作?

【问题讨论】:

  • 我的英语这么差,还是我需要重新提出我的问题,请留下评论而不是仅仅投反对票:)
  • 你定义了应该读取哪些faceframefeatures?并且faceframesource的trackingid应该是bodytrackingid
  • @Mark 不,我没有添加 bodytrackingId 或 faceframefeatures。添加它们后,我得到了事件,但他们没有得到任何数据。然后我找到了这篇文章,我必须在其中做一些后期构建事件:kinectingforwindows.com

标签: c# kinect


【解决方案1】:

我找到了一个基于@Marks cmets 的解决方案,以及这篇帖子:http://www.kinectingforwindows.com/

我首先需要设置 trackingId 和 faceframwfeatures,当我得到一个被跟踪的身体时我会这样做:

private void bodyFrameReader_FrameArrived(object sender, BodyFrameArrivedEventArgs e)
    {
        var dataReceived = false;

        using (var bodyFrame = e.FrameReference.AcquireFrame())
        {
            if (bodyFrame != null)
            {
                if (_bodies == null)
                {
                    _bodies = new Body[bodyFrame.BodyCount];
                }
                bodyFrame.GetAndRefreshBodyData(_bodies);
                dataReceived = true;
            }
        }

        if (dataReceived)
        {
            foreach (var body in _bodies)
            {
                if(!body.IsTracked)
                    continue;

                if (_player == null)
                    PlayerFound(body);                    
            }
        }
    }

PlayTracked 将 _player 设置为 body,并开始 facetracking:

private void PlayerFound(Body body)
    {
        _player = body;
        StartFaceTracting(body);
    }

然后开始跟踪:

private void StartFaceTracting(Body body)
    {
        // Face
        _faceFrameSource = new FaceFrameSource(KinectSensor.GetDefault())
        {
            FaceFrameFeatures = FaceFrameFeatures.BoundingBoxInColorSpace | FaceFrameFeatures.PointsInColorSpace,
            TrackingId = body.TrackingId
        };

        _faceFrameSource.TrackingIdLost += _faceFrameSource_TrackingIdLost;

        _faceFrameReader = _faceFrameSource.OpenReader();
        _faceFrameReader.FrameArrived += _faceFrameReader_FrameArrived;
        Log.Info("Facetracking strated Id: " + body.TrackingId);
    }

然后我需要最后一个非常重要的事情,即构建后事件,即将 NuiDatabase 复制到我安装时的输出文件夹:“C:\Program Files (x86)\Microsoft SDKs\Windows\v8. 0\ExtensionSDKs\Microsoft.Kinect.Face\2.0\Redist\CommonConfiguration\x64\NuiDatabase”:

在我让后期构建事件运行后,我在 FaceFrame 中获得了数据 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多