void initialize()
    {
        IsFaceModelCollectCompleted = false;
        FaceCaptureStatus           = "";
        FaceVertices = new List <CameraSpacePoint>();

        sensor = KinectSensor.GetDefault();
        if (sensor == null)
        {
            return;
        }
        sensor.Open();

        bodySource = sensor.BodyFrameSource;
        bodyReader = bodySource.OpenReader();

        hdFaceFrameSource = HighDefinitionFaceFrameSource.Create(sensor);
        hdFaceFrameReader = hdFaceFrameSource.OpenReader();

        faceModel     = FaceModel.Create();
        faceAlignment = FaceAlignment.Create();
        FaceModelBuilderAttributes attributes = FaceModelBuilderAttributes.None;

        faceModelBuilder = hdFaceFrameSource.OpenModelBuilder(attributes);
        faceModelBuilder.CollectFaceDataAsync(collectFaceModelCompleted, collectFaceModelFailed);
    }
Beispiel #2
0
 private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
 {
     if (faceModelBuilder != null)
     {
         faceModelBuilder.Dispose();
         faceModelBuilder = null;
     }
     if (hdFaceFrameReader != null)
     {
         hdFaceFrameReader.Dispose();
         hdFaceFrameReader = null;
     }
     if (bodyFrameReader != null)
     {
         bodyFrameReader.Dispose();
         bodyFrameReader = null;
     }
     if (faceModel != null)
     {
         faceModel.Dispose();
         faceModel = null;
     }
     if (kinect != null)
     {
         kinect.Close();
         kinect = null;
     }
 }
Beispiel #3
0
 /// <summary>
 /// Cancel the current face capture operation
 /// </summary>
 private void StopCollecting()
 {
     if (this.faceModelBuilder != null)
     {
         this.faceModelBuilder.Dispose();
         this.faceModelBuilder = null;
     }
 }
 void collectFaceModelCompleted(FaceModelData faceModelData)
 {
     print("Model created!");
     faceModel = faceModelData.ProduceFaceModel();
     faceModelBuilder.Dispose();
     faceModelBuilder            = null;
     IsFaceModelCollectCompleted = true;
 }
 /// <summary>
 /// Cancel the current face capture operation
 /// </summary>
 private void StopFaceCapture()
 {
     if (this.faceModelBuilder != null)
     {
         this.faceModelBuilder.Dispose();
         this.faceModelBuilder = null;
     }
 }
Beispiel #6
0
        private void HdFaceBuilder_CollectionCompleted(object sender, FaceModelBuilderCollectionCompletedEventArgs e)
        {
            var modelData = e.ModelData;

            this.faceModel = modelData.ProduceFaceModel();

            this.faceModelBuilder.Dispose();
            this.faceModelBuilder = null;
        }
Beispiel #7
0
        void faceModelBuilder_CollectionCompleted(object sender, FaceModelBuilderCollectionCompletedEventArgs e)
        {
            var modelData = e.ModelData;

            faceModel = modelData.ProduceFaceModel();
            produced  = true;

            faceModelBuilder.Dispose();
            faceModelBuilder = null;
        }
Beispiel #8
0
        public override void StopSensor()
        {
            if (_faceModelBuilder != null)
            {
                _faceModelBuilder.Dispose();
                _faceModelBuilder = null;
            }

            base.StopSensor();
        }
Beispiel #9
0
        public void StartCollecting()
        {
            this.StopCollecting();

            this.faceModelBuilder = this.highDefinitionFaceFrameSource.OpenModelBuilder(FaceModelBuilderAttributes.None);

            this.faceModelBuilder.BeginFaceDataCollection();

            this.faceModelBuilder.CollectionCompleted += this.HdFaceBuilder_CollectionCompleted;
        }
        /// <summary>
        /// This event fires when the face capture operation is completed
        /// </summary>
        /// <param name="sender">object sending the event</param>
        /// <param name="e">event arguments</param>
        private void HdFaceBuilder_CollectionCompleted(object sender, FaceModelBuilderCollectionCompletedEventArgs e)
        {
            var modelData = e.ModelData;

            this.currentFaceModel = modelData.ProduceFaceModel();

            this.faceModelBuilder.Dispose();
            this.faceModelBuilder = null;

            this.CurrentBuilderStatus = "Capture Complete";
        }
Beispiel #11
0
        /// <summary>
        /// Disposes the face model builder
        /// </summary>
        private void DisposeFaceModelBuilder()
        {
            var localFmb = this.fmb;

            this.fmb = null;

            if (localFmb != null)
            {
                localFmb.CollectionCompleted -= this.FaceModelBuilderCollectionCompleted;
                localFmb.Dispose();
            }
        }
        /// <summary>
        /// Start a face capture operation
        /// </summary>
        private void StartCapture()
        {
            this.StopFaceCapture();

            this.faceModelBuilder = null;

            this.faceModelBuilder = this.highDefinitionFaceFrameSource.OpenModelBuilder(FaceModelBuilderAttributes.None);

            this.faceModelBuilder.BeginFaceDataCollection();

            this.faceModelBuilder.CollectionCompleted += this.HdFaceBuilder_CollectionCompleted;
        }
Beispiel #13
0
        public void Evaluate(int SpreadMax)
        {
            if (first)
            {
                var vertices = this.faceModel.CalculateVerticesForAlignment(this.faceAlignment);
                this.FOutVertices.SliceCount = vertices.Count;

                this.FOutIndices.SliceCount = this.faceModel.TriangleIndices.Count;
                this.FOutIndices.AssignFrom(this.faceModel.TriangleIndices);
                this.first = false;
            }

            if (this.FInvalidateConnect)
            {
                if (this.FInRuntime.PluginIO.IsConnected)
                {
                    //Cache runtime node
                    this.runtime = this.FInRuntime[0];

                    this.runtime.SkeletonFrameReady += SkeletonReady;

                    if (runtime != null)
                    {
                        for (int i = 0; i < this.faceFrameSources.Length; i++)
                        {
                            this.faceFrameSources[i] = new HighDefinitionFaceFrameSource(this.runtime.Runtime);
                            this.faceFrameReaders[i] = this.faceFrameSources[i].OpenReader();
                            this.faceFrameReaders[i].FrameArrived += this.faceReader_FrameArrived;
                        }

                        this.faceModelBuilder = this.faceFrameSources[0].OpenModelBuilder(FaceModelBuilderAttributes.None);

                        this.faceModelBuilder.BeginFaceDataCollection();

                        this.faceModelBuilder.CollectionCompleted += this.HdFaceBuilder_CollectionCompleted;
                    }
                }
                else
                {
                    this.runtime.SkeletonFrameReady -= SkeletonReady;
                    for (int i = 0; i < this.faceFrameSources.Length; i++)
                    {
                        this.faceFrameReaders[i].FrameArrived -= this.faceReader_FrameArrived;
                        this.faceFrameReaders[i].Dispose();
                        //this.faceFrameSources[i].Dispose();
                    }
                }

                this.FInvalidateConnect = false;
            }

            this.FOutVertices.Flush(true);
        }
Beispiel #14
0
        /// <summary>
        /// センサーから骨格データを受け取り処理します
        /// </summary>
        private void OnMultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
        {
            var frame = e.FrameReference.AcquireFrame();

            if (frame == null)
            {
                return;
            }

            // BodyFrameに関してフレームを取得する
            using (var bodyFrame = frame.BodyFrameReference.AcquireFrame())
            {
                if (bodyFrame != null)
                {
                    if (bodies == null)
                    {
                        bodies = new Body[bodyFrame.BodyCount];
                    }

                    // 骨格データを格納
                    bodyFrame.GetAndRefreshBodyData(bodies);

                    // FaceTrackingが開始されていないか確認
                    if (!this.hdFaceFrameSource.IsTrackingIdValid)
                    {
                        // トラッキング先の骨格を選択

                        var target = (from body in this.bodies where body.IsTracked select body).FirstOrDefault();
                        if (target != null)
                        {
                            // 検出されたBodyに対してFaceTrackingを行うよう、FaceFrameSourceを設定
                            hdFaceFrameSource.TrackingId = target.TrackingId;
                            // FaceModelBuilderを初期化
                            if (this.faceModelBuilder != null)
                            {
                                this.faceModelBuilder.Dispose();
                                this.faceModelBuilder = null;
                            }
                            this.faceModelBuilder = this.hdFaceFrameSource.OpenModelBuilder(DefaultAttributes);
                            // FaceModelBuilderがモデルの構築を完了した時に発生するイベント
                            this.faceModelBuilder.CollectionCompleted += this.OnModelBuilderCollectionCompleted;
                            // FaceModelBuilderの状態を報告するイベント
                            this.faceModelBuilder.CaptureStatusChanged    += faceModelBuilder_CaptureStatusChanged;
                            this.faceModelBuilder.CollectionStatusChanged += faceModelBuilder_CollectionStatusChanged;

                            // キャプチャの開始
                            this.faceModelBuilder.BeginFaceDataCollection();
                        }
                    }
                }
            }
        }
Beispiel #15
0
        // This event fires when the face capture operation is completed

        private void HdFaceBuilder_CollectionCompleted(
            object sender, FaceModelBuilderCollectionCompletedEventArgs e
            )
        {
            var modelData = e.ModelData;

            _currentFaceModel = modelData.ProduceFaceModel();

            _faceModelBuilder.Dispose();
            _faceModelBuilder = null;

            _currentBuilderStatus    = "Capture Complete";
            _currentCollectionStatus = string.Empty;
        }
Beispiel #16
0
        /// <summary>
        /// Cancel the current face capture operation
        /// </summary>
        private void StopFaceCapture()
        {
            if (this.currentModelCollectionOperation != null)
            {
                this.currentModelCollectionOperation.Cancel();
                this.currentModelCollectionOperation = null;
            }

            if (this.faceModelBuilder != null)
            {
                this.faceModelBuilder.CollectionStatusChanged -= this.FaceModelBuilder_CollectionStatusChanged;
                this.faceModelBuilder.CaptureStatusChanged    -= this.FaceModelBuilder_CaptureStatusChanged;
                this.faceModelBuilder.Dispose();
                this.faceModelBuilder = null;
            }
        }
Beispiel #17
0
        public override bool StartSensor()
        {
            _bodySource = _kinect.BodyFrameSource;
            _bodyReader = _bodySource.OpenReader();
            _bodyReader.FrameArrived += BodyReader_FrameArrived;

            _hdFaceFrameSource =
                new HighDefinitionFaceFrameSource(_kinect);
            _hdFaceFrameSource.TrackingIdLost +=
                HdFaceSource_TrackingIdLost;

            _hdFaceFrameReader =
                _hdFaceFrameSource.OpenReader();
            _hdFaceFrameReader.FrameArrived +=
                HdFaceReader_FrameArrived;

            _currentFaceModel     = new FaceModel();
            _currentFaceAlignment = new FaceAlignment();

            InitializeMesh();
            UpdateMesh();

            // Text style for our jig

            _style      = new TextStyle();
            _style.Font =
                new FontDescriptor("standard.shx", false, false, 0, 0);
            _style.TextSize = 10;

            var res = base.StartSensor();

            if (res)
            {
                if (_faceModelBuilder != null)
                {
                    _faceModelBuilder.Dispose();
                }
                _faceModelBuilder =
                    _hdFaceFrameSource.OpenModelBuilder(
                        FaceModelBuilderAttributes.None
                        );
                _faceModelBuilder.BeginFaceDataCollection();
                _faceModelBuilder.CollectionCompleted +=
                    HdFaceBuilder_CollectionCompleted;
            }
            return(res);
        }
Beispiel #18
0
        private void HdFaceSource_TrackingIdLost(object sender, TrackingIdLostEventArgs e)
        {
            var lostTrackingID = e.TrackingId;

            if (currentTrackingId == lostTrackingID)
            {
                currentTrackingId  = 0;
                currentTrackedBody = null;
                if (faceModelBuilder != null)
                {
                    faceModelBuilder.Dispose();
                    faceModelBuilder = null;
                }

                highDefinitionFaceFrameSource.TrackingId = 0;
            }
        }
Beispiel #19
0
        /// <summary>
        /// This event fires when the face capture operation is completed
        /// </summary>
        /// <param name="sender">object sending the event</param>
        /// <param name="e">event arguments</param>
        private void HdFaceBuilder_CollectionCompleted(object sender, FaceModelBuilderCollectionCompletedEventArgs e)
        {
            Log.LogMessage("FaceTracking complete");
            if (OnAskIfCaptured != null)
            {
                OnAskIfCaptured(true, true, true, true, true);
            }

            var modelData = e.ModelData;

            this.currentFaceModel = modelData.ProduceFaceModel();

            this.faceModelBuilder.Dispose();
            this.faceModelBuilder = null;

            //The kinect is done preparing here.
        }
Beispiel #20
0
        // This event is fired when a tracking is lost for a
        // body tracked by HDFace Tracker

        private void HdFaceSource_TrackingIdLost(
            object sender, TrackingIdLostEventArgs e
            )
        {
            var lostTrackingID = e.TrackingId;

            if (_currentTrackingId == lostTrackingID)
            {
                _currentTrackingId  = 0;
                _currentTrackedBody = null;
                if (_faceModelBuilder != null)
                {
                    _faceModelBuilder.Dispose();
                    _faceModelBuilder = null;
                }

                _hdFaceFrameSource.TrackingId = 0;
            }
        }
Beispiel #21
0
        /// <summary>
        /// FaceModelBuilderがモデルの構築を完了したときのイベントを処理します
        /// </summary>
        private void OnModelBuilderCollectionCompleted(object sender, FaceModelBuilderCollectionCompletedEventArgs e)
        {
            var modelData = e.ModelData;

            this.faceModel = modelData.ProduceFaceModel();

            // MeshをUpdate
            UpdateMesh();

            // SkinColorとHairColorの値も更新
            this.SkinColor = UIntToColor(this.faceModel.SkinColor);
            this.HairColor = UIntToColor(this.faceModel.HairColor);

            // 更新を行う
            this.FaceModelBuilderStatus = GetCollectionStatus(((FaceModelBuilder)sender).CollectionStatus);
            this.FaceModelCaptureStatus = ((FaceModelBuilder)sender).CaptureStatus.ToString();

            this.faceModelBuilder.Dispose();
            this.faceModelBuilder = null;
        }
Beispiel #22
0
        public void InitializeKinect()
        {
            m_sensor     = KinectSensor.GetDefault();
            m_bodyReader = m_sensor.BodyFrameSource.OpenReader();
            m_bodyReader.FrameArrived += m_bodyReader_FrameArrived;

            m_hdFaceSource = new HighDefinitionFaceFrameSource(m_sensor);
            m_hdFaceReader = m_hdFaceSource.OpenReader();
            m_hdFaceReader.FrameArrived += m_hdFaceReader_FrameArrived;
            m_faceModel   = new FaceModel();
            m_faceBuilder =
                m_hdFaceReader.HighDefinitionFaceFrameSource.OpenModelBuilder(FaceModelBuilderAttributes.HairColor | FaceModelBuilderAttributes.SkinColor);
            m_faceBuilder.CollectionCompleted     += m_faceBuilder_CollectionCompleted;
            m_faceBuilder.CaptureStatusChanged    += m_faceBuilder_CaptureStatusChanged;
            m_faceBuilder.CollectionStatusChanged += m_faceBuilder_CollectionStatusChanged;
            m_faceAlignment      = new FaceAlignment();
            m_trackedBodyId      = 0;
            m_faceBuilderStarted = false;
            m_faceBuildComplete  = false;
            m_sensor.Open();
        }
Beispiel #23
0
        public Face(KinectSensor sensor, BodyFrameReader bodyReader)
        {
            var bodySource = sensor.BodyFrameSource;

            bodyReader.FrameArrived += BodyReader_FrameArrived;

            highDefinitionFaceFrameSource = new HighDefinitionFaceFrameSource(sensor);
            highDefinitionFaceFrameSource.TrackingIdLost += HdFaceSource_TrackingIdLost;

            highDefinitionFaceFrameReader = highDefinitionFaceFrameSource.OpenReader();
            highDefinitionFaceFrameReader.FrameArrived += HdFaceReader_FrameArrived;

            currentFaceModel     = new FaceModel();
            currentFaceAlignment = new FaceAlignment();

            UpdateMesh();

            faceModelBuilder = highDefinitionFaceFrameSource.OpenModelBuilder(FaceModelBuilderAttributes.None);
            faceModelBuilder.BeginFaceDataCollection();
            faceModelBuilder.CollectionCompleted += HdFaceBuilder_CollectionCompleted;
        }
Beispiel #24
0
        private void InitializeHDFace()
        {
            hdFaceFrameSource = new HighDefinitionFaceFrameSource(kinect);
            if (hdFaceFrameSource == null)
            {
                throw new Exception("Cannot create HD Face Frame Source");
            }
            hdFaceFrameReader = hdFaceFrameSource.OpenReader();
            hdFaceFrameReader.FrameArrived += hdFaceFrameReader_FrameArrived;
            faceModel     = new FaceModel();
            faceAlignment = new FaceAlignment();

            FaceModelBuilderAttributes attributes = FaceModelBuilderAttributes.None;

            faceModelBuilder = hdFaceFrameSource.OpenModelBuilder(attributes);
            if (faceModelBuilder == null)
            {
                throw new Exception("Cannot open Face Model Builder");
            }
            faceModelBuilder.BeginFaceDataCollection();
            faceModelBuilder.CollectionCompleted += faceModelBuilder_CollectionCompleted;
        }
Beispiel #25
0
        /// <summary>
        /// Start a face capture operation
        /// </summary>
        private void StartCapture()
        {
            if (this.currentModelCollectionOperation != null)
            {
                this.StopFaceCapture();
            }

            this.faceModelBuilder = this.highDefinitionFaceFrameSource.OpenModelBuilder(FaceModelBuilderAttributes.None);
            this.faceModelBuilder.CollectionStatusChanged += this.FaceModelBuilder_CollectionStatusChanged;
            this.faceModelBuilder.CaptureStatusChanged    += this.FaceModelBuilder_CaptureStatusChanged;

            this.currentModelCollectionOperation           = this.faceModelBuilder.CollectFaceDataAsync();
            this.currentModelCollectionOperation.Completed = new AsyncOperationCompletedHandler <FaceModelData>((IAsyncOperation <FaceModelData> asyncOp, AsyncStatus status) =>
            {
                if (status == AsyncStatus.Completed)
                {
                    using (var modelData = asyncOp.GetResults())
                    {
                        this.currentFaceModel = modelData.ProduceFaceModel();
                    }

                    this.StopFaceCapture();
                    currentCaptureStatusString    = "Capture Complete";
                    currentCollectionStatusString = "";
                }
                else if (status == AsyncStatus.Error)
                {
                    this.StopFaceCapture();
                    currentCaptureStatusString    = "Error collecting face data!";
                    currentCollectionStatusString = "";
                }
                else
                {
                    this.StopFaceCapture();
                    currentCaptureStatusString    = "Collecting face data incomplete!";
                    currentCollectionStatusString = "";
                }
            });
        }
Beispiel #26
0
        /// <summary>
        /// Handles face frame updates
        /// </summary>
        private void FaceFrameArrived(object sender, HighDefinitionFaceFrameArrivedEventArgs e)
        {
            ulong?newTrackingId = null;

            using (var frame = e.FrameReference.AcquireFrame())
            {
                if (frame != null)
                {
                    if (frame.IsTrackingIdValid && frame.IsFaceTracked)
                    {
                        frame.GetAndRefreshFaceAlignmentResult(this.faceAlignment);
                        this.faceModel = frame.FaceModel;
                        newTrackingId  = frame.TrackingId;
                    }
                }
            }

            if (this.Processors.Any(x => x.RequiresFaceModelBuilder) && newTrackingId.HasValue && this.currentTrackingId != newTrackingId)
            {
                lock (this.processFaceModelMutex)
                {
                    this.currentTrackingId    = newTrackingId;
                    this.faceModel            = null;
                    this.constructedFaceModel = null;
                    this.DisposeFaceModelBuilder();
                    this.fmb = this.faceSource.OpenModelBuilder(FaceModelBuilderAttributes.HairColor | FaceModelBuilderAttributes.SkinColor);
                    this.fmb.BeginFaceDataCollection();
                    this.fmb.CollectionCompleted += this.FaceModelBuilderCollectionCompleted;
                }
            }

            lock (this)
            {
                this.faceReady = true;
                this.StartWorkerIfReady();
            }
        }