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; } }
/// <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(); }
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(); }
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); }
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); } } }
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(); }
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; } } }
//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(); }
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")); })); } } } }
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(); } }
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(); } } } }
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; } } }
/// <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(); }