diff --git a/OpenFace.sln b/OpenFace.sln index 94de1b5..5895f19 100644 --- a/OpenFace.sln +++ b/OpenFace.sln @@ -33,8 +33,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CamCom", "lib\local\CamCom\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenFaceOffline", "gui\OpenFaceOffline\OpenFaceOffline.csproj", "{A4760F41-2B1F-4144-B7B2-62785AFFE79B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenFaceDemo", "gui\OpenFaceDemo\OpenFaceDemo.csproj", "{E143A2AA-312E-4DFE-B61D-9A87CCBC8E90}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -131,14 +129,6 @@ Global {A4760F41-2B1F-4144-B7B2-62785AFFE79B}.Release|Win32.Build.0 = Release|x86 {A4760F41-2B1F-4144-B7B2-62785AFFE79B}.Release|x64.ActiveCfg = Release|Any CPU {A4760F41-2B1F-4144-B7B2-62785AFFE79B}.Release|x64.Build.0 = Release|Any CPU - {E143A2AA-312E-4DFE-B61D-9A87CCBC8E90}.Debug|Win32.ActiveCfg = Debug|x86 - {E143A2AA-312E-4DFE-B61D-9A87CCBC8E90}.Debug|Win32.Build.0 = Debug|x86 - {E143A2AA-312E-4DFE-B61D-9A87CCBC8E90}.Debug|x64.ActiveCfg = Debug|Any CPU - {E143A2AA-312E-4DFE-B61D-9A87CCBC8E90}.Debug|x64.Build.0 = Debug|Any CPU - {E143A2AA-312E-4DFE-B61D-9A87CCBC8E90}.Release|Win32.ActiveCfg = Release|x86 - {E143A2AA-312E-4DFE-B61D-9A87CCBC8E90}.Release|Win32.Build.0 = Release|x86 - {E143A2AA-312E-4DFE-B61D-9A87CCBC8E90}.Release|x64.ActiveCfg = Release|Any CPU - {E143A2AA-312E-4DFE-B61D-9A87CCBC8E90}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -155,6 +145,5 @@ Global {78196985-EE54-411F-822B-5A23EDF80642} = {D5F7B3E2-01FE-4F4A-8CE1-274D74D395D4} {0CEC6A75-17BA-4DC5-9405-C74154921E60} = {D5F7B3E2-01FE-4F4A-8CE1-274D74D395D4} {A4760F41-2B1F-4144-B7B2-62785AFFE79B} = {C9D8D0B0-11EC-41CB-8524-2DDB5BE94297} - {E143A2AA-312E-4DFE-B61D-9A87CCBC8E90} = {C9D8D0B0-11EC-41CB-8524-2DDB5BE94297} EndGlobalSection EndGlobal diff --git a/gui/OpenFaceOffline/MainWindow.xaml b/gui/OpenFaceOffline/MainWindow.xaml index 1d70647..331e674 100644 --- a/gui/OpenFaceOffline/MainWindow.xaml +++ b/gui/OpenFaceOffline/MainWindow.xaml @@ -39,7 +39,7 @@ - + @@ -166,7 +166,6 @@ - diff --git a/gui/OpenFaceOffline/MainWindow.xaml.cs b/gui/OpenFaceOffline/MainWindow.xaml.cs index 14c456c..11819b5 100644 --- a/gui/OpenFaceOffline/MainWindow.xaml.cs +++ b/gui/OpenFaceOffline/MainWindow.xaml.cs @@ -122,9 +122,7 @@ namespace OpenFaceOffline FpsTracker processing_fps = new FpsTracker(); volatile bool detectionSucceeding = false; - - volatile bool reset = false; - + // For tracking FaceModelParameters clnf_params; CLNF clnf_model; @@ -133,32 +131,32 @@ namespace OpenFaceOffline // Recording parameters (default values) Recorder recorder; - public bool RecordAligned { get; set; } // Aligned face images - public bool RecordHOG { get; set; } // HOG features extracted from face images - public bool Record2DLandmarks { get; set; } // 2D locations of facial landmarks (in pixels) - public bool Record3DLandmarks { get; set; } // 3D locations of facial landmarks (in pixels) - public bool RecordModelParameters { get; set; } // Facial shape parameters (rigid and non-rigid geometry) - public bool RecordPose { get; set; } // Head pose (position and orientation) - public bool RecordAUs { get; set; } // Facial action units - public bool RecordGaze { get; set; } // Eye gaze + public bool RecordAligned { get; set; } = false; // Aligned face images + public bool RecordHOG { get; set; } = false; // HOG features extracted from face images + public bool Record2DLandmarks { get; set; } = true; // 2D locations of facial landmarks (in pixels) + public bool Record3DLandmarks { get; set; } = true; // 3D locations of facial landmarks (in pixels) + public bool RecordModelParameters { get; set; } = true; // Facial shape parameters (rigid and non-rigid geometry) + public bool RecordPose { get; set; } = true; // Head pose (position and orientation) + public bool RecordAUs { get; set; } = true; // Facial action units + public bool RecordGaze { get; set; } = true; // Eye gaze // Visualisation options - public bool ShowTrackedVideo { get; set; } // Eye gaze - public bool ShowAppearance { get; set; } // Eye gaze - public bool ShowGeometry { get; set; } // Eye gaze - public bool ShowAUs { get; set; } // Eye gaze - + public bool ShowTrackedVideo { get; set; } = true; // Showing the actual tracking + public bool ShowAppearance { get; set; } = true; // Showing appeaance features like HOG + public bool ShowGeometry { get; set; } = true; // Showing geometry features, pose, gaze, and non-rigid + public bool ShowAUs { get; set; } = true; // Showing Facial Action Units + int image_output_size = 112; // TODO classifiers converted to regressors // TODO indication that track is done - // Where the recording is done (by default in a record directory, from where the application executed), TODO maybe the same folder as iput? + // Where the recording is done (by default in a record directory, from where the application executed) String record_root = "./record"; - - // For AU prediction - public bool DynamicAUModels { get; set; } + + // For AU prediction, if videos are long dynamic models should be used + public bool DynamicAUModels { get; set; } = true; public MainWindow() { @@ -168,18 +166,6 @@ namespace OpenFaceOffline // Set the icon Uri iconUri = new Uri("logo1.ico", UriKind.RelativeOrAbsolute); this.Icon = BitmapFrame.Create(iconUri); - - // Setup the default features that will be recorded - Record2DLandmarks = true; Record3DLandmarks = true; RecordModelParameters = true; RecordModelParameters = true; - RecordGaze = true; RecordAUs = true; RecordPose = true; - RecordAligned = false; RecordHOG = false; - - ShowTrackedVideo = true; - ShowAppearance = true; - ShowGeometry = true; - ShowAUs = true; - - DynamicAUModels = true; String root = AppDomain.CurrentDomain.BaseDirectory; @@ -192,21 +178,13 @@ namespace OpenFaceOffline // ---------------------------------------------------------- // Actual work gets done here - // The main function call for processing images or video files + // The main function call for processing images or video files, TODO rename this as it is not a loop private void ProcessingLoop(String[] filenames, int cam_id = -1, int width = -1, int height = -1, bool multi_face = false) { + SetupFeatureExtractionMode(); thread_running = true; - // Grab the boolean values of the check-boxes - Dispatcher.Invoke(DispatcherPriority.Render, new TimeSpan(0, 0, 0, 0, 200), (Action)(() => - { - ResetButton.IsEnabled = true; - PauseButton.IsEnabled = true; - StopButton.IsEnabled = true; - - })); - // Create the video capture and call the VideoLoop if (filenames != null) { @@ -308,17 +286,7 @@ namespace OpenFaceOffline } } - // TODO this should be up a level - // Some GUI clean up - Dispatcher.Invoke(DispatcherPriority.Render, new TimeSpan(0, 0, 0, 0, 200), (Action)(() => - { - Console.WriteLine("Cleaning up after processing is done"); - PauseButton.IsEnabled = false; - StopButton.IsEnabled = false; - ResetButton.IsEnabled = false; - NextFiveFramesButton.IsEnabled = false; - NextFrameButton.IsEnabled = false; - })); + EndFeatureExtractionMode(); } @@ -465,13 +433,6 @@ namespace OpenFaceOffline VisualizeFeatures(frame, landmarks, fx, fy, cx, cy, progress); - if (reset) - { - clnf_model.Reset(); - face_analyser.Reset(); - reset = false; - } - while (thread_running & thread_paused && skip_frames == 0) { Thread.Sleep(10); @@ -565,13 +526,7 @@ namespace OpenFaceOffline List> landmarks = clnf_model.CalculateLandmarks(); VisualizeFeatures(frame, landmarks, fx, fy, cx, cy, progress); - - if (reset) - { - clnf_model.Reset(); - face_analyser.Reset(); - reset = false; - } + while (thread_running & thread_paused && skip_frames == 0) { @@ -799,6 +754,39 @@ namespace OpenFaceOffline // TODO change what next and back buttons do? } + // Disable GUI components that should not be active during processing + private void SetupFeatureExtractionMode() + { + Dispatcher.Invoke((Action)(() => + { + SettingsMenu.IsEnabled = false; + RecordingMenu.IsEnabled = false; + AUSetting.IsEnabled = false; + + PauseButton.IsEnabled = true; + StopButton.IsEnabled = true; + NextFiveFramesButton.IsEnabled = false; + NextFrameButton.IsEnabled = false; + })); + } + + // When the processing is done re-enable the components + private void EndFeatureExtractionMode() + { + + Dispatcher.Invoke(DispatcherPriority.Render, new TimeSpan(0, 0, 0, 2, 0), (Action)(() => + { + SettingsMenu.IsEnabled = true; + RecordingMenu.IsEnabled = true; + AUSetting.IsEnabled = true; + + PauseButton.IsEnabled = false; + StopButton.IsEnabled = false; + NextFiveFramesButton.IsEnabled = false; + NextFrameButton.IsEnabled = false; + + })); + } // ---------------------------------------------------------- // Opening Videos/Images @@ -918,17 +906,6 @@ namespace OpenFaceOffline NextFrameButton.IsEnabled = false; NextFiveFramesButton.IsEnabled = false; StopButton.IsEnabled = false; - ResetButton.IsEnabled = false; - } - } - - // Resetting the tracker - private void ResetButton_Click(object sender, RoutedEventArgs e) - { - if (processing_thread != null) - { - // Stop capture and tracking - reset = true; } } @@ -939,8 +916,6 @@ namespace OpenFaceOffline // Stop capture and tracking thread_paused = !thread_paused; - ResetButton.IsEnabled = !thread_paused; - NextFrameButton.IsEnabled = thread_paused; NextFiveFramesButton.IsEnabled = thread_paused;