Skip to content

Commit

Permalink
opencv#4 AAM and LBF
Browse files Browse the repository at this point in the history
  • Loading branch information
berak committed Dec 24, 2017
1 parent 8a9c278 commit 2c04360
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 34 deletions.
4 changes: 2 additions & 2 deletions modules/face/include/opencv2/face/face_alignment.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ class CV_EXPORTS_W FacemarkKazemi : public Algorithm
//! configfile stores the name of the file containing the values of training parameters
String configfile;
};
CV_WRAP static Ptr<FacemarkKazemi> create();
static Ptr<FacemarkKazemi> create(const FacemarkKazemi::Params &parameters);
CV_WRAP static Ptr<FacemarkKazemi> create();
virtual ~FacemarkKazemi();

/// @brief training the facemark model, input are the file names of image list and landmark annotation
Expand All @@ -59,7 +59,7 @@ class CV_EXPORTS_W FacemarkKazemi : public Algorithm
/** @brief This functions retrieves a centered and scaled face shape, according to the bounding rectangle.
*@param image A variable of type cv::InputArray which stores the image whose landmarks have to be found
*@param faces A variable of type cv::InputArray which stores the bounding boxes of faces found in a given image.
*@param landmarks A variable of type cv::InputOutputArray which stores the landmarks of all the faces found in the image
*@param landmarks A variable of type cv::OutputArray which stores the landmarks of all the faces found in the image
*/
CV_WRAP virtual bool fit( InputArray image, InputArray faces, OutputArray landmarks )=0;//!< from many ROIs
/// set the custom face detector
Expand Down
14 changes: 5 additions & 9 deletions modules/face/include/opencv2/face/facemark.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -342,16 +342,14 @@ class CV_EXPORTS_W Facemark : public virtual Algorithm
facemark->loadModel("../data/lbf.model");
@endcode
*/
virtual void loadModel(String model)=0;
CV_WRAP virtual void loadModel(String model)=0;
// virtual void saveModel(String fs)=0;

/** @brief Trains a Facemark algorithm using the given dataset.
/** @brief Fits landmark points to faces.
@param image Input image.
@param faces Output of the function which represent region of interest of the detected faces.
Each face is stored in cv::Rect container.
@param faces A vector of cv::Rect, one per face, from previous face detection.
@param landmarks The detected landmark points for each faces.
@param config Algorithm specific for running time parameters.
<B>Example of usage</B>
@code
Expand All @@ -361,12 +359,10 @@ class CV_EXPORTS_W Facemark : public virtual Algorithm
facemark->fit(image, faces, landmarks);
@endcode
TODO remove "config" from here
*/
virtual bool fit( InputArray image,
CV_WRAP virtual bool fit( InputArray image,
InputArray faces,
InputOutputArray landmarks,
void * config = 0)=0;
OutputArray landmarks)=0;

/** @brief Set a user defined face detector for the Facemark algorithm.
@param detector The user defined face detector function
Expand Down
23 changes: 22 additions & 1 deletion modules/face/include/opencv2/face/facemarkAAM.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,29 @@ class CV_EXPORTS_W FacemarkAAM : public Facemark

};

/** @brief Fits a model.
@param image Input image.
@param faces A vector of cv::Rect, one per face, from previous face detection.
@param landmarks The detected landmark points for each faces.
@param config a vector of Config structs (rotation,translation,scale), one per face.
<B>Example of usage</B>
@code
Mat image = imread("image.jpg");
std::vector<Rect> faces;
std::vector<std::vector<Point2f> > landmarks;
facemark->fit(image, faces, landmarks);
@endcode
*/
virtual bool fit( InputArray image,
InputArray faces,
OutputArray landmarks,
const std::vector<Config> &configs)=0;
//!< initializer
static Ptr<FacemarkAAM> create(const FacemarkAAM::Params &parameters = FacemarkAAM::Params() );
CV_WRAP static Ptr<FacemarkAAM> create();
static Ptr<FacemarkAAM> create(const FacemarkAAM::Params &parameters);
virtual ~FacemarkAAM() {}

}; /* AAM */
Expand Down
3 changes: 2 additions & 1 deletion modules/face/include/opencv2/face/facemarkLBF.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ class CV_EXPORTS_W FacemarkLBF : public Facemark
double width, height;
};

static Ptr<FacemarkLBF> create(const FacemarkLBF::Params &parameters = FacemarkLBF::Params() );
CV_WRAP static Ptr<FacemarkLBF> create();
static Ptr<FacemarkLBF> create(const FacemarkLBF::Params &parameters);
virtual ~FacemarkLBF(){};
}; /* LBF */

Expand Down
48 changes: 31 additions & 17 deletions modules/face/src/facemarkAAM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ class FacemarkAAMImpl : public FacemarkAAM {

protected:

bool fit( InputArray image, InputArray faces, InputOutputArray landmarks, void * runtime_params);//!< from many ROIs
bool fit(InputArray image, InputArray faces, OutputArray landmarks);
bool fit(InputArray image, InputArray faces, OutputArray landmarks, const std::vector<Config> &runtime_params);//!< from many ROIs
bool fitImpl( const Mat image, std::vector<Point2f>& landmarks,const Mat R,const Point2f T,const float scale, const int sclIdx=0 );

bool addTrainingSample(InputArray image, InputArray landmarks);
Expand Down Expand Up @@ -152,6 +153,9 @@ class FacemarkAAMImpl : public FacemarkAAM {
Ptr<FacemarkAAM> FacemarkAAM::create(const FacemarkAAM::Params &parameters){
return Ptr<FacemarkAAMImpl>(new FacemarkAAMImpl(parameters));
}
Ptr<FacemarkAAM> FacemarkAAM::create(){
return Ptr<FacemarkAAMImpl>();
}

FacemarkAAMImpl::FacemarkAAMImpl( const FacemarkAAM::Params &parameters ) :
params( parameters ),
Expand Down Expand Up @@ -312,7 +316,7 @@ void FacemarkAAMImpl::training(void* parameters){
if(params.verbose) printf("Training is completed\n");
}

bool FacemarkAAMImpl::fit( InputArray image, InputArray roi, InputOutputArray _landmarks, void * runtime_params)
bool FacemarkAAMImpl::fit( InputArray image, InputArray roi, OutputArray _landmarks, const std::vector<Config> &conf)
{
std::vector<Rect> & faces = *(std::vector<Rect> *)roi.getObj();
if(faces.size()<1) return false;
Expand All @@ -322,23 +326,33 @@ bool FacemarkAAMImpl::fit( InputArray image, InputArray roi, InputOutputArray _l
landmarks.resize(faces.size());

Mat img = image.getMat();
if(runtime_params!=0){

std::vector<Config> conf = *(std::vector<Config>*)runtime_params;
if (conf.size()!=faces.size()) {
CV_Error(Error::StsBadArg, "Number of faces and extra_parameters are different!");
}
for(size_t i=0; i<conf.size();i++){
fitImpl(img, landmarks[i], conf[i].R,conf[i].t, conf[i].scale, conf[i].model_scale_idx);
}
}else{
Mat R = Mat::eye(2, 2, CV_32F);
Point2f t = Point2f((float)(img.cols/2.0),(float)(img.rows/2.0));
float scale = 1.0;
if (conf.size()!=faces.size()) {
CV_Error(Error::StsBadArg, "Number of faces and extra_parameters are different!");
}
for(size_t i=0; i<conf.size();i++){
fitImpl(img, landmarks[i], conf[i].R,conf[i].t, conf[i].scale, conf[i].model_scale_idx);
}

for(unsigned i=0; i<faces.size();i++){
fitImpl(img, landmarks[i], R,t, scale);
}
return true;
}

bool FacemarkAAMImpl::fit( InputArray image, InputArray roi, OutputArray _landmarks)
{
std::vector<Rect> & faces = *(std::vector<Rect> *)roi.getObj();
if(faces.size()<1) return false;

std::vector<std::vector<Point2f> > & landmarks =
*(std::vector<std::vector<Point2f> >*) _landmarks.getObj();
landmarks.resize(faces.size());

Mat img = image.getMat();
Mat R = Mat::eye(2, 2, CV_32F);
Point2f t = Point2f((float)(img.cols/2.0),(float)(img.rows/2.0));
float scale = 1.0;

for(unsigned i=0; i<faces.size();i++){
fitImpl(img, landmarks[i], R,t, scale);
}

return true;
Expand Down
9 changes: 5 additions & 4 deletions modules/face/src/facemarkLBF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ class FacemarkLBFImpl : public FacemarkLBF {

protected:

bool fit( InputArray image, InputArray faces, InputOutputArray landmarks, void * runtime_params );//!< from many ROIs
bool fit( InputArray image, InputArray faces, OutputArray landmarks);
bool fitImpl( const Mat image, std::vector<Point2f> & landmarks );//!< from a face

bool addTrainingSample(InputArray image, InputArray landmarks);
Expand Down Expand Up @@ -248,6 +248,9 @@ class FacemarkLBFImpl : public FacemarkLBF {
Ptr<FacemarkLBF> FacemarkLBF::create(const FacemarkLBF::Params &parameters){
return Ptr<FacemarkLBFImpl>(new FacemarkLBFImpl(parameters));
}
Ptr<FacemarkLBF> FacemarkLBF::create(){
return Ptr<FacemarkLBFImpl>();
}

FacemarkLBFImpl::FacemarkLBFImpl( const FacemarkLBF::Params &parameters ) :
faceDetector(NULL), faceDetectorData(NULL)
Expand Down Expand Up @@ -363,10 +366,8 @@ void FacemarkLBFImpl::training(void* parameters){
isModelTrained = true;
}

bool FacemarkLBFImpl::fit( InputArray image, InputArray roi, InputOutputArray _landmarks, void * runtime_params )
bool FacemarkLBFImpl::fit( InputArray image, InputArray roi, OutputArray _landmarks)
{
CV_UNUSED(runtime_params);

// FIXIT
std::vector<Rect> & faces = *(std::vector<Rect> *)roi.getObj();
if (faces.empty()) return false;
Expand Down

0 comments on commit 2c04360

Please sign in to comment.