/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2017, Carnegie Mellon University and University of Cambridge, // 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š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š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š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šaitis, Peter Robinson, and Louis-Philippe Morency. // in IEEE Int. Conference on Computer Vision Workshops, 300 Faces in-the-Wild Challenge, 2013. // /////////////////////////////////////////////////////////////////////////////// #ifndef __Patch_experts_h_ #define __Patch_experts_h_ // OpenCV includes #include #include "SVR_patch_expert.h" #include "CCNF_patch_expert.h" #include "PDM.h" namespace LandmarkDetector { //=========================================================================== /** Combined class for all of the patch experts */ class Patch_experts { public: // The collection of SVR patch experts (for intensity/grayscale images), the experts are laid out scale->view->landmark vector > > svr_expert_intensity; // The collection of SVR patch experts (for depth/range images), the experts are laid out scale->view->landmark vector > > svr_expert_depth; // The collection of LNF (CCNF) patch experts (for intensity images), the experts are laid out scale->view->landmark vector > > ccnf_expert_intensity; // The node connectivity for CCNF experts, at different window sizes and corresponding to separate edge features vector > > sigma_components; // The available scales for intensity patch experts vector patch_scaling; // The available views for the patch experts at every scale (in radians) vector > centers; // Landmark visibilities for each scale and view vector > > visibilities; // A default constructor Patch_experts(){;} // A copy constructor Patch_experts(const Patch_experts& other); // Returns the patch expert responses given a grayscale and an optional depth image. // Additionally returns the transform from the image coordinates to the response coordinates (and vice versa). // The computation also requires the current landmark locations to compute response around, the PDM corresponding to the desired model, and the parameters describing its instance // Also need to provide the size of the area of interest and the desired scale of analysis void Response(vector >& patch_expert_responses, cv::Matx22f& sim_ref_to_img, cv::Matx22d& sim_img_to_ref, const cv::Mat_& grayscale_image, const cv::Mat_& depth_image, const PDM& pdm, const cv::Vec6d& params_global, const cv::Mat_& params_local, int window_size, int scale); // Getting the best view associated with the current orientation int GetViewIdx(const cv::Vec6d& params_global, int scale) const; // The number of views at a particular scale inline int nViews(size_t scale = 0) const { return (int)centers[scale].size(); }; // Reading in all of the patch experts void Read(vector intensity_svr_expert_locations, vector depth_svr_expert_locations, vector intensity_ccnf_expert_locations); private: void Read_SVR_patch_experts(string expert_location, std::vector& centers, std::vector >& visibility, std::vector >& patches, double& scale); void Read_CCNF_patch_experts(string patchesFileLocation, std::vector& centers, std::vector >& visibility, std::vector >& patches, double& patchScaling); }; } #endif