2017-11-01 20:39:49 +01:00
///////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2017, Tadas Baltrusaitis all rights reserved.
//
// ACADEMIC OR NON-PROFIT ORGANIZATION NONCOMMERCIAL RESEARCH USE ONLY
//
// BY USING OR DOWNLOADING THE SOFTWARE, YOU ARE AGREEING TO THE TERMS OF THIS LICENSE AGREEMENT.
// IF YOU DO NOT AGREE WITH THESE TERMS, YOU MAY NOT USE OR DOWNLOAD THE SOFTWARE.
//
// License can be found in OpenFace-license.txt
//
// * Any publications arising from the use of this software, including but
// not limited to academic journal and conference publications, technical
// reports and manuals, must cite at least one of the following works:
//
// OpenFace: an open source facial behavior analysis toolkit
// Tadas Baltru<72> aitis, Peter Robinson, and Louis-Philippe Morency
// in IEEE Winter Conference on Applications of Computer Vision, 2016
//
// Rendering of Eyes for Eye-Shape Registration and Gaze Estimation
// Erroll Wood, Tadas Baltru<72> aitis, Xucong Zhang, Yusuke Sugano, Peter Robinson, and Andreas Bulling
// in IEEE International. Conference on Computer Vision (ICCV), 2015
//
// Cross-dataset learning and person-speci?c normalisation for automatic Action Unit detection
// Tadas Baltru<72> aitis, Marwa Mahmoud, and Peter Robinson
// in Facial Expression Recognition and Analysis Challenge,
// IEEE International Conference on Automatic Face and Gesture Recognition, 2015
//
// Constrained Local Neural Fields for robust facial landmark detection in the wild.
// Tadas Baltru<72> aitis, Peter Robinson, and Louis-Philippe Morency.
// in IEEE Int. Conference on Computer Vision Workshops, 300 Faces in-the-Wild Challenge, 2013.
//
///////////////////////////////////////////////////////////////////////////////
2017-11-08 10:02:50 +01:00
# ifndef __SEQUENCE_CAPTURE_h_
# define __SEQUENCE_CAPTURE_h_
2017-11-01 20:39:49 +01:00
// System includes
2017-11-08 10:02:50 +01:00
# include <fstream>
# include <sstream>
2017-11-01 20:39:49 +01:00
# include <vector>
2017-11-02 21:11:58 +01:00
// OpenCV includes
2017-11-01 20:39:49 +01:00
# include <opencv2/core/core.hpp>
2017-11-08 10:02:50 +01:00
# include <opencv2/highgui/highgui.hpp>
2017-11-01 20:39:49 +01:00
2017-11-08 10:02:50 +01:00
namespace Utilities
2017-11-01 20:39:49 +01:00
{
//===========================================================================
/**
2017-11-08 10:02:50 +01:00
A class for capturing sequences from video , webcam , and image directories
2017-11-01 20:39:49 +01:00
*/
2017-11-08 10:02:50 +01:00
class SequenceCapture {
2017-11-01 20:39:49 +01:00
public :
2017-11-08 10:02:50 +01:00
// Default constructor
2017-11-08 21:50:46 +01:00
SequenceCapture ( ) { } ;
2017-12-15 20:56:58 +01:00
// Destructor
~ SequenceCapture ( ) ;
2017-11-08 10:02:50 +01:00
// Opening based on command line arguments
2017-11-10 21:40:59 +01:00
bool Open ( std : : vector < std : : string > & arguments ) ;
2017-11-08 10:02:50 +01:00
// Direct opening
2017-11-01 20:39:49 +01:00
2017-11-08 10:02:50 +01:00
// Webcam
2017-11-08 20:38:37 +01:00
bool OpenWebcam ( int device_id , int image_width = 640 , int image_height = 480 , float fx = - 1 , float fy = - 1 , float cx = - 1 , float cy = - 1 ) ;
2017-11-03 17:40:07 +01:00
2017-11-08 10:02:50 +01:00
// Image sequence in the directory
2017-11-08 20:38:37 +01:00
bool OpenImageSequence ( std : : string directory , float fx = - 1 , float fy = - 1 , float cx = - 1 , float cy = - 1 ) ;
2017-11-01 20:39:49 +01:00
2017-11-08 10:02:50 +01:00
// Video file
2017-11-08 20:38:37 +01:00
bool OpenVideoFile ( std : : string video_file , float fx = - 1 , float fy = - 1 , float cx = - 1 , float cy = - 1 ) ;
2017-11-24 18:16:15 +01:00
bool IsWebcam ( ) { return is_webcam ; }
2017-11-08 21:50:46 +01:00
// Getting the next frame
cv : : Mat GetNextFrame ( ) ;
// Getting the most recent grayscale frame (need to call GetNextFrame first)
cv : : Mat_ < uchar > GetGrayFrame ( ) ;
2017-11-09 20:56:16 +01:00
// Parameters describing the sequence and it's progress
2017-11-08 21:50:46 +01:00
double GetProgress ( ) ;
bool IsOpened ( ) ;
2017-11-08 20:38:37 +01:00
int frame_width ;
int frame_height ;
float fx , fy , cx , cy ;
2017-11-01 20:39:49 +01:00
2017-11-09 19:25:49 +01:00
double fps ;
2017-11-09 20:56:16 +01:00
double time_stamp ;
2017-11-09 19:25:49 +01:00
// Name of the video file, image directory, or the webcam
std : : string name ;
2017-11-10 19:49:30 +01:00
// Allows to differentiate if failed because no input specified or if failed to open a specified input
bool no_input_specified ;
2017-11-24 18:16:15 +01:00
2017-11-01 20:39:49 +01:00
private :
2017-11-01 20:59:23 +01:00
2017-12-15 20:56:58 +01:00
// Blocking copy and move, as it doesn't make sense to have several readers pointed at the same source, and this would cause issues, especially with webcams
SequenceCapture & operator = ( const SequenceCapture & other ) ;
SequenceCapture & operator = ( const SequenceCapture & & other ) ;
SequenceCapture ( const SequenceCapture & & other ) ;
SequenceCapture ( const SequenceCapture & other ) ;
2017-11-08 10:02:50 +01:00
// Used for capturing webcam and video
cv : : VideoCapture capture ;
// Storing the latest captures
cv : : Mat latest_frame ;
2017-12-15 20:56:58 +01:00
cv : : Mat_ < uchar > latest_gray_frame ;
2017-11-24 18:16:15 +01:00
2017-11-08 10:02:50 +01:00
// Keeping track of frame number and the files in the image sequence
2017-11-09 21:43:53 +01:00
size_t frame_num ;
2017-11-08 10:02:50 +01:00
std : : vector < std : : string > image_files ;
// Length of video allowing to assess progress
2017-11-09 21:43:53 +01:00
size_t vid_length ;
2017-11-01 20:39:49 +01:00
2017-11-09 20:56:16 +01:00
// If using a webcam, helps to keep track of time
int64 start_time ;
2017-11-09 21:43:53 +01:00
2017-11-24 18:16:15 +01:00
// Keeping track if we are opening a video, webcam or image sequence
bool is_webcam ;
bool is_image_seq ;
2017-11-09 21:43:53 +01:00
void SetCameraIntrinsics ( float fx , float fy , float cx , float cy ) ;
2017-11-10 19:49:30 +01:00
2017-11-01 20:39:49 +01:00
} ;
}
# endif