Big cleanup for SequenceCapture

This commit is contained in:
Tadas Baltrusaitis 2017-11-09 18:25:49 +00:00
parent 53d7d6b78c
commit 6c14aeab89
4 changed files with 54 additions and 167 deletions

View File

@ -98,7 +98,7 @@ vector<string> get_arguments(int argc, char **argv)
void get_visualization_params(bool& visualize_track, bool& visualize_align, bool& visualize_hog, vector<string> &arguments);
// Visualising the results
// Visualising the results TODO separate class
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)
{
@ -135,20 +135,20 @@ void visualise_tracking(cv::Mat& captured_image, const LandmarkDetector::CLNF& f
}
}
// Work out the framerate
if (frame_count % 10 == 0)
{
double t1 = cv::getTickCount();
fps_tracker = 10.0 / (double(t1 - t0) / cv::getTickFrequency());
t0 = t1;
}
// Work out the framerate TODO
//if (frame_count % 10 == 0)
//{
// double t1 = cv::getTickCount();
// fps_tracker = 10.0 / (double(t1 - t0) / cv::getTickFrequency());
// t0 = t1;
//}
// Write out the framerate on the image before displaying it
char fpsC[255];
std::sprintf(fpsC, "%d", (int)fps_tracker);
string fpsSt("FPS:");
fpsSt += fpsC;
cv::putText(captured_image, fpsSt, cv::Point(10, 20), CV_FONT_HERSHEY_SIMPLEX, 0.5, CV_RGB(255, 0, 0), 1, CV_AA);
//// Write out the framerate on the image before displaying it
//char fpsC[255];
//std::sprintf(fpsC, "%d", (int)fps_tracker);
//string fpsSt("FPS:");
//fpsSt += fpsC;
//cv::putText(captured_image, fpsSt, cv::Point(10, 20), CV_FONT_HERSHEY_SIMPLEX, 0.5, CV_RGB(255, 0, 0), 1, CV_AA);
}
@ -174,72 +174,35 @@ int main (int argc, char **argv)
FaceAnalysis::FaceAnalyserParameters face_analysis_params(arguments);
FaceAnalysis::FaceAnalyser face_analyser(face_analysis_params);
Utilities::SequenceCapture sequence_reader();
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())
// The sequence reader chooses what to open based on command line arguments provided
if(!sequence_reader.Open(arguments))
break;
string current_file;
INFO_STREAM("Device or file opened");
cv::Mat captured_image;
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::RecorderOpenFaceParameters recording_params(arguments, true, sequence_reader.fps);
Utilities::RecorderOpenFace open_face_rec(output_files[f_n], sequence_reader.name, recording_params);
int frame_count = 0;
// Use for timestamping if using a webcam
int64 t_initial = cv::getTickCount();
// Timestamp in seconds of current processing
double time_stamp = 0;
captured_image = sequence_reader.GetNextFrame();
INFO_STREAM("Starting tracking");
while (!captured_image.empty())
{
// Grab the timestamp first (TODO timestamp should be grabbed from sequence)
if (video_input)
{
time_stamp = (double)frame_count * (1.0 / fps_vid_in);
}
else
{
// if loading images assume 30fps
time_stamp = (double)frame_count * (1.0 / 30.0);
}
// Reading the images, TODO grayscale should be grabbed another way
cv::Mat_<uchar> grayscale_image;
if (captured_image.channels() == 3)
{
cvtColor(captured_image, grayscale_image, CV_BGR2GRAY);
}
else
{
grayscale_image = captured_image.clone();
}
// Converting to grayscale
cv::Mat_<uchar> grayscale_image = sequence_reader.GetGrayFrame();
// The actual facial landmark detection / tracking
bool detection_success;
if (video_input || images_as_video)
{
detection_success = LandmarkDetector::DetectLandmarksInVideo(grayscale_image, face_model, det_parameters);
}
else
{
detection_success = LandmarkDetector::DetectLandmarksInImage(grayscale_image, face_model, det_parameters);
}
bool detection_success = LandmarkDetector::DetectLandmarksInVideo(grayscale_image, face_model, det_parameters);
// Gaze tracking, absolute gaze direction
cv::Point3f gazeDirection0(0, 0, -1);
@ -308,24 +271,8 @@ int main (int argc, char **argv)
}
// Grabbing the next frame (todo this should be part of capture)
if(video_input)
{
video_capture >> captured_image;
}
else
{
curr_img++;
if(curr_img < (int)input_image_files[f_n].size())
{
string curr_img_file = input_image_files[f_n][curr_img];
captured_image = cv::imread(curr_img_file, -1);
}
else
{
captured_image = cv::Mat();
}
}
captured_image = sequence_reader.GetNextFrame();
if (!det_parameters.quiet_mode)
{
// detect key presses
@ -343,9 +290,6 @@ int main (int argc, char **argv)
}
}
// Update the frame count
frame_count++;
if(total_frames != -1)
{
if((double)frame_count/(double)total_frames >= reported_completion / 10.0)
@ -369,19 +313,6 @@ int main (int argc, char **argv)
face_analyser.Reset();
face_model.Reset();
frame_count = 0;
curr_img = -1;
if (total_frames != -1)
{
cout << endl;
}
// break out of the loop if done with all the files (or using a webcam)
if((video_input && f_n == input_files.size() -1) || (!video_input && f_n == input_image_files.size() - 1))
{
done = true;
}
}
return 0;
@ -438,68 +369,3 @@ void get_visualization_params(bool& visualize_track, bool& visualize_align, bool
}
// Can process images via directories creating a separate output file per directory
void get_image_input_output_params_feats(vector<vector<string> > &input_image_files, bool& as_video, 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("-fdir") == 0)
{
// parse the -fdir directory by reading in all of the .png and .jpg files in it
path image_directory(arguments[i + 1]);
try
{
// does the file exist and is it a directory
if (exists(image_directory) && is_directory(image_directory))
{
vector<path> file_in_directory;
copy(directory_iterator(image_directory), directory_iterator(), back_inserter(file_in_directory));
// Sort the images in the directory first
sort(file_in_directory.begin(), file_in_directory.end());
vector<string> curr_dir_files;
for (vector<path>::const_iterator file_iterator(file_in_directory.begin()); file_iterator != file_in_directory.end(); ++file_iterator)
{
// Possible image extension .jpg and .png
if (file_iterator->extension().string().compare(".jpg") == 0 || file_iterator->extension().string().compare(".png") == 0)
{
curr_dir_files.push_back(file_iterator->string());
}
}
input_image_files.push_back(curr_dir_files);
}
}
catch (const filesystem_error& ex)
{
cout << ex.what() << '\n';
}
valid[i] = false;
valid[i + 1] = false;
i++;
}
else if (arguments[i].compare("-asvid") == 0)
{
as_video = true;
}
}
// Clear up the argument list
for (int i = arguments.size() - 1; i >= 0; --i)
{
if (!valid[i])
{
arguments.erase(arguments.begin() + i);
}
}
}

View File

@ -88,6 +88,11 @@ namespace Utilities
float fx, fy, cx, cy;
double fps;
// Name of the video file, image directory, or the webcam
std::string name;
private:
// Used for capturing webcam and video
@ -97,7 +102,6 @@ namespace Utilities
cv::Mat latest_frame;
cv::Mat latest_gray_frame;
double fps;
// Keeping track if we are opening a video, webcam or image sequence
bool is_webcam;

View File

@ -109,14 +109,11 @@ RecorderOpenFace::RecorderOpenFace(const std::string out_directory, const std::s
}
// TODO move to actual write
void RecorderOpenFace::SetObservationFaceAlign(const cv::Mat& aligned_face)
{
this->aligned_face = aligned_face;
}
void RecorderOpenFace::SetObservationVisualization(const cv::Mat &vis_track)
{
if (params.outputTrackedVideo())
@ -142,7 +139,6 @@ void RecorderOpenFace::SetObservationVisualization(const cv::Mat &vis_track)
}
void RecorderOpenFace::WriteObservation()
{
observation_count++;

View File

@ -45,6 +45,15 @@
using namespace Utilities;
#define INFO_STREAM( stream ) \
std::cout << stream << std::endl
#define WARN_STREAM( stream ) \
std::cout << "Warning: " << stream << std::endl
#define ERROR_STREAM( stream ) \
std::cout << "Error: " << stream << std::endl
bool SequenceCapture::Open(std::vector<std::string> arguments)
{
@ -154,11 +163,13 @@ bool SequenceCapture::Open(std::vector<std::string> arguments)
{
return OpenImageSequence(input_sequence_directory, fx, fy, cx, cy);
}
// If none opened, return false
return false;
}
bool SequenceCapture::OpenWebcam(int device, int image_width, int image_height, float fx, float fy, float cx, float cy)
{
INFO_STREAM("Attempting to read from webcam: " << device);
if (device < 0)
{
@ -218,6 +229,8 @@ bool SequenceCapture::OpenWebcam(int device, int image_width, int image_height,
fy = fx;
}
this->name = "webcam"; // TODO number
return true;
}
@ -226,6 +239,8 @@ bool SequenceCapture::OpenWebcam(int device, int image_width, int image_height,
bool SequenceCapture::OpenVideoFile(std::string video_file, float fx, float fy, float cx, float cy)
{
INFO_STREAM("Attempting to read from file: " << video_file);
latest_frame = cv::Mat();
latest_gray_frame = cv::Mat();
@ -236,7 +251,7 @@ bool SequenceCapture::OpenVideoFile(std::string video_file, float fx, float fy,
// 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");
WARN_STREAM("FPS of the video file cannot be determined, assuming 30");
fps = 30;
}
@ -271,12 +286,16 @@ bool SequenceCapture::OpenVideoFile(std::string video_file, float fx, float fy,
fy = fx;
}
this->name = boost::filesystem::path(video_file).filename.replace_extension("").string();
return true;
}
bool SequenceCapture::OpenImageSequence(std::string directory, float fx, float fy, float cx, float cy)
{
INFO_STREAM("Attempting to read from directory: " << directory);
image_files.clear();
boost::filesystem::path image_directory(directory);
@ -329,6 +348,8 @@ bool SequenceCapture::OpenImageSequence(std::string directory, float fx, float f
// No fps as we have a sequence
this->fps = 0;
this->name = boost::filesystem::path(directory).filename.string();
return true;
}