Commit 302a5adc authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

converted Haar cascades to the new format; now they are handled with C++ code.

parent fdf1996e
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -474,16 +474,18 @@ HaarEvaluator::~HaarEvaluator() ...@@ -474,16 +474,18 @@ HaarEvaluator::~HaarEvaluator()
bool HaarEvaluator::read(const FileNode& node) bool HaarEvaluator::read(const FileNode& node)
{ {
features->resize(node.size()); size_t i, n = node.size();
featuresPtr = &(*features)[0]; CV_Assert(n > 0);
FileNodeIterator it = node.begin(), it_end = node.end(); features.resize(n);
featuresPtr = &features[0];
FileNodeIterator it = node.begin();
hasTiltedFeatures = false; hasTiltedFeatures = false;
for(int i = 0; it != it_end; ++it, i++) for(i = 0; i < n; i++, ++it)
{ {
if(!featuresPtr[i].read(*it)) if(!features[i].read(*it))
return false; return false;
if( featuresPtr[i].tilted ) if( features[i].tilted )
hasTiltedFeatures = true; hasTiltedFeatures = true;
} }
return true; return true;
...@@ -494,7 +496,6 @@ Ptr<FeatureEvaluator> HaarEvaluator::clone() const ...@@ -494,7 +496,6 @@ Ptr<FeatureEvaluator> HaarEvaluator::clone() const
Ptr<HaarEvaluator> ret = makePtr<HaarEvaluator>(); Ptr<HaarEvaluator> ret = makePtr<HaarEvaluator>();
ret->origWinSize = origWinSize; ret->origWinSize = origWinSize;
ret->features = features; ret->features = features;
ret->featuresPtr = &(*ret->features)[0];
ret->hasTiltedFeatures = hasTiltedFeatures; ret->hasTiltedFeatures = hasTiltedFeatures;
ret->sum0 = sum0, ret->sqsum0 = sqsum0, ret->tilted0 = tilted0; ret->sum0 = sum0, ret->sqsum0 = sqsum0, ret->tilted0 = tilted0;
ret->sum = sum, ret->sqsum = sqsum, ret->tilted = tilted; ret->sum = sum, ret->sqsum = sqsum, ret->tilted = tilted;
...@@ -540,10 +541,10 @@ bool HaarEvaluator::setImage( const Mat &image, Size _origWinSize ) ...@@ -540,10 +541,10 @@ bool HaarEvaluator::setImage( const Mat &image, Size _origWinSize )
CV_SUM_PTRS( p[0], p[1], p[2], p[3], sdata, normrect, sumStep ); CV_SUM_PTRS( p[0], p[1], p[2], p[3], sdata, normrect, sumStep );
CV_SUM_PTRS( pq[0], pq[1], pq[2], pq[3], sqdata, normrect, sqsumStep ); CV_SUM_PTRS( pq[0], pq[1], pq[2], pq[3], sqdata, normrect, sqsumStep );
size_t fi, nfeatures = features->size(); size_t fi, nfeatures = features.size();
for( fi = 0; fi < nfeatures; fi++ ) for( fi = 0; fi < nfeatures; fi++ )
featuresPtr[fi].updatePtrs( !featuresPtr[fi].tilted ? sum : tilted ); optfeaturesPtr[fi].updatePtrs( !featuresPtr[fi].tilted ? sum : tilted );
return true; return true;
} }
......
...@@ -186,6 +186,32 @@ protected: ...@@ -186,6 +186,32 @@ protected:
#define CALC_SUM(rect,offset) CALC_SUM_((rect)[0], (rect)[1], (rect)[2], (rect)[3], offset) #define CALC_SUM(rect,offset) CALC_SUM_((rect)[0], (rect)[1], (rect)[2], (rect)[3], offset)
#define CV_SUM_OFS( p0, p1, p2, p3, sum, rect, step ) \
/* (x, y) */ \
(p0) = sum + (rect).x + (step) * (rect).y, \
/* (x + w, y) */ \
(p1) = sum + (rect).x + (rect).width + (step) * (rect).y, \
/* (x + w, y) */ \
(p2) = sum + (rect).x + (step) * ((rect).y + (rect).height), \
/* (x + w, y + h) */ \
(p3) = sum + (rect).x + (rect).width + (step) * ((rect).y + (rect).height)
#define CV_TILTED_OFS( p0, p1, p2, p3, tilted, rect, step ) \
/* (x, y) */ \
(p0) = tilted + (rect).x + (step) * (rect).y, \
/* (x - h, y + h) */ \
(p1) = tilted + (rect).x - (rect).height + (step) * ((rect).y + (rect).height), \
/* (x + w, y + w) */ \
(p2) = tilted + (rect).x + (rect).width + (step) * ((rect).y + (rect).width), \
/* (x + w - h, y + w + h) */ \
(p3) = tilted + (rect).x + (rect).width - (rect).height \
+ (step) * ((rect).y + (rect).width + (rect).height)
#define CALC_SUM_(p0, p1, p2, p3, offset) \
((p0)[offset] - (p1)[offset] - (p2)[offset] + (p3)[offset])
#define CALC_SUM(rect,offset) CALC_SUM_((rect)[0], (rect)[1], (rect)[2], (rect)[3], offset)
//---------------------------------------------- HaarEvaluator --------------------------------------- //---------------------------------------------- HaarEvaluator ---------------------------------------
class HaarEvaluator : public FeatureEvaluator class HaarEvaluator : public FeatureEvaluator
...@@ -195,8 +221,6 @@ public: ...@@ -195,8 +221,6 @@ public:
{ {
Feature(); Feature();
float calc( int offset ) const;
void updatePtrs( const Mat& sum );
bool read( const FileNode& node ); bool read( const FileNode& node );
bool tilted; bool tilted;
...@@ -208,8 +232,19 @@ public: ...@@ -208,8 +232,19 @@ public:
Rect r; Rect r;
float weight; float weight;
} rect[RECT_NUM]; } rect[RECT_NUM];
};
struct OptFeature
{
OptFeature();
const int* p[RECT_NUM][4]; enum { RECT_NUM = Feature::RECT_NUM };
float calc( const int* pwin ) const;
void setPtrs( const Mat& sum, const Feature& f );
int ofs[RECT_NUM][4];
float weight[RECT_NUM];
}; };
HaarEvaluator(); HaarEvaluator();
...@@ -223,23 +258,26 @@ public: ...@@ -223,23 +258,26 @@ public:
virtual bool setWindow(Point pt); virtual bool setWindow(Point pt);
double operator()(int featureIdx) const double operator()(int featureIdx) const
{ return featuresPtr[featureIdx].calc(offset) * varianceNormFactor; } { return optfeaturesPtr[featureIdx].calc(pwin) * varianceNormFactor; }
virtual double calcOrd(int featureIdx) const virtual double calcOrd(int featureIdx) const
{ return (*this)(featureIdx); } { return (*this)(featureIdx); }
protected: protected:
Size origWinSize; Size origWinSize;
Ptr<std::vector<Feature> > features; std::vector<Feature> features;
Feature* featuresPtr; // optimization std::vector<OptFeature> optfeatures;
OptFeature* optfeaturesPtr; // optimization
bool hasTiltedFeatures; bool hasTiltedFeatures;
Mat sum0, sqsum0, tilted0; Mat sum0, sqsum0, tilted0;
Mat sum, sqsum, tilted; Mat sum, sqsum, tilted;
Rect normrect; Rect normrect;
const int *p[4]; int p[4];
const double *pq[4]; int pq[4];
const int* pwin;
const double* pqwin;
int offset; int offset;
double varianceNormFactor; double varianceNormFactor;
}; };
...@@ -249,12 +287,18 @@ inline HaarEvaluator::Feature :: Feature() ...@@ -249,12 +287,18 @@ inline HaarEvaluator::Feature :: Feature()
tilted = false; tilted = false;
rect[0].r = rect[1].r = rect[2].r = Rect(); rect[0].r = rect[1].r = rect[2].r = Rect();
rect[0].weight = rect[1].weight = rect[2].weight = 0; rect[0].weight = rect[1].weight = rect[2].weight = 0;
p[0][0] = p[0][1] = p[0][2] = p[0][3] =
p[1][0] = p[1][1] = p[1][2] = p[1][3] =
p[2][0] = p[2][1] = p[2][2] = p[2][3] = 0;
} }
inline float HaarEvaluator::Feature :: calc( int _offset ) const inline HaarEvaluator::OptFeature :: OptFeature()
{
weight[0] = weight[1] = weight[2] = 0.f;
ofs[0][0] = ofs[0][1] = ofs[0][2] = ofs[0][3] =
ofs[1][0] = ofs[1][1] = ofs[1][2] = ofs[1][3] =
ofs[2][0] = ofs[2][1] = ofs[2][2] = ofs[2][3] = 0;
}
/*inline float HaarEvaluator::Feature :: calc( int _offset ) const
{ {
float ret = rect[0].weight * CALC_SUM(p[0], _offset) + rect[1].weight * CALC_SUM(p[1], _offset); float ret = rect[0].weight * CALC_SUM(p[0], _offset) + rect[1].weight * CALC_SUM(p[1], _offset);
...@@ -262,12 +306,13 @@ inline float HaarEvaluator::Feature :: calc( int _offset ) const ...@@ -262,12 +306,13 @@ inline float HaarEvaluator::Feature :: calc( int _offset ) const
ret += rect[2].weight * CALC_SUM(p[2], _offset); ret += rect[2].weight * CALC_SUM(p[2], _offset);
return ret; return ret;
} }*/
inline void HaarEvaluator::Feature :: updatePtrs( const Mat& _sum ) inline void HaarEvaluator::OptFeature :: setPtrs( const Mat& _sum, const Feature& _f )
{ {
const int* ptr = (const int*)_sum.data; const int* ptr = (const int*)_sum.data;
size_t step = _sum.step/sizeof(ptr[0]); size_t step = _sum.step/sizeof(ptr[0]);
size_t tiltedofs =
if (tilted) if (tilted)
{ {
CV_TILTED_PTRS( p[0][0], p[0][1], p[0][2], p[0][3], ptr, rect[0].r, step ); CV_TILTED_PTRS( p[0][0], p[0][1], p[0][2], p[0][3], ptr, rect[0].r, step );
......
...@@ -203,7 +203,8 @@ static bool convert(const String& oldcascade, const String& newcascade) ...@@ -203,7 +203,8 @@ static bool convert(const String& oldcascade, const String& newcascade)
for( i = 0; i < nstages; i++ ) for( i = 0; i < nstages; i++ )
maxWeakCount = std::max(maxWeakCount, stages[i].weaks.size()); maxWeakCount = std::max(maxWeakCount, stages[i].weaks.size());
newfs << "stageType" << "BOOST" newfs << "cascade" << "{:opencv-cascade-classifier"
<< "stageType" << "BOOST"
<< "featureType" << "HAAR" << "featureType" << "HAAR"
<< "height" << cascadesize.width << "height" << cascadesize.width
<< "width" << cascadesize.height << "width" << cascadesize.height
...@@ -250,8 +251,8 @@ static bool convert(const String& oldcascade, const String& newcascade) ...@@ -250,8 +251,8 @@ static bool convert(const String& oldcascade, const String& newcascade)
{ {
if( j >= 2 && fabs(f.rect[j].weight) < FLT_EPSILON ) if( j >= 2 && fabs(f.rect[j].weight) < FLT_EPSILON )
break; break;
newfs << f.rect[j].r.x << f.rect[j].r.y << newfs << "[" << f.rect[j].r.x << f.rect[j].r.y <<
f.rect[j].r.width << f.rect[j].r.height << f.rect[j].weight; f.rect[j].r.width << f.rect[j].r.height << f.rect[j].weight << "]";
} }
newfs << "]"; newfs << "]";
if( f.tilted ) if( f.tilted )
...@@ -259,7 +260,7 @@ static bool convert(const String& oldcascade, const String& newcascade) ...@@ -259,7 +260,7 @@ static bool convert(const String& oldcascade, const String& newcascade)
newfs << "}"; newfs << "}";
} }
newfs << "]"; newfs << "]" << "}";
return true; return true;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -98,6 +98,8 @@ int main( int argc, const char** argv ) ...@@ -98,6 +98,8 @@ int main( int argc, const char** argv )
return -1; return -1;
} }
cout << "old cascade: " << (cascade.isOldFormatCascade() ? "TRUE" : "FALSE") << endl;
if( inputName.empty() || (isdigit(inputName.c_str()[0]) && inputName.c_str()[1] == '\0') ) if( inputName.empty() || (isdigit(inputName.c_str()[0]) && inputName.c_str()[1] == '\0') )
{ {
int c = inputName.empty() ? 0 : inputName.c_str()[0] - '0'; int c = inputName.empty() ? 0 : inputName.c_str()[0] - '0';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment