Continuing working on sequence capture, leading to quite a big cleanup in FeatuerExtraction.cpp

This commit is contained in:
Tadas Baltrusaitis 2017-11-08 21:35:27 +00:00
parent 4b54738b68
commit 53d7d6b78c
3 changed files with 28 additions and 198 deletions

View file

@ -58,6 +58,7 @@
#include <GazeEstimation.h> #include <GazeEstimation.h>
#include <RecorderOpenFace.h> #include <RecorderOpenFace.h>
#include <RecorderOpenFaceParameters.h> #include <RecorderOpenFaceParameters.h>
#include <SequenceCapture.h>
#ifndef CONFIG_DIR #ifndef CONFIG_DIR
#define CONFIG_DIR "~" #define CONFIG_DIR "~"
@ -82,8 +83,6 @@ printErrorAndAbort( std::string( "Fatal error: " ) + stream )
using namespace std; using namespace std;
using namespace boost::filesystem;
vector<string> get_arguments(int argc, char **argv) vector<string> get_arguments(int argc, char **argv)
{ {
@ -99,12 +98,6 @@ vector<string> get_arguments(int argc, char **argv)
void get_visualization_params(bool& visualize_track, bool& visualize_align, bool& visualize_hog, vector<string> &arguments); void get_visualization_params(bool& visualize_track, bool& visualize_align, bool& visualize_hog, vector<string> &arguments);
void get_image_input_output_params_feats(vector<vector<string> > &input_image_files, bool& as_video, vector<string> &arguments);
// Some globals for tracking timing information for visualisation
double fps_tracker = -1.0;
int64 t0 = 0;
// Visualising the results // Visualising the results
void visualise_tracking(cv::Mat& captured_image, const LandmarkDetector::CLNF& face_model, const LandmarkDetector::FaceModelParameters& det_parameters, cv::Point3f gazeDirection0, cv::Point3f gazeDirection1, int frame_count, double fx, double fy, double cx, double cy) void visualise_tracking(cv::Mat& captured_image, const LandmarkDetector::CLNF& face_model, const LandmarkDetector::FaceModelParameters& det_parameters, cv::Point3f gazeDirection0, cv::Point3f gazeDirection1, int frame_count, double fx, double fy, double cx, double cy)
{ {
@ -164,58 +157,12 @@ int main (int argc, char **argv)
vector<string> arguments = get_arguments(argc, argv); vector<string> arguments = get_arguments(argc, argv);
// Get the input output file parameters
vector<string> input_files, output_files;
string output_codec;
LandmarkDetector::get_video_input_output_params(input_files, output_files, output_codec, arguments);
// TODO remove, when have a capture class
bool video_input = true;
bool images_as_video = false;
vector<vector<string> > input_image_files;
// Adding image support (TODO should be moved to capture)
if(input_files.empty())
{
vector<string> o_img;
get_image_input_output_params_feats(input_image_files, images_as_video, arguments);
if(!input_image_files.empty())
{
video_input = false;
}
}
// Grab camera parameters, if they are not defined (approximate values will be used)
float fx = 0, fy = 0, cx = 0, cy = 0;
int d = 0;
// Get camera parameters
LandmarkDetector::get_camera_params(d, fx, fy, cx, cy, arguments);
// If cx (optical axis centre) is undefined will use the image size/2 as an estimate
bool cx_undefined = false;
bool fx_undefined = false;
if (cx == 0 || cy == 0)
{
cx_undefined = true;
}
if (fx == 0 || fy == 0)
{
fx_undefined = true;
}
// Deciding what to visualize // Deciding what to visualize
bool visualize_track = false; bool visualize_track = false;
bool visualize_align = false; bool visualize_align = false;
bool visualize_hog = false; bool visualize_hog = false;
get_visualization_params(visualize_track, visualize_align, visualize_hog, arguments); get_visualization_params(visualize_track, visualize_align, visualize_hog, arguments);
// If multiple video files are tracked, use this to indicate if we are done
bool done = false;
int f_n = -1;
int curr_img = -1;
// Load the modules that are being used for tracking and face analysis // Load the modules that are being used for tracking and face analysis
// Load face landmark detector // Load face landmark detector
LandmarkDetector::FaceModelParameters det_parameters(arguments); LandmarkDetector::FaceModelParameters det_parameters(arguments);
@ -227,95 +174,22 @@ int main (int argc, char **argv)
FaceAnalysis::FaceAnalyserParameters face_analysis_params(arguments); FaceAnalysis::FaceAnalyserParameters face_analysis_params(arguments);
FaceAnalysis::FaceAnalyser face_analyser(face_analysis_params); FaceAnalysis::FaceAnalyser face_analyser(face_analysis_params);
while (!done) // this is not a for loop as we might also be reading from a webcam Utilities::SequenceCapture sequence_reader();
while (true) // this is not a for loop as we might also be reading from a webcam
{ {
// INFO_STREAM("Attempting to read from file: " << current_file); TODO add reading info stuff
// INFO_STREAM("FPS of the video file cannot be determined, assuming 30");
// INFO_STREAM("Device or file opened");
sequence_reader.Open(arguments);
if (!sequence_reader.IsOpen())
break;
string current_file; string current_file;
cv::VideoCapture video_capture;
cv::Mat captured_image; cv::Mat captured_image;
int total_frames = -1;
int reported_completion = 0;
double fps_vid_in = -1.0;
// TODO this should be moved to a SequenceCapture class
if (video_input)
{
// We might specify multiple video files as arguments
if (input_files.size() > 0)
{
f_n++;
current_file = input_files[f_n];
}
else
{
// If we want to write out from webcam
f_n = 0;
}
// Do some grabbing
if (current_file.size() > 0)
{
INFO_STREAM("Attempting to read from file: " << current_file);
video_capture = cv::VideoCapture(current_file);
total_frames = (int)video_capture.get(CV_CAP_PROP_FRAME_COUNT);
fps_vid_in = video_capture.get(CV_CAP_PROP_FPS);
// Check if fps is nan or less than 0
if (fps_vid_in != fps_vid_in || fps_vid_in <= 0)
{
INFO_STREAM("FPS of the video file cannot be determined, assuming 30");
fps_vid_in = 30;
}
}
if (!video_capture.isOpened())
{
FATAL_STREAM("Failed to open video source, exiting");
return 1;
}
else
{
INFO_STREAM("Device or file opened");
}
video_capture >> captured_image;
}
else
{
f_n++;
curr_img++;
if (!input_image_files[f_n].empty())
{
string curr_img_file = input_image_files[f_n][curr_img];
captured_image = cv::imread(curr_img_file, -1);
}
else
{
FATAL_STREAM("No .jpg or .png images in a specified drectory, exiting");
return 1;
}
// If image sequence provided, assume the fps is 30
fps_vid_in = 30;
}
// If optical centers are not defined just use center of image
if (cx_undefined)
{
cx = captured_image.cols / 2.0f;
cy = captured_image.rows / 2.0f;
}
// Use a rough guess-timate of focal length
if (fx_undefined)
{
fx = 500 * (captured_image.cols / 640.0);
fy = 500 * (captured_image.rows / 480.0);
fx = (fx + fy) / 2.0;
fy = fx;
}
Utilities::RecorderOpenFaceParameters recording_params(arguments, true, fps_vid_in); Utilities::RecorderOpenFaceParameters recording_params(arguments, true, fps_vid_in);
Utilities::RecorderOpenFace open_face_rec(output_files[f_n], input_files[f_n], recording_params); Utilities::RecorderOpenFace open_face_rec(output_files[f_n], input_files[f_n], recording_params);

View file

@ -170,64 +170,6 @@ void get_video_input_output_params(vector<string> &input_video_files, vector<str
} }
void get_camera_params(int &device, float &fx, float &fy, float &cx, float &cy, vector<string> &arguments)
{
bool* valid = new bool[arguments.size()];
for(size_t i=0; i < arguments.size(); ++i)
{
valid[i] = true;
if (arguments[i].compare("-fx") == 0)
{
stringstream data(arguments[i+1]);
data >> fx;
valid[i] = false;
valid[i+1] = false;
i++;
}
else if (arguments[i].compare("-fy") == 0)
{
stringstream data(arguments[i+1]);
data >> fy;
valid[i] = false;
valid[i+1] = false;
i++;
}
else if (arguments[i].compare("-cx") == 0)
{
stringstream data(arguments[i+1]);
data >> cx;
valid[i] = false;
valid[i+1] = false;
i++;
}
else if (arguments[i].compare("-cy") == 0)
{
stringstream data(arguments[i+1]);
data >> cy;
valid[i] = false;
valid[i+1] = false;
i++;
}
else if (arguments[i].compare("-device") == 0)
{
stringstream data(arguments[i+1]);
data >> device;
valid[i] = false;
valid[i+1] = false;
i++;
}
}
for(int i=arguments.size()-1; i >= 0; --i)
{
if(!valid[i])
{
arguments.erase(arguments.begin()+i);
}
}
}
void get_image_input_output_params(vector<string> &input_image_files, vector<string> &output_feature_files, vector<string> &output_pose_files, vector<string> &output_image_files, void get_image_input_output_params(vector<string> &input_image_files, vector<string> &output_feature_files, vector<string> &output_pose_files, vector<string> &output_image_files,
vector<cv::Rect_<double>> &input_bounding_boxes, vector<string> &arguments) vector<cv::Rect_<double>> &input_bounding_boxes, vector<string> &arguments)
{ {

View file

@ -195,6 +195,13 @@ bool SequenceCapture::OpenWebcam(int device, int image_width, int image_height,
this->fps = capture.get(CV_CAP_PROP_FPS); this->fps = capture.get(CV_CAP_PROP_FPS);
// Check if fps is nan or less than 0
if (fps != fps || fps <= 0)
{
INFO_STREAM("FPS of the video file cannot be determined, assuming 30");
fps = 30;
}
// If optical centers are not defined just use center of image // If optical centers are not defined just use center of image
if (cx == -1) if (cx == -1)
{ {
@ -226,6 +233,13 @@ bool SequenceCapture::OpenVideoFile(std::string video_file, float fx, float fy,
this->fps = capture.get(CV_CAP_PROP_FPS); this->fps = capture.get(CV_CAP_PROP_FPS);
// Check if fps is nan or less than 0
if (fps != fps || fps <= 0)
{
INFO_STREAM("FPS of the video file cannot be determined, assuming 30");
fps = 30;
}
is_webcam = false; is_webcam = false;
is_image_seq = false; is_image_seq = false;