static private void SerializeFacepointsWithCsv(CsvWriter csvwriter, CsvFer2013Row fer2013record, int refId, ref PointF[] facepoints) { csvwriter.WriteRecord(new CsvFer2013ModRow() { RefId = refId, Emotion = fer2013record.emotion, LandmarksX = ArrayToString(from point in facepoints select point.X), LandmarksY = ArrayToString(from point in facepoints select point.Y), Usage = fer2013record.Usage }); csvwriter.NextRecord(); }
static private void RunWithCsv(CascadeClassifier faceDetector, FacemarkLBF facemark, string inputFilepath, string outputFilepath, Size imageSize) { using (var csvreader = new CsvReader(new StreamReader(inputFilepath))) using (var csvwriter = new CsvWriter(new StreamWriter(outputFilepath, false))) { csvwriter.WriteHeader <CsvFer2013ModRow>(); csvwriter.NextRecord(); var record = new CsvFer2013Row(); var records = csvreader.EnumerateRecords(record); int recordId = 0; foreach (var r in records) { recordId++; Image <Gray, byte> image = StringToImage(r.pixels, imageSize); Rectangle face = image.ROI; if (localiseFace) { Rectangle?detectionResult = DetectFace(faceDetector, image); if (!detectionResult.HasValue) { continue; } face = detectionResult.Value; } //Image<Bgr, byte> colorImage = image.Convert<Bgr, byte>(); //CvInvoke.Imshow("image", colorImage); //CvInvoke.WaitKey(); VectorOfPointF landmarks = MarkFacialPoints(facemark, image, face, out bool isSuccess); if (!isSuccess) { continue; } //FaceInvoke.DrawFacemarks(colorImage, landmarks, new Bgr(0, 0, 255).MCvScalar); //CvInvoke.Imshow("landmarked image", colorImage); //CvInvoke.WaitKey(); //CvInvoke.DestroyAllWindows(); PointF[] facepoints = landmarks.ToArray(); if (normalise) { NormalizeFacepoints(facepoints); } SerializeFacepointsWithCsv(csvwriter, r, recordId, ref facepoints); if (verbose) { Console.Write("\rRecord No: {0}", recordId); } } if (verbose) { Console.WriteLine(); } } }