public void updateData(PXCMFaceData.Face face)
        {
            if (face == null)
            {
                return;
            }
            PXCMFaceData.LandmarksData ldata = face.QueryLandmarks();
            if (ldata == null)
            {
                return;
            }

            PXCMRectI32 rect;

            face.QueryDetection().QueryBoundingRect(out rect);

            PXCMFaceData.LandmarkPoint[] points;
            ldata.QueryPoints(out points);
            if (points == null || points.Length == 0)
            {
                return;
            }

            for (int i = 0; i < 78; i++)
            {
                landmarksData[i].x = points[i].image.x - rect.x;
                landmarksData[i].y = points[i].image.y - rect.y;
                landmarksData[i].z = points[i].world.z;
            }
        }
Beispiel #2
0
        /// <summary>
        /// 保存筛选32点的数据
        /// </summary>
        /// <param name="qface"></param>
        /// <param name="frameCount"></param>
        private void Savedata_less(PXCMFaceData.Face qface, int frameCount)
        {
            ////zz

            PXCMFaceData.PoseData        posedata = qface.QueryPose();
            PXCMFaceData.LandmarksData   Idata    = qface.QueryLandmarks();
            PXCMFaceData.LandmarkPoint[] points;
            PXCMFaceData.PoseEulerAngles angles;
            PXCMFaceData.HeadPosition    headpostion;

            posedata.QueryPoseAngles(out angles);
            posedata.QueryHeadPosition(out headpostion);
            Idata.QueryPoints(out points);

            string time = DateTime.Now.ToString("yyyy-MM-dd") + " " + DateTime.Now.ToString("hh:mm:ss:fff");

            sw_less.Write(frameCount.ToString().PadRight(5) + '\t' + time + '\t' + expressionNumber.ToString() + '\t');

            int[] a = new int[32] {
                76, 77, 12, 16, 14, 10, 20, 24, 18, 22, 71, 0, 4, 74, 5, 9, 29, 26, 31, 30, 32, 39, 33, 47, 46, 48, 51, 52, 50, 56, 66, 61
            };
            int t = 0;

            for (int i = 0; i < 32; i++)
            {
                //string LandmarkPointName = "points[a[t]].source.index";
                string LandmarkPointName = MarkPointName(points[a[t]].source.index);
                float  Positionworld_x   = points[a[t]].world.x;
                float  Positionworld_y   = points[a[t]].world.y;
                float  Positionworld_z   = points[a[t]].world.z;

                float PositionImage_x = points[a[t]].image.x;
                float PositionImage_y = points[a[t++]].image.y;

                sw_less.Write((a[i]).ToString() + '\t'
                              + LandmarkPointName.ToString() + '\t'
                              + Positionworld_x.ToString().PadRight(25) + '\t'
                              + Positionworld_y.ToString().PadRight(25) + '\t'
                              + Positionworld_z.ToString().PadRight(25) + '\t'
                              + PositionImage_x.ToString().PadRight(25) + '\t'
                              + PositionImage_y.ToString().PadRight(25) + '\t');
            }

            float HeadCenter_x = headpostion.headCenter.x;
            float HeadCenter_y = headpostion.headCenter.y;
            float HeadCenter_z = headpostion.headCenter.z;

            float PoseEulerAngles_pitch = angles.pitch;
            float PoseEulerAngles_roll  = angles.roll;
            float PoseEulerAngles_yaw   = angles.yaw;

            sw_less.Write(HeadCenter_x.ToString().PadRight(25) + '\t'
                          + HeadCenter_y.ToString().PadRight(25) + '\t'
                          + HeadCenter_z.ToString().PadRight(25) + '\t'
                          + PoseEulerAngles_pitch.ToString().PadRight(25) + '\t'
                          + PoseEulerAngles_roll.ToString().PadRight(25) + '\t'
                          + PoseEulerAngles_yaw.ToString().PadRight(25) + '\t');

            sw_less.WriteLine();
        }
        public override void Work(Graphics g)
        {
            data = module.CreateOutput();
            data.Update();
            // Get the number of tracked faces
            Int32 nfaces = data.QueryNumberOfDetectedFaces();

            Console.WriteLine("Number of faces : " + nfaces);
            for (Int32 i = 0; i < nfaces; i++)
            {
                // all faces in the picture

                PXCMFaceData.Face face = data.QueryFaceByIndex(i);

                //face location
                PXCMFaceData.DetectionData ddata = face.QueryDetection();

                // Retrieve the face landmark data instance

                PXCMFaceData.Face          landmark = data.QueryFaceByIndex(i);
                PXCMFaceData.LandmarksData ldata    = landmark.QueryLandmarks();



                // work on DetectionData

                PXCMRectI32 rect;
                ddata.QueryBoundingRect(out rect);

                //draw rect
                Rectangle rectangle = new Rectangle(rect.x, rect.y, rect.w, rect.h); // Convert to Rectangle
                g.DrawRectangle(pen, rectangle);                                     // Draw



                // get the landmark data
                PXCMFaceData.LandmarkPoint[] points;
                ldata.QueryPoints(out points);



                //g.DrawImage(points[0].image,);

                for (Int32 j = 0; j < points.Length; j++)
                {
                    //Point p = new Point();
                    // p = points[0].ToString;
                    Point p = new Point();
                    p.X = (int)points[j].image.x;
                    p.Y = (int)points[j].image.y;

                    g.DrawEllipse(pen, points[j].image.x, points[j].image.y, 2, 2);
                }
            }
            data.Dispose();
        }
Beispiel #4
0
        private void ElaborateSample(PXCMCapture.Sample sample, PXCMFaceData.Face face)
        {
            if (sample == null)
            {
                return;
            }

            WriteableBitmap imageRGB = null;

            if (sample.color != null)
            {
                imageRGB = sample.color.GetImage();
            }

            if (face != null)
            {
                PXCMFaceData.LandmarksData   landmarkData   = face.QueryLandmarks();
                PXCMFaceData.LandmarkPoint[] landmarkPoints = null;
                if (landmarkData.QueryPoints(out landmarkPoints))
                {
                    foreach (var point in landmarkPoints)
                    {
                        if (point.confidenceImage > 50)
                        {
                            if (point.source.alias != PXCMFaceData.LandmarkType.LANDMARK_NOT_NAMED)
                            {
                                imageRGB.FillEllipseCentered((int)point.image.x, (int)point.image.y, 4, 4, Colors.White);
                            }
                            else
                            {
                                imageRGB.FillEllipseCentered((int)point.image.x, (int)point.image.y, 4, 4, Colors.Yellow);
                            }
                        }
                    }
                }
            }

            if (imageRGB != null)
            {
                imageRGB.Freeze();
            }

            Dispatcher.Invoke(() =>
            {
                this.ImageRGB = imageRGB;
            });

            Process.GetCurrentProcess();
        }
Beispiel #5
0
 private void TrackFace(PXCMFaceData.Face face)
 {
     PXCMFaceData.LandmarksData landmarksData = face.QueryLandmarks();
     if (landmarksData == null)
     {
         return;
     }
     PXCMFaceData.LandmarkPoint[] facePoints;
     landmarksData.QueryPoints(out facePoints);
     if (facePoints == null)
     {
         return;
     }
     SetLandmarkPoint(landmarksData, facePoints, PXCMFaceData.LandmarkType.LANDMARK_UPPER_LIP_CENTER, _camera.Face.Mouth);
     SetLandmarkPoint(landmarksData, facePoints, PXCMFaceData.LandmarkType.LANDMARK_EYE_LEFT_CENTER, _camera.Face.LeftEye);
     SetLandmarkPoint(landmarksData, facePoints, PXCMFaceData.LandmarkType.LANDMARK_EYE_RIGHT_CENTER, _camera.Face.RightEye);
     SetLandmarkPoint(landmarksData, facePoints, PXCMFaceData.LandmarkType.LANDMARK_NOSE_TOP, _camera.Face);
 }
Beispiel #6
0
        private void TrackFace(PXCMFaceData.Face face)
        {
            //PXCMFaceData.HeadPosition position;
            //face.QueryPose().QueryHeadPosition(out position);
            //PXCMRectI32 rect;
            //face.QueryDetection().QueryBoundingRect(out rect);
            //var point = new Point3D(rect.x + rect.w / 2, rect.y + rect.h / 2);
            //_camera.Face.Position = CreatePosition(point, new Point3D());
            //_camera.Face.Position = CreatePosition(position.headCenter.ToPoint3D(), );

            PXCMFaceData.LandmarksData landmarksData = face.QueryLandmarks();
            if (landmarksData == null)
            {
                return;
            }
            PXCMFaceData.LandmarkPoint[] facePoints;
            landmarksData.QueryPoints(out facePoints);
            if (facePoints == null)
            {
                return;
            }
            foreach (var item in facePoints)
            {
                switch (item.source.alias)
                {
                case PXCMFaceData.LandmarkType.LANDMARK_UPPER_LIP_CENTER:
                    _camera.Face.Mouth.Position = CreatePosition(item.image.ToPoint3D(), item.world.ToPoint3D());
                    break;

                case PXCMFaceData.LandmarkType.LANDMARK_EYE_LEFT_CENTER:
                    _camera.Face.LeftEye.Position = CreatePosition(item.image.ToPoint3D(), item.world.ToPoint3D());
                    break;

                case PXCMFaceData.LandmarkType.LANDMARK_EYE_RIGHT_CENTER:
                    _camera.Face.RightEye.Position = CreatePosition(item.image.ToPoint3D(), item.world.ToPoint3D());
                    break;

                case PXCMFaceData.LandmarkType.LANDMARK_NOSE_TOP:
                    _camera.Face.Position = CreatePosition(item.image.ToPoint3D(), item.world.ToPoint3D());
                    break;
                }
            }
        }
        public void DrawLandmark(PXCMFaceData.Face face)
        {
            if (isRegisteredDetected(face))
            {
                Debug.Assert(face != null);
                PXCMFaceData.LandmarksData landmarks = face.QueryLandmarks();
                if (m_bitmap == null || !Landmarks.Checked || landmarks == null)
                {
                    return;
                }

                lock (m_bitmapLock)
                {
                    using (Graphics graphics = Graphics.FromImage(m_bitmap))
                        using (var brush = new SolidBrush(Color.White))
                            using (var lowConfidenceBrush = new SolidBrush(Color.Red))
                                using (var font = new Font(FontFamily.GenericMonospace, m_faceTextOrganizer.FontSize, FontStyle.Bold))
                                {
                                    PXCMFaceData.LandmarkPoint[] points;
                                    bool res = landmarks.QueryPoints(out points);
                                    Debug.Assert(res);

                                    var point = new PointF();

                                    foreach (PXCMFaceData.LandmarkPoint landmark in points)
                                    {
                                        point.X = landmark.image.x + LandmarkAlignment;
                                        point.Y = landmark.image.y + LandmarkAlignment;

                                        if (landmark.confidenceImage == 0)
                                        {
                                            graphics.DrawString("x", font, lowConfidenceBrush, point);
                                        }
                                        else
                                        {
                                            graphics.DrawString("•", font, brush, point);
                                        }
                                    }
                                }
                }
            }
        }
        public override void Work(Graphics g)
        {
            if (model.FaceAktuell != null)
            {
                // get the landmark data
                PXCMFaceData.LandmarksData   ldata = model.FaceAktuell.QueryLandmarks();
                PXCMFaceData.LandmarkPoint[] points;
                ldata.QueryPoints(out points);

                //Draw points
                for (Int32 j = 0; j < points.Length; j++)
                {
                    Point p = new Point();
                    p.X = (int)points[j].image.x;
                    p.Y = (int)points[j].image.y;

                    g.DrawEllipse(pen, points[j].image.x, points[j].image.y, 2, 2);
                }
            }
        }
Beispiel #9
0
        private void SaveFeature(PXCMFaceData.Face qface, int frameCount)
        {
            PXCMFaceData.LandmarksData   ldata = qface.QueryLandmarks();
            PXCMFaceData.ExpressionsData edata = qface.QueryExpressions();
            PXCMRectI32 rect;
            // get the landmark data
            var landmarkGroupTypes = Enum.GetValues(typeof(PXCMFaceData.LandmarksGroupType)).Cast <PXCMFaceData.LandmarksGroupType>();

            qface.QueryDetection().QueryBoundingRect(out rect);
            //保存时间戳
            string time = DateTime.Now.ToString("yyyy-MM-dd") + " " + DateTime.Now.ToString("HH:mm:ss:fff");

            sw_feature.Write(frameCount.ToString() + ' ' + time + ' ');
            // 对于每个LandmarkPoint转换成成员变量中的world属性

            PXCMFaceData.LandmarkPoint[] points;
            ldata.QueryPoints(out points);
            for (int i = 0; i < 78; i++)
            {
                //把脸部特征放入数组中
                double position_x = Math.Round(points[i].image.x - rect.x, 4);
                double position_y = Math.Round(points[i].image.y - rect.y, 4);
                double position_z = Math.Round(points[i].world.z, 5);
                sw_feature.Write(position_x.ToString() + ' ' + position_y.ToString() + ' ' + position_z.ToString() + ' ');
            }
            for (int i = 0; i < 22; i++)
            {
                double emotion = 0;
                if (edata != null)
                {
                    PXCMFaceData.ExpressionsData.FaceExpressionResult score;
                    edata.QueryExpression((PXCMFaceData.ExpressionsData.FaceExpression)i, out score);
                    Expression.facialExpressionIndensity[i] = score.intensity;
                    emotion = score.intensity;
                }
                sw_feature.Write(emotion.ToString() + ' ');
            }
            sw_feature.WriteLine();
        }
Beispiel #10
0
        private void TrackFace(PXCMFaceData.Face face)
        {
            PXCMRectI32 rect;

            face.QueryDetection().QueryBoundingRect(out rect);
            var point = new Point3D(rect.x + rect.w / 2, rect.y + rect.h / 2);

            Face.Position = CreatePosition(point, new Point3D());

            PXCMFaceData.LandmarksData landmarksData = face.QueryLandmarks();
            if (landmarksData == null)
            {
                return;
            }
            PXCMFaceData.LandmarkPoint[] facePoints;
            landmarksData.QueryPoints(out facePoints);
            if (facePoints == null)
            {
                return;
            }
            foreach (var item in facePoints)
            {
                switch (item.source.alias)
                {
                case PXCMFaceData.LandmarkType.LANDMARK_UPPER_LIP_CENTER:
                    Face.Mouth.Position = CreatePosition(ToPoint3D(item.image), ToPoint3D(item.world));
                    break;

                case PXCMFaceData.LandmarkType.LANDMARK_EYE_LEFT_CENTER:
                    Face.LeftEye.Position = CreatePosition(ToPoint3D(item.image), ToPoint3D(item.world));
                    break;

                case PXCMFaceData.LandmarkType.LANDMARK_EYE_RIGHT_CENTER:
                    Face.RightEye.Position = CreatePosition(ToPoint3D(item.image), ToPoint3D(item.world));
                    break;
                }
            }
        }
Beispiel #11
0
        //zz
        private void Savedata(PXCMFaceData faceOutput)
        {
            ////zz
            PXCMFaceData.Face            qface    = faceOutput.QueryFaceByIndex(0);
            PXCMFaceData.PoseData        posedata = qface.QueryPose();
            PXCMFaceData.LandmarksData   Idata    = qface.QueryLandmarks();
            PXCMFaceData.LandmarkPoint[] points;
            PXCMFaceData.PoseEulerAngles angles;
            PXCMFaceData.HeadPosition    headpostion;

            posedata.QueryPoseAngles(out angles);
            posedata.QueryHeadPosition(out headpostion);
            Idata.QueryPoints(out points);


            string connSting;

            connSting = "server=localhost;database=RealSense;Integrated Security=True ";
            SqlConnection sConn = new SqlConnection(connSting);

            try
            {
                sConn.Open();
            }
            catch (Exception ex)
            {
                Console.WriteLine("链接错误:" + ex.Message);
            }

            int[] a = new int[32] {
                76, 77, 12, 16, 14, 10, 20, 24, 18, 22, 70, 0, 4, 7, 5, 9, 29, 26, 31, 30, 32, 39, 33, 47, 46, 48, 51, 52, 50, 56, 65, 61
            };
            int t = 0;

            for (int i = 0; i < 32; i++)
            {
                string sql_Insert;

                string times = DateTime.Now.ToString("yyyy-MM-dd") + " " + DateTime.Now.ToString("hh:mm:ss");

                string LandmarkPointName = MarkPointName(points[a[t]].source.index);

                float Positionworld_x = points[a[t]].world.x;
                float Positionworld_y = points[a[t]].world.y;
                float Positionworld_z = points[a[t]].world.z;

                float PositionImage_x = points[a[t]].image.x;
                float PositionImage_y = points[a[t++]].image.y;

                float HeadCenter_x = headpostion.headCenter.x;
                float HeadCenter_y = headpostion.headCenter.y;
                float HeadCenter_z = headpostion.headCenter.z;

                float PoseEulerAngles_pitch = angles.pitch;
                float PoseEulerAngles_roll  = angles.roll;
                float PoseEulerAngles_yaw   = angles.yaw;

                sql_Insert = "insert into FaceData(time,LandmarkPointName,[Positionworld.x],[Positionworld.y],[Positionworld.z],[PositionImage.x],[PositionImage.y],[HeadCenter.x],[HeadCenter.y],[HeadCenter.z],[PoseEulerAngles.pitch],[PoseEulerAngles.roll],[PoseEulerAngles.yaw])values('"
                             + times + "','"
                             + LandmarkPointName + "','"
                             + Positionworld_x + "','"
                             + Positionworld_y + "','"
                             + Positionworld_z + "','"
                             + PositionImage_x + "','"
                             + PositionImage_y + "','"
                             + HeadCenter_x + "','"
                             + HeadCenter_y + "','"
                             + HeadCenter_z + "','"
                             + PoseEulerAngles_pitch + "','"
                             + PoseEulerAngles_roll + "','"
                             + PoseEulerAngles_yaw + "')";

                SqlCommand sCmd = new SqlCommand(sql_Insert, sConn);
                sCmd.ExecuteNonQuery();
            }


            sConn.Close();
        }
Beispiel #12
0
        private void ProcessingThread()
        {
            string videoName, nameColor, nameDepth, nameIr;
            int    width  = 640;
            int    height = 480;

            int       frameIndex      = 0;
            string    formatImageFile = ".png";
            int       nframes         = 0;
            int       lostFrames      = 0;
            string    landmarks       = null;
            long      frameTimeStamp  = 0;
            PXCMImage color;
            PXCMImage depth;
            PXCMImage ir;

            PXCMCapture.Sample    sample;
            PXCMImage.ImageData   imageColor;
            PXCMImage.ImageData   imageDepth;
            PXCMImage.ImageData   imageIr;
            WriteableBitmap       wbm1, wbm2, wbm3;
            Int32Rect             rect2crop;
            PXCMFaceModule        faceModule;
            PXCMFaceConfiguration faceConfig;
            PXCMFaceData          faceData = null;
            //Offset Cropped rectangle
            Offset offset = new Offset(0, 0, 0, 0);

            //For each directory, extract all landmarks or images streams from all videos
            foreach (var dir in dirsSource)
            {
                //If the folder is not empty
                if (Directory.EnumerateFileSystemEntries(dir).Any())
                {
                    dictPaths.TryGetValue(dir, out paths); //This dict contains all source and output dirs
                    List <string> fileList = new List <string>(Directory.GetFiles(dir, "*.rssdk"));
                    //For each video
                    foreach (var inputFile in fileList)
                    {
                        lostFrames = 0;
                        videoName  = inputFile.Split('\\').Last().Split('.')[0];
                        // Create a SenseManager instance
                        sm = PXCMSenseManager.CreateInstance();
                        // Recording mode: true
                        // Playback mode: false
                        // Settings for playback mode (read rssdk files and extract frames)
                        sm.captureManager.SetFileName(inputFile, false);
                        sm.captureManager.SetRealtime(false);
                        nframes = sm.captureManager.QueryNumberOfFrames();

                        //Update in realtime the current extraction
                        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                        {
                            textBox2.Text = nframes.ToString();
                            textBox3.Text = String.Format("Record: {0}\nVideo: {1}", paths.root, videoName);
                        }));

                        sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR, width, height, 0);
                        sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_DEPTH, width, height);
                        sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_IR, width, height);

                        //Extract Landmarks
                        sm.EnableFace();
                        faceModule = sm.QueryFace();
                        faceConfig = faceModule.CreateActiveConfiguration();
                        faceConfig.landmarks.maxTrackedFaces = 1;
                        faceConfig.landmarks.isEnabled       = true;
                        faceConfig.detection.maxTrackedFaces = 1;
                        faceConfig.detection.isEnabled       = true;
                        faceConfig.EnableAllAlerts();
                        faceConfig.ApplyChanges();

                        sm.Init();

                        // This string stores all data before saving to csv file
                        landmarks = null;
                        // Start AcquireFrame/ReleaseFrame loop
                        var stopwatch = new Stopwatch();
                        stopwatch.Start();

                        while (sm.AcquireFrame(true) >= pxcmStatus.PXCM_STATUS_NO_ERROR)
                        {
                            // Retrieve face data
                            faceModule = sm.QueryFace();
                            frameIndex = sm.captureManager.QueryFrameIndex();
                            if (faceModule != null)
                            {
                                // Retrieve the most recent processed data
                                faceData = faceModule.CreateOutput();
                                faceData.Update();
                            }
                            if (faceData != null)
                            {
                                Int32 nfaces = faceData.QueryNumberOfDetectedFaces();

                                frameTimeStamp = sm.captureManager.QueryFrameTimeStamp();
                                //PXCMCapture.Sample sample = senseManager.QuerySample();
                                if (nfaces == 0) //If none face was detected, we will consider as a "lost frame"
                                {
                                    lostFrames += 1;
                                }
                                for (Int32 i = 0; i < nfaces; i++)
                                {
                                    //Retrieve the image
                                    sample = sm.QuerySample();
                                    // Work on the images
                                    color = sample.color;
                                    depth = sample.depth;
                                    ir    = sample.ir;

                                    PXCMFaceData.Face          face         = faceData.QueryFaceByIndex(i);
                                    PXCMFaceData.LandmarksData landmarkData = face.QueryLandmarks();
                                    PXCMFaceData.DetectionData ddata        = face.QueryDetection();
                                    PXCMFaceData.PoseData      poseData     = face.QueryPose();
                                    poseData.QueryHeadPosition(out PXCMFaceData.HeadPosition headPosition);
                                    poseData.QueryPoseAngles(out PXCMFaceData.PoseEulerAngles poseEulerAngles);
                                    Debug.WriteLine(headPosition.headCenter.x + " " + headPosition.headCenter.y + " " + headPosition.headCenter.z + " " + poseEulerAngles.pitch + " " + poseEulerAngles.roll + " " + poseEulerAngles.yaw);

                                    //Rectangle coordenates from detected face
                                    ddata.QueryBoundingRect(out PXCMRectI32 rect);

                                    //See the offset struct to define the values
                                    rect2crop = new Int32Rect(rect.x + offset.x, rect.y + offset.y, rect.w + offset.w, rect.h + offset.h);
                                    ddata.QueryFaceAverageDepth(out Single depthDistance);

                                    color.AcquireAccess(PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_RGB32, out imageColor);
                                    depth.AcquireAccess(PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_DEPTH_RAW, out imageDepth);
                                    ir.AcquireAccess(PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_RGB24, out imageIr);

                                    //Convert it to Bitmap
                                    wbm1 = imageColor.ToWritableBitmap(0, color.info.width, color.info.height, 100.0, 100.0);
                                    wbm2 = imageDepth.ToWritableBitmap(0, depth.info.width, depth.info.height, 100.0, 100.0);
                                    wbm3 = imageIr.ToWritableBitmap(0, ir.info.width, ir.info.height, 100.0, 100.0);

                                    color.ReleaseAccess(imageColor);
                                    depth.ReleaseAccess(imageDepth);
                                    ir.ReleaseAccess(imageIr);

                                    nameColor = paths.rgbFolder + "\\" + videoName + "\\" + videoName + "_color_" + frameIndex + formatImageFile;
                                    nameDepth = paths.depthFolder + "\\" + videoName + "\\" + videoName + "_depth_" + frameIndex + formatImageFile;
                                    nameIr    = paths.irFolder + "\\" + videoName + "\\" + videoName + "_ir_" + frameIndex + formatImageFile;

                                    //Crops the face images!
                                    CreateThumbnail(nameColor, new CroppedBitmap(wbm1, rect2crop));
                                    CreateThumbnail(nameDepth, new CroppedBitmap(wbm2, rect2crop));
                                    CreateThumbnail(nameIr, new CroppedBitmap(wbm3, rect2crop));

                                    //Debug.WriteLine((depthDistance /1000 ) + " m" + " " + rect.x + " " + rect.y + " " + rect.w + " " + rect.h);

                                    /*
                                     * x - The horizontal coordinate of the top left pixel of the rectangle.
                                     * y - The vertical coordinate of the top left pixel of the rectangle.
                                     * w - The rectangle width in pixels.
                                     * h -The rectangle height in pixels.*/

                                    if (landmarkData != null)
                                    {
                                        PXCMFaceData.LandmarkPoint[] landmarkPoints;
                                        landmarkData.QueryPoints(out landmarkPoints);

                                        Application.Current.Dispatcher.BeginInvoke(new Action(() => textBox1.Text = frameIndex.ToString()));

                                        landmarks += inputFile.Split('\\').Last() + ";" + frameIndex + ";" + nameColor + ";" + nameDepth + ";" + nameIr + ";" + frameTimeStamp + ";" + depthDistance.ToString("F") + ";" + poseEulerAngles.yaw.ToString("F") + ";" + poseEulerAngles.pitch.ToString("F") + ";" + poseEulerAngles.roll.ToString("F") + ";"; // Begin line with frame info

                                        for (int j = 0; j < landmarkPoints.Length; j++)                                                                                                                                                                                                                                                                    // Writes landmarks coordinates along the line
                                        {
                                            //get world coordinates
                                            landmarks += /*landmarkPoints[j].source.index + ";" +*/ (landmarkPoints[j].world.x * 1000).ToString("F") + ";" + (landmarkPoints[j].world.y * 1000).ToString("F") + ";" + (landmarkPoints[j].world.z * 1000).ToString("F") + ";";
                                        }
                                        for (int j = 0; j < landmarkPoints.Length; j++)
                                        {
                                            //get coordinate of the image pixel
                                            landmarks += /*landmarkPoints[j].confidenceImage + ";" + */ landmarkPoints[j].image.x.ToString("F") + ";" + landmarkPoints[j].image.y.ToString("F") + ";";
                                        }
                                        landmarks += '\n'; // Breaks line after the end of the frame coordinates
                                    }
                                }
                            }
                            // Release the frame
                            if (faceData != null)
                            {
                                faceData.Dispose();
                            }
                            sm.ReleaseFrame();

                            WriteToFile(paths.csvFile, landmarks);
                            landmarks = null;
                        }
                        sm.Dispose();
                        stopwatch.Stop();
                        //Update in realtime the current extraction
                        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                        {
                            elapsedLabel.Content = String.Format("Elapsed Time: {0} (s)", stopwatch.Elapsed.TotalSeconds.ToString("F"));
                        }));
                    }
                }
            }
        }
Beispiel #13
0
        private void CaptureProcess()
        {
            Sender = new UDPSender(CurrentIpAdress, Convert.ToInt32(currentPort));
            while (senseManager.AcquireFrame(true).IsSuccessful())
            {
                PXCMCapture.Sample  sample = senseManager.QuerySample();
                PXCMImage.ImageData colorImageData;
                Bitmap colorBitmap;

                sample.color.AcquireAccess(PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_RGB32, out colorImageData);
                colorBitmap = colorImageData.ToBitmap(0, sample.color.info.width, sample.color.info.height);

                if (faceModule != null)
                {
                    PXCMFaceData faceData = faceModule.CreateOutput();
                    faceData.Update();
                    numberTrackedFace = faceData.QueryNumberOfDetectedFaces();

                    PXCMFaceData.Face faceDataFace = faceData.QueryFaceByIndex(0);

                    if (faceDataFace != null)
                    {
                        PXCMFaceData.DetectionData faceDetectionData = faceDataFace.QueryDetection();
                        PXCMFaceData.LandmarksData landMarksData     = faceDataFace.QueryLandmarks();


                        if (faceDetectionData != null) //Запись переменных нахождения фейса
                        {
                            PXCMRectI32 faceRectangle;
                            faceDetectionData.QueryFaceAverageDepth(out faceAverageDepth);
                            faceDetectionData.QueryBoundingRect(out faceRectangle);
                            faceRectangleHeight = faceRectangle.h;
                            faceRectangleWidth  = faceRectangle.w;
                            faceRectangleX      = faceRectangle.x;
                            faceRectangleY      = faceRectangle.y;

                            PXCMFaceData.LandmarkPoint[] points; //Херачим точки на фейс
                            if (landMarksData != null)
                            {
                                bool res = landMarksData.QueryPoints(out points);

                                Graphics graphics = Graphics.FromImage(colorBitmap);
                                Font     font     = new Font(System.Drawing.FontFamily.GenericMonospace, 12, System.Drawing.FontStyle.Bold);

                                foreach (PXCMFaceData.LandmarkPoint landmark in points)
                                {
                                    point.X = landmark.image.x + LandMarkAlingment;
                                    point.Y = landmark.image.y + LandMarkAlingment;
                                    //Console.WriteLine(point.X);

                                    if (landmark.confidenceImage == 0)
                                    {
                                        graphics.DrawString("X", font, System.Drawing.Brushes.Brown, point);
                                    }
                                    else
                                    {
                                        graphics.DrawString("*", font, System.Drawing.Brushes.CornflowerBlue, point);
                                    }
                                    Connect = Math.Min(landmark.confidenceImage, 1);
                                }
                            }
                        }

                        var connectMessage = new SharpOSC.OscMessage("/expressions/connectMessage", Connect);
                        Sender.Send(connectMessage);

                        PXCMFaceData.PoseData facePoseData = faceDataFace.QueryPose(); //переменные поворота для анимации головы
                        if (facePoseData != null)
                        {
                            PXCMFaceData.PoseEulerAngles headAngles;
                            facePoseData.QueryPoseAngles(out headAngles);
                            headRoll  = headAngles.roll;
                            headYaw   = headAngles.yaw;
                            headPitch = headAngles.pitch;
                        }

                        PXCMFaceData.ExpressionsData expressionData = faceDataFace.QueryExpressions();

                        if (expressionData != null)
                        {
                            PXCMFaceData.ExpressionsData.FaceExpressionResult score;

                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_KISS, out score);
                            Dispatcher.Invoke(() => kissExpression.Text = Convert.ToString(score.intensity));
                            var kissMessage = new SharpOSC.OscMessage("/expressions/kiss", score.intensity);
                            Sender.Send(kissMessage);

                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_MOUTH_OPEN, out score);
                            Dispatcher.Invoke(() => mouthExpression.Text = Convert.ToString(score.intensity));
                            var mouthMessage = new SharpOSC.OscMessage("/expressions/mouth", score.intensity);
                            Sender.Send(mouthMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_SMILE, out score);
                            Dispatcher.Invoke(() => smileExpression.Text = Convert.ToString(score.intensity));
                            var smileMessage = new SharpOSC.OscMessage("/expressions/smile", score.intensity);
                            Sender.Send(smileMessage);

                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_TONGUE_OUT, out score);
                            Dispatcher.Invoke(() => tongueExpression.Text = Convert.ToString(score.intensity));
                            var tongueOutMessage = new SharpOSC.OscMessage("/expressions/tongueout", score.intensity);
                            Sender.Send(tongueOutMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_BROW_LOWERER_LEFT, out score);
                            Dispatcher.Invoke(() => leftBrowLowExpression.Text = Convert.ToString(score.intensity));
                            var leftBrowLowMessage = new SharpOSC.OscMessage("/expressions/leftBrowLow", score.intensity);
                            Sender.Send(leftBrowLowMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_BROW_LOWERER_RIGHT, out score);
                            Dispatcher.Invoke(() => rightBrowLowExpression.Text = Convert.ToString(score.intensity));
                            var rightBrowLowMessage = new SharpOSC.OscMessage("/expressions/rightBrowLow", score.intensity);
                            Sender.Send(rightBrowLowMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_BROW_RAISER_LEFT, out score);
                            Dispatcher.Invoke(() => leftBrowRaiseExpression.Text = Convert.ToString(score.intensity));
                            var leftBrowRaiseMessage = new SharpOSC.OscMessage("/expressions/leftBrowRaise", score.intensity);
                            Sender.Send(leftBrowRaiseMessage);

                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_BROW_RAISER_RIGHT, out score);
                            Dispatcher.Invoke(() => rightBrowRaiseExpression.Text = Convert.ToString(score.intensity));
                            var rightBrowRaiseMessage = new SharpOSC.OscMessage("/expressions/rightBrowRaise", score.intensity);
                            Sender.Send(rightBrowRaiseMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_EYES_CLOSED_LEFT, out score);
                            Dispatcher.Invoke(() => leftEyeClosedExpression.Text = Convert.ToString(score.intensity));
                            var leftEyeClosedMessage = new SharpOSC.OscMessage("/expressions/leftEyeClosed", score.intensity);
                            Sender.Send(leftEyeClosedMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_EYES_CLOSED_RIGHT, out score);
                            Dispatcher.Invoke(() => rightEyeClosedExpression.Text = Convert.ToString(score.intensity));
                            var rightEyeClosedMessage = new SharpOSC.OscMessage("/expressions/rightEyeClosed", score.intensity);
                            Sender.Send(rightEyeClosedMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_EYES_TURN_LEFT, out score);
                            Dispatcher.Invoke(() => eyesTurnLeftExpression.Text = Convert.ToString(score.intensity));
                            var eyesTurnLeftMessage = new SharpOSC.OscMessage("/expressions/eyesTurnLeft", score.intensity);
                            Sender.Send(eyesTurnLeftMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_EYES_TURN_RIGHT, out score);
                            Dispatcher.Invoke(() => eyesTurnRightExpression.Text = Convert.ToString(score.intensity));
                            var eyesTurnRightMessage = new SharpOSC.OscMessage("/expressions/eyesTurnRight", score.intensity);
                            Sender.Send(eyesTurnRightMessage);



                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_EYES_DOWN, out score);
                            Dispatcher.Invoke(() => eyesDownExpression.Text = Convert.ToString(score.intensity));
                            var eyesDownMessage = new SharpOSC.OscMessage("/expressions/eyesDown", score.intensity);
                            Sender.Send(eyesDownMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_EYES_UP, out score);
                            Dispatcher.Invoke(() => eyesUpExpression.Text = Convert.ToString(score.intensity));
                            var eyesUpMessage = new SharpOSC.OscMessage("/expressions/eyesUp", score.intensity);
                            Sender.Send(eyesUpMessage);


                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_PUFF_LEFT, out score);
                            Dispatcher.Invoke(() => puffLeftExpression.Text = Convert.ToString(score.intensity));
                            var leftPuffMessage = new SharpOSC.OscMessage("/expressions/leftPuff", score.intensity);
                            Sender.Send(leftPuffMessage);



                            expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_PUFF_RIGHT, out score);
                            Dispatcher.Invoke(() => puffRightExpression.Text = Convert.ToString(score.intensity));
                            var rightPuffMessage = new SharpOSC.OscMessage("/expressions/rightPuff", score.intensity);
                            Sender.Send(rightPuffMessage);
                        }
                    }
                    faceData.Dispose();
                }
                UpdateUI(colorBitmap);

                colorBitmap.Dispose();
                sample.color.ReleaseAccess(colorImageData);
                senseManager.ReleaseFrame();
            }
        }
Beispiel #14
0
        private void updateFaceFrame()
        {
            PXCMCapture.Sample sample = this.senseManager.QuerySample();
            this.image = sample.color;

            if (this.image != null)
            {
                this.invalidate = true;
            }

            this.faceData.Update();

            // get number of faces
            FOutFaceLandmarkPoints.SliceCount    = 0;
            FOutFaceExpressionsResult.SliceCount = 0;
            int numFaces = this.faceData.QueryNumberOfDetectedFaces();

            for (int i = 0; i < numFaces; ++i)
            {
                // get faces info
                PXCMFaceData.Face face = this.faceData.QueryFaceByIndex(i);

                // get face position by Depth
                var detection = face.QueryDetection();
                if (detection != null)
                {
                    // detection
                    PXCMRectI32 faceRect;
                    detection.QueryBoundingRect(out faceRect);
                    int sliceCount = i + 1;
                    FOutFacePosition.SliceCount = sliceCount;
                    FOutFacePosition[i]         = new Vector2D(faceRect.x, faceRect.y);
                    FOutFaceWidth.SliceCount    = sliceCount;
                    FOutFaceWidth[i]            = faceRect.w;
                    FOutFaceHeight.SliceCount   = sliceCount;
                    FOutFaceHeight[i]           = faceRect.h;

                    // pose(only use Depth mode)
                    PXCMFaceData.PoseData pose = face.QueryPose();
                    if (pose != null)
                    {
                        // faces angle
                        PXCMFaceData.PoseEulerAngles poseAngle = new PXCMFaceData.PoseEulerAngles();
                        pose.QueryPoseAngles(out poseAngle);
                        FOutFacePose.SliceCount = sliceCount;
                        FOutFacePose[i]         = new Vector3D(poseAngle.pitch, poseAngle.yaw, poseAngle.roll);
                    }

                    // landmarks
                    PXCMFaceData.LandmarksData landmarks = face.QueryLandmarks();
                    FOutFaceLandmarkBinSize.SliceCount = sliceCount;
                    if (landmarks != null)
                    {
                        // number of feature points from landmarks
                        int numPoints = landmarks.QueryNumPoints();
                        FOutFaceLandmarkBinSize[i] = numPoints;

                        PXCMFaceData.LandmarkPoint[] landmarkPoints = new PXCMFaceData.LandmarkPoint[numPoints];
                        int prevSliceCount = FOutFaceLandmarkPoints.SliceCount;
                        FOutFaceLandmarkPoints.SliceCount = prevSliceCount + numPoints;

                        if (landmarks.QueryPoints(out landmarkPoints))
                        {
                            for (int j = 0; j < numPoints; j++)
                            {
                                int index = prevSliceCount + j;
                                FOutFaceLandmarkPoints[index] = new Vector2D(landmarkPoints[j].image.x, landmarkPoints[j].image.y);
                            }
                        }
                    }
                    else
                    {
                        FOutFaceLandmarkBinSize[i]        = 0;
                        FOutFaceLandmarkPoints.SliceCount = 0;
                    }

                    PXCMFaceData.ExpressionsData expressionData = face.QueryExpressions();
                    if (expressionData != null)
                    {
                        for (int j = 0; j < FInExpressions.SliceCount; j++)
                        {
                            PXCMFaceData.ExpressionsData.FaceExpressionResult expressionResult;
                            if (expressionData.QueryExpression(FInExpressions[j], out expressionResult))
                            {
                                FOutFaceExpressionsResult.SliceCount++;
                                FOutFaceExpressionsResult[j] = expressionResult.intensity;
                            }
                            else
                            {
                                // do nothing
                            }
                        }
                    }
                    else
                    {
                        FOutFaceExpressionsResult.SliceCount = 0;
                    }

                    PXCMFaceData.PulseData pulseData = face.QueryPulse();
                    if (pulseData != null)
                    {
                        FOutPulse.SliceCount = sliceCount;
                        FOutPulse[i]         = pulseData.QueryHeartRate();
                    }
                }
            }
        }
Beispiel #15
0
        public void DrawLandmark(PXCMFaceData.Face face)
        {
            Debug.Assert(face != null);
            PXCMFaceData.LandmarksData landmarks = face.QueryLandmarks();

            ///zz
            if (isStart)
            {
                SaveFeature(face, FaceTracking.m_frame);
            }
            bool tag = true;  //是否小于阈值的tag

            if (m_bitmap == null || landmarks == null)
            {
                return;
            }

            lock (m_bitmapLock)
            {
                using (Graphics graphics = Graphics.FromImage(m_bitmap))
                    using (var brush = new SolidBrush(Color.White))
                        using (var midConfidenceBrush = new SolidBrush(Color.Blue))
                            using (var lowConfidenceBrush = new SolidBrush(Color.Red))
                                using (var font = new Font(FontFamily.GenericMonospace, m_faceTextOrganizer.FontSize, FontStyle.Bold))
                                {
                                    PXCMFaceData.LandmarkPoint[] points;

                                    bool res = landmarks.QueryPoints(out points);

                                    if (_lastpoints == null)
                                    {
                                        _lastpoints = points;
                                    }

                                    Debug.Assert(res);

                                    var point = new PointF();

                                    int[] a = new int[32] {
                                        76, 77, 12, 16, 14, 10, 20, 24, 18, 22, 71, 0, 4, 74, 5, 9, 29, 26, 31, 30, 32, 39, 33, 47, 46, 48, 51, 52, 50, 56, 66, 61
                                    };

                                    for (int i = 0; i < 78; i++)
                                    {
                                        int k = 31;
                                        point.X = points[i].image.x + LandmarkAlignment;
                                        point.Y = points[i].image.y + LandmarkAlignment;

                                        if (points[i].confidenceImage == 0)
                                        {
                                            graphics.DrawString("x", font, lowConfidenceBrush, point);
                                        }

                                        graphics.DrawString("•", font, brush, point);

                                        while (k > -1)
                                        {
                                            if (a[k] == i)
                                            {
                                                graphics.DrawString(i.ToString(), font, lowConfidenceBrush, point);
                                            }

                                            k--;
                                        }
                                        if (PositionChange(points[i].image, _lastpoints[i].image) > 1)
                                        {
                                            //graphics.DrawString("o", font, brush, point);
                                            if (tag == true)
                                            {
                                                tag = false;
                                            }
                                        }
                                    }

                                    if (RegisterThisID == true)
                                    {
                                        Savedata_less(face, FaceTracking.m_frame);
                                        RegisterThisID = false;
                                    }

                                    if (!tag && isStart)
                                    {
                                        Savedata_less(face, FaceTracking.m_frame);
                                    }
                                    _lastpoints = points;
                                }
            }
        }
Beispiel #16
0
    /// <summary>
    /// Update is called every frame, if the MonoBehaviour is enabled.
    /// </summary>
    void Update()
    {
        /* Make sure PXCMSenseManager Instance is Initialized */
        if (psm == null)
        {
            return;
        }

        /* Wait until any frame data is available true(aligned) false(unaligned) */
        if (psm.AcquireFrame(true) != pxcmStatus.PXCM_STATUS_NO_ERROR)
        {
            return;
        }

        /* Retrieve face tracking data if ready */
        faceAnalyzer = psm.QueryFace();
        if (faceAnalyzer != null)
        {
            PXCMFaceData _outputData = faceAnalyzer.CreateOutput();
            if (_outputData != null)
            {
                _outputData.Update();

                for (int i = 0; i < _outputData.QueryNumberOfDetectedFaces(); i++)
                {
                    PXCMFaceData.Face _iFace = _outputData.QueryFaceByIndex(i);
                    if (_iFace != null)
                    {
                        /* Retrieve 78 Landmark Points */
                        PXCMFaceData.LandmarksData LandmarkData = _iFace.QueryLandmarks();
                        if (LandmarkData != null)
                        {
                            PXCMFaceData.LandmarkPoint[] landmarkPoints = new PXCMFaceData.LandmarkPoint[MaxPoints];
                            if (LandmarkData.QueryPoints(out landmarkPoints))
                            {
                                faceRenderer.DisplayJoints2D(landmarkPoints);
                            }
                        }

                        /* Retrieve Detection Data */
                        PXCMFaceData.DetectionData detectionData = _iFace.QueryDetection();
                        if (detectionData != null)
                        {
                            PXCMRectI32 rect;
                            if (detectionData.QueryBoundingRect(out rect))
                            {
                                faceRenderer.SetDetectionRect(rect);
                            }
                        }

                        /* Retrieve Pose Data */
                        PXCMFaceData.PoseData poseData = _iFace.QueryPose();
                        if (poseData != null)
                        {
                            PXCMFaceData.PoseQuaternion poseQuaternion;
                            if (poseData.QueryPoseQuaternion(out poseQuaternion))
                            {
                                faceRenderer.DisplayPoseQuaternion(poseQuaternion);
                            }
                        }

                        /* Retrieve Expression Data */
                        PXCMFaceData.ExpressionsData expressionData = _iFace.QueryExpressions();
                        if (expressionData != null)
                        {
                            PXCMFaceData.ExpressionsData.FaceExpressionResult expressionResult;
                            if (expressionData.QueryExpression(PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_MOUTH_OPEN, out expressionResult))
                            {
                                faceRenderer.DisplayExpression(expressionResult, PXCMFaceData.ExpressionsData.FaceExpression.EXPRESSION_MOUTH_OPEN);
                            }
                        }
                    }
                }

                /* Retrieve Alert Data */
                PXCMFaceData.AlertData _alertData;
                for (int i = 0; i < _outputData.QueryFiredAlertsNumber(); i++)
                {
                    if (_outputData.QueryFiredAlertData(i, out _alertData) == pxcmStatus.PXCM_STATUS_NO_ERROR)
                    {
                        faceRenderer.DisplayAlerts(_alertData);
                    }
                }
            }
            _outputData.Dispose();
        }

        /* Retrieve a sample from the camera */
        PXCMCapture.Sample sample = psm.QueryFaceSample();
        if (sample != null)
        {
            colorImage = sample.color;
            if (colorImage != null)
            {
                if (colorTexture2D == null)
                {
                    /* If not allocated, allocate a Texture2D */
                    colorTexture2D = new Texture2D(colorImage.info.width, colorImage.info.height, TextureFormat.ARGB32, false);

                    /* Associate the Texture2D with a gameObject */
                    colorPlane.renderer.material.mainTexture = colorTexture2D;
                    //colorPlane.renderer.material.mainTextureScale = new Vector2(-1f, 1f);
                }

                /* Retrieve the image data in Texture2D */
                PXCMImage.ImageData colorImageData;
                colorImage.AcquireAccess(PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_RGB32, out colorImageData);
                colorImageData.ToTexture2D(0, colorTexture2D);
                colorImage.ReleaseAccess(colorImageData);

                /* Apply the texture to the GameObject to display on */
                colorTexture2D.Apply();
            }
        }

        /* Realease the frame to process the next frame */
        psm.ReleaseFrame();
    }