1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef _OPENCV_FEATURES_H_ 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define _OPENCV_FEATURES_H_ 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "imagestorage.h" 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <stdio.h> 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define FEATURES "features" 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_SUM_OFFSETS( p0, p1, p2, p3, rect, step ) \ 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* (x, y) */ \ 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (p0) = (rect).x + (step) * (rect).y; \ 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* (x + w, y) */ \ 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (p1) = (rect).x + (rect).width + (step) * (rect).y; \ 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* (x + w, y) */ \ 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (p2) = (rect).x + (step) * ((rect).y + (rect).height); \ 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* (x + w, y + h) */ \ 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (p3) = (rect).x + (rect).width + (step) * ((rect).y + (rect).height); 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_TILTED_OFFSETS( p0, p1, p2, p3, rect, step ) \ 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* (x, y) */ \ 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (p0) = (rect).x + (step) * (rect).y; \ 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* (x - h, y + h) */ \ 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (p1) = (rect).x - (rect).height + (step) * ((rect).y + (rect).height);\ 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* (x + w, y + w) */ \ 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (p2) = (rect).x + (rect).width + (step) * ((rect).y + (rect).width); \ 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* (x + w - h, y + w + h) */ \ 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (p3) = (rect).x + (rect).width - (rect).height \ 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler + (step) * ((rect).y + (rect).width + (rect).height); 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfloat calcNormFactor( const cv::Mat& sum, const cv::Mat& sqSum ); 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<class Feature> 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid _writeFeatures( const std::vector<Feature> features, cv::FileStorage &fs, const cv::Mat& featureMap ) 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fs << FEATURES << "["; 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const cv::Mat_<int>& featureMap_ = (const cv::Mat_<int>&)featureMap; 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for ( int fi = 0; fi < featureMap.cols; fi++ ) 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ( featureMap_(0, fi) >= 0 ) 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fs << "{"; 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler features[fi].write( fs ); 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fs << "}"; 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler fs << "]"; 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CvParams 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic: 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvParams(); 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual ~CvParams() {} 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // from|to file 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void write( cv::FileStorage &fs ) const = 0; 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual bool read( const cv::FileNode &node ) = 0; 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // from|to screen 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void printDefaults() const; 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void printAttrs() const; 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual bool scanAttr( const std::string prmName, const std::string val ); 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler std::string name; 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CvFeatureParams : public CvParams 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic: 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler enum { HAAR = 0, LBP = 1, HOG = 2 }; 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvFeatureParams(); 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void init( const CvFeatureParams& fp ); 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void write( cv::FileStorage &fs ) const; 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual bool read( const cv::FileNode &node ); 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler static cv::Ptr<CvFeatureParams> create( int featureType ); 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int maxCatCount; // 0 in case of numerical features 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int featSize; // 1 in case of simple features (HAAR, LBP) and N_BINS(9)*N_CELLS(4) in case of Dalal's HOG features 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CvFeatureEvaluator 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic: 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual ~CvFeatureEvaluator() {} 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void init(const CvFeatureParams *_featureParams, 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int _maxSampleCount, cv::Size _winSize ); 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void setImage(const cv::Mat& img, uchar clsLabel, int idx); 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void writeFeatures( cv::FileStorage &fs, const cv::Mat& featureMap ) const = 0; 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual float operator()(int featureIdx, int sampleIdx) const = 0; 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler static cv::Ptr<CvFeatureEvaluator> create(int type); 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int getNumFeatures() const { return numFeatures; } 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int getMaxCatCount() const { return featureParams->maxCatCount; } 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int getFeatureSize() const { return featureParams->featSize; } 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const cv::Mat& getCls() const { return cls; } 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler float getCls(int si) const { return cls.at<float>(si, 0); } 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprotected: 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void generateFeatures() = 0; 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int npos, nneg; 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int numFeatures; 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cv::Size winSize; 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvFeatureParams *featureParams; 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cv::Mat cls; 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 102