00001
00002
00003
00004
00005
00006 #ifndef __PEOPLEDETECTOR_H__
00007 #define __PEOPLEDETECTOR_H__
00008
00009 #ifdef __LINUX__
00010
00011
00012 #else
00013 #include "cob_vision/cob_vision_ipa_utils/common/include/cob_vision_ipa_utils/MathUtils.h"
00014 #include "cob_vision/cob_sensor_fusion/common/include/cob_sensor_fusion/ColoredPointCloud.h"
00015 #endif
00016 #include <fstream>
00017 #include <set>
00018 #include <opencv2/opencv.hpp>
00019
00020 namespace ipa_PeopleDetector {
00021
00024 class PeopleDetector
00025 {
00026 public:
00027
00029 PeopleDetector(void);
00030 ~PeopleDetector(void);
00031
00036 virtual unsigned long Init(std::string directory);
00037
00043 virtual unsigned long DetectColorFaces(cv::Mat& img, std::vector<cv::Rect>& faceCoordinates);
00044
00051 virtual unsigned long DetectRangeFace(cv::Mat& img, std::vector<cv::Rect>& rangeFaceCoordinates, bool fillUnassignedDepthValues=false);
00052
00062 virtual unsigned long DetectFaces(cv::Mat& img, cv::Mat& rangeImg, std::vector<cv::Rect>& colorFaceCoordinates, std::vector<cv::Rect>& rangeFaceCoordinates, std::set<size_t>& colorToRangeFaceDependency, bool fillUnassignedDepthValues=false);
00063
00072 virtual unsigned long AddFace(cv::Mat& img, cv::Rect& face, std::string id, std::vector<cv::Mat>& images, std::vector<std::string>& ids);
00073
00080 virtual unsigned long ConvertAndResize(cv::Mat& img, cv::Mat& resized, cv::Rect& face);
00081
00085 virtual cv::Mat preprocessImage(cv::Mat& input_image);
00086
00095 virtual unsigned long PCA(int* nEigens, std::vector<cv::Mat>& eigenVectors, cv::Mat& eigenValMat, cv::Mat& avgImage, std::vector<cv::Mat>& images, cv::Mat& projectedTrainFaceMat);
00096
00111 #if CV_MAJOR_VERSION == 2
00112 virtual unsigned long RecognizeFace(cv::Mat& colorImage, std::vector<cv::Rect>& colorFaces, int* nEigens, std::vector<cv::Mat>& eigenVectArr, cv::Mat& avgImage, cv::Mat& projectedTrainFaceMat,
00113 std::vector<int>& index, int *threshold, int *threshold_FS, cv::Mat& eigenValMat, cv::SVM* personClassifier = 0);
00114 #else
00115
00116 virtual unsigned long RecognizeFace(cv::Mat& colorImage, std::vector<cv::Rect>& colorFaces, int* nEigens, std::vector<cv::Mat>& eigenVectArr, cv::Mat& avgImage, cv::Mat& projectedTrainFaceMat,
00117 std::vector<int>& index, int *threshold, int *threshold_FS, cv::Mat& eigenValMat, cv::ml::SVM* personClassifier = 0);
00118 #endif
00119
00130 #if CV_MAJOR_VERSION == 2
00131 virtual unsigned long ClassifyFace(float *projectedTestFace, int *nearest, int *nEigens, cv::Mat& projectedTrainFaceMat, int *threshold, cv::Mat& eigenValMat, cv::SVM* personClassifier = 0);
00132 #else
00133
00134 virtual unsigned long ClassifyFace(float *projectedTestFace, int *nearest, int *nEigens, cv::Mat& projectedTrainFaceMat, int *threshold, cv::Mat& eigenValMat, cv::ml::SVM* personClassifier = 0);
00135 #endif
00136
00146 #if CV_MAJOR_VERSION == 2
00147 virtual unsigned long CalculateFaceClasses(cv::Mat& projectedTrainFaceMat, std::vector<std::string>& id, int *nEigens, cv::Mat& faceClassAvgProjections, std::vector<std::string>& idUnique, cv::SVM* personClassifier = 0);
00148 #else
00149
00150 virtual unsigned long CalculateFaceClasses(cv::Mat& projectedTrainFaceMat, std::vector<std::string>& id, int *nEigens, cv::Mat& faceClassAvgProjections, std::vector<std::string>& idUnique, cv::ml::SVM* personClassifier = 0);
00151 #endif
00152
00153 double m_faces_increase_search_scale;
00154 int m_faces_drop_groups;
00155 int m_faces_min_search_scale_x;
00156 int m_faces_min_search_scale_y;
00157
00158 double m_range_increase_search_scale;
00159 int m_range_drop_groups;
00160 int m_range_min_search_scale_x;
00161 int m_range_min_search_scale_y;
00162
00163 private:
00167 unsigned long InterpolateUnassignedPixels(cv::Mat& img);
00168
00169 CvMemStorage* m_storage;
00170 CvHaarClassifierCascade* m_face_cascade;
00171 CvHaarClassifierCascade* m_range_cascade;
00172 };
00173
00174 }
00175
00176 #endif // __PEOPLEDETECTOR_H__