/// <summary> /// Return the ground truth ellipse's parameters from the CSV file. /// </summary> /// <param name="imageFilename">Filename of the image</param> /// <param name="csvFilepath">Filepath to the CSV file with ground truth ellipses' parameters</param> /// <returns>Ground truth ellipse's parameters</returns> private static GtEllipse GetGtEllipseFromCsv(string imageFilename, string csvFilepath) { using (StreamReader sr = new StreamReader(csvFilepath)) { GtEllipse gtEllipse; string line; sr.ReadLine(); // skip the header while ((line = sr.ReadLine()) != null) { string[] columns = line.Split(','); if (string.Compare(columns[0], imageFilename) == 0) { if (string.IsNullOrEmpty(columns[1])) { gtEllipse = null; } else { Point2f center = new Point2f(Convert.ToSingle(columns[1]), Convert.ToSingle(columns[2])); Size2f axes = new Size2f(Convert.ToSingle(columns[3]), Convert.ToSingle(columns[4])); float angle = Convert.ToSingle(columns[5]); Size imageSize = new Size(Convert.ToInt32(columns[6]), Convert.ToInt32(columns[7])); gtEllipse = new GtEllipse(center, axes, angle, imageSize); } return(gtEllipse); } ; } throw new Exception("Filename not found in the CSV file."); } }
/// <summary> /// Evaluate ellipse fit by comparing its parameters to the ground truth ellipse's parameters from the CSV file. /// </summary> /// <param name="imageFilename">Filename of the image</param> /// <param name="fitEllipse">Fitted ellipse's parameters</param> /// <param name="csvFilepath">Filepath to the CSV file with ground truth ellipses' parameters</param> /// <returns>Fitted ellipse's fit score</returns> public static float EvaluateEllipseFit(string imageFilename, Ellipse fitEllipse, string csvFilepath) { GtEllipse gtEllipse = GetGtEllipseFromCsv(imageFilename, csvFilepath); if (gtEllipse != null) { if (fitEllipse != null) { return(GetEllipseFitScore(fitEllipse, gtEllipse)); } else { return(0.0f); } } else { if (fitEllipse != null) { return(0.0f); } else { return(1.0f); } } }
/// <summary> /// Calculate ellipse's fit score based on fitted and ground truth ellipses' parameters. /// </summary> /// <param name="fitEllipse">Fitted ellipse's parameters</param> /// <param name="gtEllipse">Ground truth ellipse's parameters</param> /// <returns>Fitted ellipse's fit score</returns> private static float GetEllipseFitScore(Ellipse fitEllipse, GtEllipse gtEllipse) { Mat fitEllipseImage = DrawEllipse(fitEllipse, gtEllipse.ImageSize); Mat gtEllipseImage = DrawEllipse(gtEllipse, gtEllipse.ImageSize); Cv2.WaitKey(); return(EvaluateOverlap(gtEllipseImage, fitEllipseImage)); }