Better UI visualization and scaling.
This commit is contained in:
parent
72859cac77
commit
e5cc957e37
2 changed files with 29 additions and 8 deletions
|
@ -156,6 +156,7 @@ namespace OpenFaceOffline
|
|||
|
||||
// Camera calibration parameters
|
||||
public double fx = -1, fy = -1, cx = -1, cy = -1;
|
||||
bool estimate_camera_parameters = true;
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
|
@ -374,7 +375,7 @@ namespace OpenFaceOffline
|
|||
face_analyser.Reset();
|
||||
|
||||
// If the camera calibration parameters are not set (indicated by -1), guesstimate them
|
||||
if(fx == -1 || fy == -1 || cx == -1 || cy == -1)
|
||||
if(estimate_camera_parameters || fx == -1 || fy == -1 || cx == -1 || cy == -1)
|
||||
{
|
||||
fx = 500.0 * (capture.width / 640.0);
|
||||
fy = 500.0 * (capture.height / 480.0);
|
||||
|
@ -563,13 +564,15 @@ namespace OpenFaceOffline
|
|||
else if (confidence > 1)
|
||||
confidence = 1;
|
||||
|
||||
double scale = 0;
|
||||
|
||||
if (detectionSucceeding)
|
||||
{
|
||||
|
||||
eye_landmarks = clnf_model.CalculateEyeLandmarks();
|
||||
lines = clnf_model.CalculateBox((float)fx, (float)fy, (float)cx, (float)cy);
|
||||
|
||||
double scale = clnf_model.GetRigidParams()[0];
|
||||
scale = clnf_model.GetRigidParams()[0];
|
||||
|
||||
gaze_lines = face_analyser.CalculateGazeLines(scale, (float)fx, (float)fy, (float)cx, (float)cy);
|
||||
gaze_angle = face_analyser.GetGazeAngle();
|
||||
|
@ -634,6 +637,7 @@ namespace OpenFaceOffline
|
|||
video.Confidence = confidence;
|
||||
video.FPS = processing_fps.GetFPS();
|
||||
video.Progress = progress;
|
||||
video.FaceScale = scale;
|
||||
|
||||
if (!detectionSucceeding)
|
||||
{
|
||||
|
@ -1039,6 +1043,14 @@ namespace OpenFaceOffline
|
|||
fy = camera_params_entry_window.Fy;
|
||||
cx = camera_params_entry_window.Cx;
|
||||
cy = camera_params_entry_window.Cy;
|
||||
if(fx == -1 || fy == -1 || cx == -1 || cy == -1)
|
||||
{
|
||||
estimate_camera_parameters = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
estimate_camera_parameters = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -100,13 +100,20 @@ namespace OpenFaceOffline
|
|||
var width = ((WriteableBitmap)Source).PixelWidth;
|
||||
var height = ((WriteableBitmap)Source).PixelHeight;
|
||||
|
||||
// The point and line size should be proportional to the face size and the image scaling
|
||||
double scaling_p = 0.88 * FaceScale * ActualWidth / width;
|
||||
|
||||
// Don't let it get too small
|
||||
if (scaling_p < 0.6)
|
||||
scaling_p = 0.6;
|
||||
|
||||
foreach (var line in OverlayLines)
|
||||
{
|
||||
|
||||
var p1 = new Point(ActualWidth * line.Item1.X / width, ActualHeight * line.Item1.Y / height);
|
||||
var p2 = new Point(ActualWidth * line.Item2.X / width, ActualHeight * line.Item2.Y / height);
|
||||
|
||||
dc.DrawLine(new Pen(new SolidColorBrush(Color.FromArgb(200, (byte)(100 + (155 * (1 - Confidence))), (byte)(100 + (155 * Confidence)), 100)), 2), p1, p2);
|
||||
dc.DrawLine(new Pen(new SolidColorBrush(Color.FromArgb(200, (byte)(100 + (155 * (1 - Confidence))), (byte)(100 + (155 * Confidence)), 100)), 2.0 * scaling_p), p1, p2);
|
||||
}
|
||||
|
||||
foreach (var line in GazeLines)
|
||||
|
@ -115,7 +122,7 @@ namespace OpenFaceOffline
|
|||
var p1 = new Point(ActualWidth * line.Item1.X / width, ActualHeight * line.Item1.Y / height);
|
||||
var p2 = new Point(ActualWidth * line.Item2.X / width, ActualHeight * line.Item2.Y / height);
|
||||
|
||||
dc.DrawLine(new Pen(new SolidColorBrush(Color.FromArgb(200, (byte)(240), (byte)(30), (byte)100)), 3), p1, p2);
|
||||
dc.DrawLine(new Pen(new SolidColorBrush(Color.FromArgb(200, (byte)(240), (byte)(30), (byte)100)), 3.0 * scaling_p), p1, p2);
|
||||
|
||||
}
|
||||
|
||||
|
@ -124,7 +131,8 @@ namespace OpenFaceOffline
|
|||
|
||||
var q = new Point(ActualWidth * p.X / width, ActualHeight * p.Y / height);
|
||||
|
||||
dc.DrawEllipse(new SolidColorBrush(Color.FromArgb((byte)(200 * Confidence), 255, 255, 100)), null, q, 1, 1);
|
||||
dc.DrawEllipse(new SolidColorBrush(Color.FromArgb((byte)(230 * Confidence), 255, 50, 50)), null, q, 2.75 * scaling_p, 2.75 * scaling_p);
|
||||
dc.DrawEllipse(new SolidColorBrush(Color.FromArgb((byte)(230 * Confidence), 255, 255, 100)), null, q, 1.75 * scaling_p, 1.75 * scaling_p);
|
||||
}
|
||||
|
||||
for (int id = 0; id < OverlayEyePoints.Count; id++)
|
||||
|
@ -146,11 +154,11 @@ namespace OpenFaceOffline
|
|||
|
||||
if (id < 28 && (id < 8 || id > 19) || (id>=28 &&(id-28<8 || id-28 >19)))
|
||||
{
|
||||
dc.DrawLine(new Pen(new SolidColorBrush(Color.FromArgb(200, (byte)(240), (byte)(30), (byte)100)), 1), q1, q2);
|
||||
dc.DrawLine(new Pen(new SolidColorBrush(Color.FromArgb(200, (byte)(240), (byte)(30), (byte)100)), 1.5 * scaling_p), q1, q2);
|
||||
}
|
||||
else
|
||||
{
|
||||
dc.DrawLine(new Pen(new SolidColorBrush(Color.FromArgb(200, (byte)(100), (byte)(30), (byte)240)), 1), q1, q2);
|
||||
dc.DrawLine(new Pen(new SolidColorBrush(Color.FromArgb(200, (byte)(100), (byte)(30), (byte)240)), 2.5 * scaling_p), q1, q2);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -190,6 +198,7 @@ namespace OpenFaceOffline
|
|||
public List<Point> OverlayEyePoints { get; set; }
|
||||
public double Confidence { get; set; }
|
||||
public double FPS { get; set; }
|
||||
public double FaceScale { get; set; }
|
||||
|
||||
// 0 to 1 indicates how much video has been processed so far
|
||||
public double Progress { get; set; }
|
||||
|
|
Loading…
Reference in a new issue