标签:opencv源码分析 adaboost cvcreatestumpclassif
CV_BOOST_IMPL CvClassifier* cvCreateStumpClassifier( CvMat* trainData, int flags, CvMat* trainClasses, CvMat* /*typeMask*/, CvMat* missedMeasurementsMask, CvMat* compIdx, CvMat* sampleIdx, CvMat* weights, CvClassifierTrainParams* trainParams ) { CvStumpClassifier* stump = NULL; int m = 0; /* number of samples */ int n = 0; /* number of components */ uchar* data = NULL; int cstep = 0; int sstep = 0; uchar* ydata = NULL; int ystep = 0; uchar* idxdata = NULL; int idxstep = 0; int l = 0; /* number of indices */ uchar* wdata = NULL; int wstep = 0; int* idx = NULL; int i = 0; float sumw = FLT_MAX; float sumwy = FLT_MAX; float sumwyy = FLT_MAX; CV_Assert( trainData != NULL ); CV_Assert( CV_MAT_TYPE( trainData->type ) == CV_32FC1 ); CV_Assert( trainClasses != NULL ); CV_Assert( CV_MAT_TYPE( trainClasses->type ) == CV_32FC1 ); CV_Assert( missedMeasurementsMask == NULL ); CV_Assert( compIdx == NULL ); CV_Assert( weights != NULL ); CV_Assert( CV_MAT_TYPE( weights->type ) == CV_32FC1 ); CV_Assert( trainParams != NULL ); data = trainData->data.ptr; if( CV_IS_ROW_SAMPLE( flags ) ) { cstep = CV_ELEM_SIZE( trainData->type ); sstep = trainData->step; m = trainData->rows; n = trainData->cols; } else { sstep = CV_ELEM_SIZE( trainData->type ); cstep = trainData->step; m = trainData->cols; n = trainData->rows; } ydata = trainClasses->data.ptr; if( trainClasses->rows == 1 ) { assert( trainClasses->cols == m ); ystep = CV_ELEM_SIZE( trainClasses->type ); } else { assert( trainClasses->rows == m ); ystep = trainClasses->step; } wdata = weights->data.ptr; if( weights->rows == 1 ) { assert( weights->cols == m ); wstep = CV_ELEM_SIZE( weights->type ); } else { assert( weights->rows == m ); wstep = weights->step; } l = m; if( sampleIdx != NULL ) { assert( CV_MAT_TYPE( sampleIdx->type ) == CV_32FC1 ); idxdata = sampleIdx->data.ptr; if( sampleIdx->rows == 1 ) { l = sampleIdx->cols; idxstep = CV_ELEM_SIZE( sampleIdx->type ); } else { l = sampleIdx->rows; idxstep = sampleIdx->step; } assert( l <= m ); } idx = (int*) cvAlloc( l * sizeof( int ) ); stump = (CvStumpClassifier*) cvAlloc( sizeof( CvStumpClassifier) ); /* START */ memset( (void*) stump, 0, sizeof( CvStumpClassifier ) ); stump->eval = cvEvalStumpClassifier; stump->tune = NULL; stump->save = NULL; stump->release = cvReleaseStumpClassifier; stump->lerror = FLT_MAX; stump->rerror = FLT_MAX; stump->left = 0.0F; stump->right = 0.0F; /* copy indices */ if( sampleIdx != NULL ) { for( i = 0; i < l; i++ ) { idx[i] = (int) *((float*) (idxdata + i*idxstep)); } } else { for( i = 0; i < l; i++ ) { idx[i] = i; } } for( i = 0; i < n; i++ ) { CvValArray va; va.data = data + i * ((size_t) cstep); va.step = sstep; icvSortIndexedValArray_32s( idx, l, &va );//va中的l个数据进行排序,排序后的数据存储在idx中 if( findStumpThreshold_32s[(int) ((CvStumpTrainParams*) trainParams)->error] ( data + i * ((size_t) cstep), sstep, wdata, wstep, ydata, ystep, (uchar*) idx, sizeof( int ), l, &(stump->lerror), &(stump->rerror), &(stump->threshold), &(stump->left), &(stump->right), &sumw, &sumwy, &sumwyy ) ) //寻找树桩分类器的阈值 { stump->compidx = i; } } /* for each component */ /* END */ cvFree( &idx ); if( ((CvStumpTrainParams*) trainParams)->type == CV_CLASSIFICATION_CLASS ) { stump->left = 2.0F * (stump->left >= 0.5F) - 1.0F; stump->right = 2.0F * (stump->right >= 0.5F) - 1.0F; } return (CvClassifier*) stump; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:opencv源码分析 adaboost cvcreatestumpclassif
原文地址:http://blog.csdn.net/ding977921830/article/details/46814077