Skip to content

Commit 2c04360

Browse files
committed
opencv#4 AAM and LBF
1 parent 8a9c278 commit 2c04360

File tree

6 files changed

+67
-34
lines changed

6 files changed

+67
-34
lines changed

modules/face/include/opencv2/face/face_alignment.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ class CV_EXPORTS_W FacemarkKazemi : public Algorithm
3636
//! configfile stores the name of the file containing the values of training parameters
3737
String configfile;
3838
};
39-
CV_WRAP static Ptr<FacemarkKazemi> create();
4039
static Ptr<FacemarkKazemi> create(const FacemarkKazemi::Params &parameters);
40+
CV_WRAP static Ptr<FacemarkKazemi> create();
4141
virtual ~FacemarkKazemi();
4242

4343
/// @brief training the facemark model, input are the file names of image list and landmark annotation
@@ -59,7 +59,7 @@ class CV_EXPORTS_W FacemarkKazemi : public Algorithm
5959
/** @brief This functions retrieves a centered and scaled face shape, according to the bounding rectangle.
6060
*@param image A variable of type cv::InputArray which stores the image whose landmarks have to be found
6161
*@param faces A variable of type cv::InputArray which stores the bounding boxes of faces found in a given image.
62-
*@param landmarks A variable of type cv::InputOutputArray which stores the landmarks of all the faces found in the image
62+
*@param landmarks A variable of type cv::OutputArray which stores the landmarks of all the faces found in the image
6363
*/
6464
CV_WRAP virtual bool fit( InputArray image, InputArray faces, OutputArray landmarks )=0;//!< from many ROIs
6565
/// set the custom face detector

modules/face/include/opencv2/face/facemark.hpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -342,16 +342,14 @@ class CV_EXPORTS_W Facemark : public virtual Algorithm
342342
facemark->loadModel("../data/lbf.model");
343343
@endcode
344344
*/
345-
virtual void loadModel(String model)=0;
345+
CV_WRAP virtual void loadModel(String model)=0;
346346
// virtual void saveModel(String fs)=0;
347347

348-
/** @brief Trains a Facemark algorithm using the given dataset.
348+
/** @brief Fits landmark points to faces.
349349
350350
@param image Input image.
351-
@param faces Output of the function which represent region of interest of the detected faces.
352-
Each face is stored in cv::Rect container.
351+
@param faces A vector of cv::Rect, one per face, from previous face detection.
353352
@param landmarks The detected landmark points for each faces.
354-
@param config Algorithm specific for running time parameters.
355353
356354
<B>Example of usage</B>
357355
@code
@@ -361,12 +359,10 @@ class CV_EXPORTS_W Facemark : public virtual Algorithm
361359
facemark->fit(image, faces, landmarks);
362360
@endcode
363361
364-
TODO remove "config" from here
365362
*/
366-
virtual bool fit( InputArray image,
363+
CV_WRAP virtual bool fit( InputArray image,
367364
InputArray faces,
368-
InputOutputArray landmarks,
369-
void * config = 0)=0;
365+
OutputArray landmarks)=0;
370366

371367
/** @brief Set a user defined face detector for the Facemark algorithm.
372368
@param detector The user defined face detector function

modules/face/include/opencv2/face/facemarkAAM.hpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,29 @@ class CV_EXPORTS_W FacemarkAAM : public Facemark
147147

148148
};
149149

150+
/** @brief Fits a model.
151+
152+
@param image Input image.
153+
@param faces A vector of cv::Rect, one per face, from previous face detection.
154+
@param landmarks The detected landmark points for each faces.
155+
@param config a vector of Config structs (rotation,translation,scale), one per face.
156+
157+
<B>Example of usage</B>
158+
@code
159+
Mat image = imread("image.jpg");
160+
std::vector<Rect> faces;
161+
std::vector<std::vector<Point2f> > landmarks;
162+
facemark->fit(image, faces, landmarks);
163+
@endcode
164+
165+
*/
166+
virtual bool fit( InputArray image,
167+
InputArray faces,
168+
OutputArray landmarks,
169+
const std::vector<Config> &configs)=0;
150170
//!< initializer
151-
static Ptr<FacemarkAAM> create(const FacemarkAAM::Params &parameters = FacemarkAAM::Params() );
171+
CV_WRAP static Ptr<FacemarkAAM> create();
172+
static Ptr<FacemarkAAM> create(const FacemarkAAM::Params &parameters);
152173
virtual ~FacemarkAAM() {}
153174

154175
}; /* AAM */

modules/face/include/opencv2/face/facemarkLBF.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ class CV_EXPORTS_W FacemarkLBF : public Facemark
108108
double width, height;
109109
};
110110

111-
static Ptr<FacemarkLBF> create(const FacemarkLBF::Params &parameters = FacemarkLBF::Params() );
111+
CV_WRAP static Ptr<FacemarkLBF> create();
112+
static Ptr<FacemarkLBF> create(const FacemarkLBF::Params &parameters);
112113
virtual ~FacemarkLBF(){};
113114
}; /* LBF */
114115

modules/face/src/facemarkAAM.cpp

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ class FacemarkAAMImpl : public FacemarkAAM {
105105

106106
protected:
107107

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

111112
bool addTrainingSample(InputArray image, InputArray landmarks);
@@ -152,6 +153,9 @@ class FacemarkAAMImpl : public FacemarkAAM {
152153
Ptr<FacemarkAAM> FacemarkAAM::create(const FacemarkAAM::Params &parameters){
153154
return Ptr<FacemarkAAMImpl>(new FacemarkAAMImpl(parameters));
154155
}
156+
Ptr<FacemarkAAM> FacemarkAAM::create(){
157+
return Ptr<FacemarkAAMImpl>();
158+
}
155159

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

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

324328
Mat img = image.getMat();
325-
if(runtime_params!=0){
326329

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

339-
for(unsigned i=0; i<faces.size();i++){
340-
fitImpl(img, landmarks[i], R,t, scale);
341-
}
337+
return true;
338+
}
339+
340+
bool FacemarkAAMImpl::fit( InputArray image, InputArray roi, OutputArray _landmarks)
341+
{
342+
std::vector<Rect> & faces = *(std::vector<Rect> *)roi.getObj();
343+
if(faces.size()<1) return false;
344+
345+
std::vector<std::vector<Point2f> > & landmarks =
346+
*(std::vector<std::vector<Point2f> >*) _landmarks.getObj();
347+
landmarks.resize(faces.size());
348+
349+
Mat img = image.getMat();
350+
Mat R = Mat::eye(2, 2, CV_32F);
351+
Point2f t = Point2f((float)(img.cols/2.0),(float)(img.rows/2.0));
352+
float scale = 1.0;
353+
354+
for(unsigned i=0; i<faces.size();i++){
355+
fitImpl(img, landmarks[i], R,t, scale);
342356
}
343357

344358
return true;

modules/face/src/facemarkLBF.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ class FacemarkLBFImpl : public FacemarkLBF {
115115

116116
protected:
117117

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

121121
bool addTrainingSample(InputArray image, InputArray landmarks);
@@ -248,6 +248,9 @@ class FacemarkLBFImpl : public FacemarkLBF {
248248
Ptr<FacemarkLBF> FacemarkLBF::create(const FacemarkLBF::Params &parameters){
249249
return Ptr<FacemarkLBFImpl>(new FacemarkLBFImpl(parameters));
250250
}
251+
Ptr<FacemarkLBF> FacemarkLBF::create(){
252+
return Ptr<FacemarkLBFImpl>();
253+
}
251254

252255
FacemarkLBFImpl::FacemarkLBFImpl( const FacemarkLBF::Params &parameters ) :
253256
faceDetector(NULL), faceDetectorData(NULL)
@@ -363,10 +366,8 @@ void FacemarkLBFImpl::training(void* parameters){
363366
isModelTrained = true;
364367
}
365368

366-
bool FacemarkLBFImpl::fit( InputArray image, InputArray roi, InputOutputArray _landmarks, void * runtime_params )
369+
bool FacemarkLBFImpl::fit( InputArray image, InputArray roi, OutputArray _landmarks)
367370
{
368-
CV_UNUSED(runtime_params);
369-
370371
// FIXIT
371372
std::vector<Rect> & faces = *(std::vector<Rect> *)roi.getObj();
372373
if (faces.empty()) return false;

0 commit comments

Comments
 (0)