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
|
// Camera calibration parameters
|
||||||
public double fx = -1, fy = -1, cx = -1, cy = -1;
|
public double fx = -1, fy = -1, cx = -1, cy = -1;
|
||||||
|
bool estimate_camera_parameters = true;
|
||||||
|
|
||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
|
@ -374,7 +375,7 @@ namespace OpenFaceOffline
|
||||||
face_analyser.Reset();
|
face_analyser.Reset();
|
||||||
|
|
||||||
// If the camera calibration parameters are not set (indicated by -1), guesstimate them
|
// 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);
|
fx = 500.0 * (capture.width / 640.0);
|
||||||
fy = 500.0 * (capture.height / 480.0);
|
fy = 500.0 * (capture.height / 480.0);
|
||||||
|
@ -563,13 +564,15 @@ namespace OpenFaceOffline
|
||||||
else if (confidence > 1)
|
else if (confidence > 1)
|
||||||
confidence = 1;
|
confidence = 1;
|
||||||
|
|
||||||
|
double scale = 0;
|
||||||
|
|
||||||
if (detectionSucceeding)
|
if (detectionSucceeding)
|
||||||
{
|
{
|
||||||
|
|
||||||
eye_landmarks = clnf_model.CalculateEyeLandmarks();
|
eye_landmarks = clnf_model.CalculateEyeLandmarks();
|
||||||
lines = clnf_model.CalculateBox((float)fx, (float)fy, (float)cx, (float)cy);
|
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_lines = face_analyser.CalculateGazeLines(scale, (float)fx, (float)fy, (float)cx, (float)cy);
|
||||||
gaze_angle = face_analyser.GetGazeAngle();
|
gaze_angle = face_analyser.GetGazeAngle();
|
||||||
|
@ -634,6 +637,7 @@ namespace OpenFaceOffline
|
||||||
video.Confidence = confidence;
|
video.Confidence = confidence;
|
||||||
video.FPS = processing_fps.GetFPS();
|
video.FPS = processing_fps.GetFPS();
|
||||||
video.Progress = progress;
|
video.Progress = progress;
|
||||||
|
video.FaceScale = scale;
|
||||||
|
|
||||||
if (!detectionSucceeding)
|
if (!detectionSucceeding)
|
||||||
{
|
{
|
||||||
|
@ -1039,6 +1043,14 @@ namespace OpenFaceOffline
|
||||||
fy = camera_params_entry_window.Fy;
|
fy = camera_params_entry_window.Fy;
|
||||||
cx = camera_params_entry_window.Cx;
|
cx = camera_params_entry_window.Cx;
|
||||||
cy = camera_params_entry_window.Cy;
|
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 width = ((WriteableBitmap)Source).PixelWidth;
|
||||||
var height = ((WriteableBitmap)Source).PixelHeight;
|
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)
|
foreach (var line in OverlayLines)
|
||||||
{
|
{
|
||||||
|
|
||||||
var p1 = new Point(ActualWidth * line.Item1.X / width, ActualHeight * line.Item1.Y / height);
|
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);
|
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)
|
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 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);
|
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);
|
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++)
|
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)))
|
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
|
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 List<Point> OverlayEyePoints { get; set; }
|
||||||
public double Confidence { get; set; }
|
public double Confidence { get; set; }
|
||||||
public double FPS { get; set; }
|
public double FPS { get; set; }
|
||||||
|
public double FaceScale { get; set; }
|
||||||
|
|
||||||
// 0 to 1 indicates how much video has been processed so far
|
// 0 to 1 indicates how much video has been processed so far
|
||||||
public double Progress { get; set; }
|
public double Progress { get; set; }
|
||||||
|
|
Loading…
Reference in a new issue