CvIntHaarClassifier* icvLoadCARTStageHaarClassifier(const char* filename, int step) { CvIntHaarClassifier* ptr = NULL; CV_FUNCNAME("icvLoadCARTStageHaarClassifier"); __BEGIN__; FILE* file; file = fopen(filename, "r"); if (file) { CV_CALL(ptr = icvLoadCARTStageHaarClassifierF(file, step)); fclose(file); } __END__; return ptr; }
CvIntHaarClassifier* icvLoadTreeCascadeClassifier( const char* filename, int step, int* splits ) { CvTreeCascadeClassifier* ptr = NULL; CvTreeCascadeNode** nodes = NULL; CV_FUNCNAME( "icvLoadTreeCascadeClassifier" ); __BEGIN__; size_t data_size; CvStageHaarClassifier* stage; char stage_name[PATH_MAX]; char* suffix; int i, num; FILE* f; int result, parent=0, next=0; int stub; if( !splits ) splits = &stub; *splits = 0; data_size = sizeof( *ptr ); CV_CALL( ptr = (CvTreeCascadeClassifier*) cvAlloc( data_size ) ); memset( ptr, 0, data_size ); ptr->eval = icvEvalTreeCascadeClassifier; ptr->release = icvReleaseTreeCascadeClassifier; sprintf( stage_name, "%s/", filename ); suffix = stage_name + strlen( stage_name ); for( i = 0; ; i++ ) { sprintf( suffix, "%d/%s", i, CV_STAGE_CART_FILE_NAME ); f = fopen( stage_name, "r" ); if( !f ) break; fclose( f ); } num = i; if( num < 1 ) EXIT; data_size = sizeof( *nodes ) * num; CV_CALL( nodes = (CvTreeCascadeNode**) cvAlloc( data_size ) ); for( i = 0; i < num; i++ ) { sprintf( suffix, "%d/%s", i, CV_STAGE_CART_FILE_NAME ); f = fopen( stage_name, "r" ); CV_CALL( stage = (CvStageHaarClassifier*) icvLoadCARTStageHaarClassifierF( f, step ) ); result = ( f && stage ) ? fscanf( f, "%d%d", &parent, &next ) : 0; if( f ) fclose( f ); if( result != 2 ) { num = i; break; } printf( "Stage %d loaded\n", i ); if( parent >= i || (next != -1 && next != i + 1) ) CV_ERROR( CV_StsError, "Invalid tree links" ); CV_CALL( nodes[i] = icvCreateTreeCascadeNode() ); nodes[i]->stage = stage; nodes[i]->idx = i; nodes[i]->parent = (parent != -1 ) ? nodes[parent] : NULL; nodes[i]->next = ( next != -1 ) ? nodes[i] : NULL; nodes[i]->child = NULL; } for( i = 0; i < num; i++ ) { if( nodes[i]->next ) { (*splits)++; nodes[i]->next = nodes[i+1]; } if( nodes[i]->parent && nodes[i]->parent->child == NULL ) { nodes[i]->parent->child = nodes[i]; } } ptr->root = nodes[0]; ptr->next_idx = num; __END__; cvFree( &nodes ); return (CvIntHaarClassifier*) ptr; }