inline void LBPEvaluator::Feature :: updatePtrs( const Mat& sum ) { const int* ptr = (const int*)sum.data; size_t step = sum.step/sizeof(ptr[0]); Rect tr = rect; CV_SUM_PTRS( p[0], p[1], p[4], p[5], ptr, tr, step ); tr.x += 2*rect.width; CV_SUM_PTRS( p[2], p[3], p[6], p[7], ptr, tr, step ); tr.y += 2*rect.height; CV_SUM_PTRS( p[10], p[11], p[14], p[15], ptr, tr, step ); tr.x -= 2*rect.width; CV_SUM_PTRS( p[8], p[9], p[12], p[13], ptr, tr, step ); }
inline void HOGEvaluator::Feature :: updatePtrs( const vector<Mat> &_hist, const Mat &_normSum ) { int binIdx = featComponent % BIN_NUM; int cellIdx = featComponent / BIN_NUM; Rect normRect = Rect( rect[0].x, rect[0].y, 2*rect[0].width, 2*rect[0].height ); const float* featBuf = (const float*)_hist[binIdx].data; size_t featStep = _hist[0].step / sizeof(featBuf[0]); const float* normBuf = (const float*)_normSum.data; size_t normStep = _normSum.step / sizeof(normBuf[0]); CV_SUM_PTRS( pF[0], pF[1], pF[2], pF[3], featBuf, rect[cellIdx], featStep ); CV_SUM_PTRS( pN[0], pN[1], pN[2], pN[3], normBuf, normRect, normStep ); }
inline void HaarEvaluator::Feature :: updatePtrs( const Mat& sum ) { const int* ptr = (const int*)sum.data; size_t step = sum.step/sizeof(ptr[0]); 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[1][0], p[1][1], p[1][2], p[1][3], ptr, rect[1].r, step ); if (rect[2].weight) CV_TILTED_PTRS( p[2][0], p[2][1], p[2][2], p[2][3], ptr, rect[2].r, step ); } else { CV_SUM_PTRS( p[0][0], p[0][1], p[0][2], p[0][3], ptr, rect[0].r, step ); CV_SUM_PTRS( p[1][0], p[1][1], p[1][2], p[1][3], ptr, rect[1].r, step ); if (rect[2].weight) CV_SUM_PTRS( p[2][0], p[2][1], p[2][2], p[2][3], ptr, rect[2].r, step ); } }
bool HaarEvaluator::setImage( const Mat &image, Size _origWinSize ) { int rn = image.rows+1, cn = image.cols+1; origWinSize = _origWinSize; normrect = Rect(1, 1, origWinSize.width-2, origWinSize.height-2); if (image.cols < origWinSize.width || image.rows < origWinSize.height) return false; if( sum0.rows < rn || sum0.cols < cn ) { sum0.create(rn, cn, CV_32S); sqsum0.create(rn, cn, CV_64F); if (hasTiltedFeatures) tilted0.create( rn, cn, CV_32S); } sum = Mat(rn, cn, CV_32S, sum0.data); sqsum = Mat(rn, cn, CV_64F, sqsum0.data); if( hasTiltedFeatures ) { tilted = Mat(rn, cn, CV_32S, tilted0.data); integral(image, sum, sqsum, tilted); } else integral(image, sum, sqsum); const int* sdata = (const int*)sum.data; const double* sqdata = (const double*)sqsum.data; size_t sumStep = sum.step/sizeof(sdata[0]); size_t sqsumStep = sqsum.step/sizeof(sqdata[0]); 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 ); size_t fi, nfeatures = features->size(); for( fi = 0; fi < nfeatures; fi++ ) featuresPtr[fi].updatePtrs( !featuresPtr[fi].tilted ? sum : tilted ); return true; }