1#ifndef _OPENCV_HOGFEATURES_H_ 2#define _OPENCV_HOGFEATURES_H_ 3 4#include "traincascade_features.h" 5 6//#define TEST_INTHIST_BUILD 7//#define TEST_FEAT_CALC 8 9#define N_BINS 9 10#define N_CELLS 4 11 12#define HOGF_NAME "HOGFeatureParams" 13struct CvHOGFeatureParams : public CvFeatureParams 14{ 15 CvHOGFeatureParams(); 16}; 17 18class CvHOGEvaluator : public CvFeatureEvaluator 19{ 20public: 21 virtual ~CvHOGEvaluator() {} 22 virtual void init(const CvFeatureParams *_featureParams, 23 int _maxSampleCount, cv::Size _winSize ); 24 virtual void setImage(const cv::Mat& img, uchar clsLabel, int idx); 25 virtual float operator()(int varIdx, int sampleIdx) const; 26 virtual void writeFeatures( cv::FileStorage &fs, const cv::Mat& featureMap ) const; 27protected: 28 virtual void generateFeatures(); 29 virtual void integralHistogram(const cv::Mat &img, std::vector<cv::Mat> &histogram, cv::Mat &norm, int nbins) const; 30 class Feature 31 { 32 public: 33 Feature(); 34 Feature( int offset, int x, int y, int cellW, int cellH ); 35 float calc( const std::vector<cv::Mat> &_hists, const cv::Mat &_normSum, size_t y, int featComponent ) const; 36 void write( cv::FileStorage &fs ) const; 37 void write( cv::FileStorage &fs, int varIdx ) const; 38 39 cv::Rect rect[N_CELLS]; //cells 40 41 struct 42 { 43 int p0, p1, p2, p3; 44 } fastRect[N_CELLS]; 45 }; 46 std::vector<Feature> features; 47 48 cv::Mat normSum; //for nomalization calculation (L1 or L2) 49 std::vector<cv::Mat> hist; 50}; 51 52inline float CvHOGEvaluator::operator()(int varIdx, int sampleIdx) const 53{ 54 int featureIdx = varIdx / (N_BINS * N_CELLS); 55 int componentIdx = varIdx % (N_BINS * N_CELLS); 56 //return features[featureIdx].calc( hist, sampleIdx, componentIdx); 57 return features[featureIdx].calc( hist, normSum, sampleIdx, componentIdx); 58} 59 60inline float CvHOGEvaluator::Feature::calc( const std::vector<cv::Mat>& _hists, const cv::Mat& _normSum, size_t y, int featComponent ) const 61{ 62 float normFactor; 63 float res; 64 65 int binIdx = featComponent % N_BINS; 66 int cellIdx = featComponent / N_BINS; 67 68 const float *phist = _hists[binIdx].ptr<float>((int)y); 69 res = phist[fastRect[cellIdx].p0] - phist[fastRect[cellIdx].p1] - phist[fastRect[cellIdx].p2] + phist[fastRect[cellIdx].p3]; 70 71 const float *pnormSum = _normSum.ptr<float>((int)y); 72 normFactor = (float)(pnormSum[fastRect[0].p0] - pnormSum[fastRect[1].p1] - pnormSum[fastRect[2].p2] + pnormSum[fastRect[3].p3]); 73 res = (res > 0.001f) ? ( res / (normFactor + 0.001f) ) : 0.f; //for cutting negative values, which apper due to floating precision 74 75 return res; 76} 77 78#endif // _OPENCV_HOGFEATURES_H_ 79