00001
00061 #ifndef __FACE_RECOGNIZER_H__
00062 #define __FACE_RECOGNIZER_H__
00063
00064 #ifdef __LINUX__
00065 #include <cob_people_detection/abstract_face_recognizer.h>
00066 #include <cob_people_detection/face_normalizer.h>
00067 #include <cob_people_detection/face_recognizer_algorithms.h>
00068 #else
00069 #include "cob_vision/cob_vision_ipa_utils/common/include/cob_vision_ipa_utils/MathUtils.h"
00070 #include "cob_vision/cob_sensor_fusion/common/include/cob_sensor_fusion/ColoredPointCloud.h"
00071 #endif
00072
00073
00074 #include <opencv/cv.h>
00075 #include <opencv/ml.h>
00076
00077
00078 #include <boost/thread/mutex.hpp>
00079 #include <boost/thread/locks.hpp>
00080 #include "boost/filesystem/path.hpp"
00081 #include "boost/lexical_cast.hpp"
00082
00083 #include <algorithm>
00084 namespace ipa_PeopleDetector
00085 {
00086
00087 class FaceRecognizer: public AbstractFaceRecognizer
00088 {
00089 public:
00090
00092 FaceRecognizer(void);
00093 ~FaceRecognizer(void);
00094
00100 virtual unsigned long init(std::string data_directory, int norm_size, bool norm_illumination, bool norm_align, bool norm_extreme_illumination, int metric, bool debug,
00101 std::vector<std::string>& identification_labels_to_recognize, int subs_meth, int feature_dim, bool use_unknown_thresh, bool use_depth);
00102
00108 virtual unsigned long initTraining(std::string data_directory, int norm_size, bool norm_illumination, bool norm_align, bool norm_extreme_illumination, bool debug,
00109 std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps, bool use_depth);
00110
00118 virtual unsigned long addFace(cv::Mat& color_image, cv::Mat& depth_image, cv::Rect& face_bounding_box, cv::Rect& head_bounding_box, std::string label,
00119 std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps);
00120
00125 virtual unsigned long updateFaceLabels(std::string old_label, std::string new_label);
00126
00131 virtual unsigned long updateFaceLabel(int index, std::string new_label);
00132
00137 virtual unsigned long deleteFaces(std::string label, std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps);
00138
00143 virtual unsigned long deleteFace(int index, std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps);
00144
00148 virtual unsigned long saveTrainingData(std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps);
00149 virtual unsigned long saveTrainingData(std::vector<cv::Mat>& face_images);
00150
00154 virtual unsigned long trainRecognitionModel(std::vector<std::string>& identification_labels_to_train);
00155
00158 virtual unsigned long saveRecognitionModel();
00159
00163 virtual unsigned long loadRecognitionModel(std::vector<std::string>& identification_labels_to_recognize);
00164
00165 enum Metrics
00166 {
00167 EUCLIDEAN, MAHALANOBIS, MAHALANOBISCOSINE
00168 };
00169
00170 protected:
00171
00178 virtual unsigned long recognizeFace(cv::Mat& color_image, std::vector<cv::Rect>& face_coordinates, std::vector<std::string>& identification_labels);
00179 virtual unsigned long recognizeFace(cv::Mat& color_image, cv::Mat& depth_image, std::vector<cv::Rect>& face_coordinates, std::vector<std::string>& identification_labels);
00180
00187 virtual unsigned long convertAndResize(cv::Mat& img, cv::Mat& resized, cv::Rect& face, cv::Size new_size);
00188
00193 virtual unsigned long loadTrainingData(std::vector<cv::Mat>& face_images, std::vector<std::string>& identification_labels_to_train);
00194 virtual unsigned long loadTrainingData(std::vector<cv::Mat>& face_images, std::vector<cv::Mat>& face_depthmaps, std::vector<std::string>& identification_labels_to_train);
00195
00199 void assertDirectories(boost::filesystem::path& data_directory);
00200
00201
00202 std::vector<std::string> depth_str_labels;
00203 std::vector<std::string> depth_str_labels_unique;
00204 std::vector<int> depth_num_labels;
00205
00206 FaceNormalizer face_normalizer_;
00207
00208 ipa_PeopleDetector::FaceRecognizerBaseClass* eff_depth;
00209 ipa_PeopleDetector::FaceRecognizerBaseClass* eff_color;
00210 std::vector<int> m_label_num;
00211 int m_rec_method;
00212 std::vector<bool> dm_exist;
00213 bool m_depth_mode;
00214 ipa_PeopleDetector::Method m_subs_meth;
00215 bool m_use_unknown_thresh;
00216 unsigned long trainFaceRecognition(ipa_PeopleDetector::FaceRecognizerBaseClass* eff, std::vector<cv::Mat>& data, std::vector<int>& labels);
00217
00218
00219
00220
00221 std::vector<cv::Mat> m_eigenvectors;
00222 IplImage** m_eigenvectors_ipl;
00223 cv::Mat m_eigenvalues;
00224 cv::Mat m_average_image;
00225 cv::Mat m_projected_training_faces;
00226 std::vector<std::string> m_face_labels;
00227 cv::Mat m_face_class_average_projections;
00228 std::vector<std::string> m_current_label_set;
00229 cv::SVM m_face_classifier;
00230 boost::filesystem::path m_data_directory;
00231
00232
00233 boost::mutex m_data_mutex;
00234
00235
00236 int m_norm_size;
00237 int m_eigenvectors_per_person;
00238 double m_threshold_facespace;
00239 double m_threshold_unknown;
00240 int m_metric;
00241 bool m_debug;
00242
00243 int m_feature_dim;
00244 };
00245
00246 }
00247
00248 #endif // __FACE_RECOGNIZER_H__