mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
817 lines
22 KiB
817 lines
22 KiB
#include "precomp.hpp" |
|
#include <stdio.h> |
|
#include "string.h" |
|
#include "_lsvmparser.h" |
|
#include "_lsvm_error.h" |
|
|
|
namespace |
|
{ |
|
int isMODEL (char *str){ |
|
char stag [] = "<Model>"; |
|
char etag [] = "</Model>"; |
|
if(strcmp(stag, str) == 0)return MODEL; |
|
if(strcmp(etag, str) == 0)return EMODEL; |
|
return 0; |
|
} |
|
int isP (char *str){ |
|
char stag [] = "<P>"; |
|
char etag [] = "</P>"; |
|
if(strcmp(stag, str) == 0)return P; |
|
if(strcmp(etag, str) == 0)return EP; |
|
return 0; |
|
} |
|
int isSCORE (char *str){ |
|
char stag [] = "<ScoreThreshold>"; |
|
char etag [] = "</ScoreThreshold>"; |
|
if(strcmp(stag, str) == 0)return SCORE; |
|
if(strcmp(etag, str) == 0)return ESCORE; |
|
return 0; |
|
} |
|
int isCOMP (char *str){ |
|
char stag [] = "<Component>"; |
|
char etag [] = "</Component>"; |
|
if(strcmp(stag, str) == 0)return COMP; |
|
if(strcmp(etag, str) == 0)return ECOMP; |
|
return 0; |
|
} |
|
int isRFILTER (char *str){ |
|
char stag [] = "<RootFilter>"; |
|
char etag [] = "</RootFilter>"; |
|
if(strcmp(stag, str) == 0)return RFILTER; |
|
if(strcmp(etag, str) == 0)return ERFILTER; |
|
return 0; |
|
} |
|
int isPFILTERs (char *str){ |
|
char stag [] = "<PartFilters>"; |
|
char etag [] = "</PartFilters>"; |
|
if(strcmp(stag, str) == 0)return PFILTERs; |
|
if(strcmp(etag, str) == 0)return EPFILTERs; |
|
return 0; |
|
} |
|
int isPFILTER (char *str){ |
|
char stag [] = "<PartFilter>"; |
|
char etag [] = "</PartFilter>"; |
|
if(strcmp(stag, str) == 0)return PFILTER; |
|
if(strcmp(etag, str) == 0)return EPFILTER; |
|
return 0; |
|
} |
|
int isSIZEX (char *str){ |
|
char stag [] = "<sizeX>"; |
|
char etag [] = "</sizeX>"; |
|
if(strcmp(stag, str) == 0)return SIZEX; |
|
if(strcmp(etag, str) == 0)return ESIZEX; |
|
return 0; |
|
} |
|
int isSIZEY (char *str){ |
|
char stag [] = "<sizeY>"; |
|
char etag [] = "</sizeY>"; |
|
if(strcmp(stag, str) == 0)return SIZEY; |
|
if(strcmp(etag, str) == 0)return ESIZEY; |
|
return 0; |
|
} |
|
int isWEIGHTS (char *str){ |
|
char stag [] = "<Weights>"; |
|
char etag [] = "</Weights>"; |
|
if(strcmp(stag, str) == 0)return WEIGHTS; |
|
if(strcmp(etag, str) == 0)return EWEIGHTS; |
|
return 0; |
|
} |
|
int isV (char *str){ |
|
char stag [] = "<V>"; |
|
char etag [] = "</V>"; |
|
if(strcmp(stag, str) == 0)return TAGV; |
|
if(strcmp(etag, str) == 0)return ETAGV; |
|
return 0; |
|
} |
|
int isVx (char *str){ |
|
char stag [] = "<Vx>"; |
|
char etag [] = "</Vx>"; |
|
if(strcmp(stag, str) == 0)return Vx; |
|
if(strcmp(etag, str) == 0)return EVx; |
|
return 0; |
|
} |
|
int isVy (char *str){ |
|
char stag [] = "<Vy>"; |
|
char etag [] = "</Vy>"; |
|
if(strcmp(stag, str) == 0)return Vy; |
|
if(strcmp(etag, str) == 0)return EVy; |
|
return 0; |
|
} |
|
int isD (char *str){ |
|
char stag [] = "<Penalty>"; |
|
char etag [] = "</Penalty>"; |
|
if(strcmp(stag, str) == 0)return TAGD; |
|
if(strcmp(etag, str) == 0)return ETAGD; |
|
return 0; |
|
} |
|
int isDx (char *str){ |
|
char stag [] = "<dx>"; |
|
char etag [] = "</dx>"; |
|
if(strcmp(stag, str) == 0)return Dx; |
|
if(strcmp(etag, str) == 0)return EDx; |
|
return 0; |
|
} |
|
int isDy (char *str){ |
|
char stag [] = "<dy>"; |
|
char etag [] = "</dy>"; |
|
if(strcmp(stag, str) == 0)return Dy; |
|
if(strcmp(etag, str) == 0)return EDy; |
|
return 0; |
|
} |
|
int isDxx (char *str){ |
|
char stag [] = "<dxx>"; |
|
char etag [] = "</dxx>"; |
|
if(strcmp(stag, str) == 0)return Dxx; |
|
if(strcmp(etag, str) == 0)return EDxx; |
|
return 0; |
|
} |
|
int isDyy (char *str){ |
|
char stag [] = "<dyy>"; |
|
char etag [] = "</dyy>"; |
|
if(strcmp(stag, str) == 0)return Dyy; |
|
if(strcmp(etag, str) == 0)return EDyy; |
|
return 0; |
|
} |
|
int isB (char *str){ |
|
char stag [] = "<LinearTerm>"; |
|
char etag [] = "</LinearTerm>"; |
|
if(strcmp(stag, str) == 0)return BTAG; |
|
if(strcmp(etag, str) == 0)return EBTAG; |
|
return 0; |
|
} |
|
|
|
int getTeg(char *str){ |
|
int sum = 0; |
|
sum = isMODEL (str)+ |
|
isP (str)+ |
|
isSCORE (str)+ |
|
isCOMP (str)+ |
|
isRFILTER (str)+ |
|
isPFILTERs (str)+ |
|
isPFILTER (str)+ |
|
isSIZEX (str)+ |
|
isSIZEY (str)+ |
|
isWEIGHTS (str)+ |
|
isV (str)+ |
|
isVx (str)+ |
|
isVy (str)+ |
|
isD (str)+ |
|
isDx (str)+ |
|
isDy (str)+ |
|
isDxx (str)+ |
|
isDyy (str)+ |
|
isB (str); |
|
|
|
return sum; |
|
} |
|
|
|
void addFilter(CvLSVMFilterObject *** model, int *last, int *max){ |
|
CvLSVMFilterObject ** nmodel; |
|
int i; |
|
(*last) ++; |
|
if((*last) >= (*max)){ |
|
(*max) += 10; |
|
nmodel = (CvLSVMFilterObject **)malloc(sizeof(CvLSVMFilterObject *) * (*max)); |
|
for(i = 0; i < *last; i++){ |
|
nmodel[i] = (* model)[i]; |
|
} |
|
free(* model); |
|
(*model) = nmodel; |
|
} |
|
(*model) [(*last)] = (CvLSVMFilterObject *)malloc(sizeof(CvLSVMFilterObject)); |
|
} |
|
|
|
void parserRFilter (FILE * xmlf, int p, CvLSVMFilterObject * model, float *b){ |
|
int st = 0; |
|
int sizeX=0, sizeY=0; |
|
int tag; |
|
int tagVal; |
|
char ch; |
|
int i,j,ii; |
|
char buf[1024]; |
|
char tagBuf[1024]; |
|
double *data; |
|
//printf("<RootFilter>\n"); |
|
|
|
model->V.x = 0; |
|
model->V.y = 0; |
|
model->V.l = 0; |
|
model->fineFunction[0] = 0.0; |
|
model->fineFunction[1] = 0.0; |
|
model->fineFunction[2] = 0.0; |
|
model->fineFunction[3] = 0.0; |
|
|
|
i = 0; |
|
j = 0; |
|
st = 0; |
|
tag = 0; |
|
while(!feof(xmlf)){ |
|
ch = (char)fgetc( xmlf ); |
|
if(ch == '<'){ |
|
tag = 1; |
|
j = 1; |
|
tagBuf[j - 1] = ch; |
|
}else { |
|
if(ch == '>'){ |
|
tagBuf[j ] = ch; |
|
tagBuf[j + 1] = '\0'; |
|
|
|
tagVal = getTeg(tagBuf); |
|
|
|
if(tagVal == ERFILTER){ |
|
//printf("</RootFilter>\n"); |
|
return; |
|
} |
|
if(tagVal == SIZEX){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == ESIZEX){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
sizeX = atoi(buf); |
|
model->sizeX = sizeX; |
|
//printf("<sizeX>%d</sizeX>\n", sizeX); |
|
} |
|
if(tagVal == SIZEY){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == ESIZEY){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
sizeY = atoi(buf); |
|
model->sizeY = sizeY; |
|
//printf("<sizeY>%d</sizeY>\n", sizeY); |
|
} |
|
if(tagVal == WEIGHTS){ |
|
data = (double *)malloc( sizeof(double) * p * sizeX * sizeY); |
|
size_t elements_read = fread(data, sizeof(double), p * sizeX * sizeY, xmlf); |
|
CV_Assert(elements_read == (size_t)(p * sizeX * sizeY)); |
|
model->H = (float *)malloc(sizeof(float)* p * sizeX * sizeY); |
|
for(ii = 0; ii < p * sizeX * sizeY; ii++){ |
|
model->H[ii] = (float)data[ii]; |
|
} |
|
free(data); |
|
} |
|
if(tagVal == EWEIGHTS){ |
|
//printf("WEIGHTS OK\n"); |
|
} |
|
if(tagVal == BTAG){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == EBTAG){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
*b =(float) atof(buf); |
|
//printf("<B>%f</B>\n", *b); |
|
} |
|
|
|
tag = 0; |
|
i = 0; |
|
}else{ |
|
if((tag == 0)&& (st == 1)){ |
|
buf[i] = ch; i++; |
|
}else{ |
|
tagBuf[j] = ch; j++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
void parserV (FILE * xmlf, int /*p*/, CvLSVMFilterObject * model){ |
|
int st = 0; |
|
int tag; |
|
int tagVal; |
|
char ch; |
|
int i,j; |
|
char buf[1024]; |
|
char tagBuf[1024]; |
|
//printf(" <V>\n"); |
|
|
|
i = 0; |
|
j = 0; |
|
st = 0; |
|
tag = 0; |
|
while(!feof(xmlf)){ |
|
ch = (char)fgetc( xmlf ); |
|
if(ch == '<'){ |
|
tag = 1; |
|
j = 1; |
|
tagBuf[j - 1] = ch; |
|
}else { |
|
if(ch == '>'){ |
|
tagBuf[j ] = ch; |
|
tagBuf[j + 1] = '\0'; |
|
|
|
tagVal = getTeg(tagBuf); |
|
|
|
if(tagVal == ETAGV){ |
|
//printf(" </V>\n"); |
|
return; |
|
} |
|
if(tagVal == Vx){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == EVx){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
model->V.x = atoi(buf); |
|
//printf(" <Vx>%d</Vx>\n", model->V.x); |
|
} |
|
if(tagVal == Vy){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == EVy){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
model->V.y = atoi(buf); |
|
//printf(" <Vy>%d</Vy>\n", model->V.y); |
|
} |
|
tag = 0; |
|
i = 0; |
|
}else{ |
|
if((tag == 0)&& (st == 1)){ |
|
buf[i] = ch; i++; |
|
}else{ |
|
tagBuf[j] = ch; j++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
void parserD (FILE * xmlf, int /*p*/, CvLSVMFilterObject * model){ |
|
int st = 0; |
|
int tag; |
|
int tagVal; |
|
char ch; |
|
int i,j; |
|
char buf[1024]; |
|
char tagBuf[1024]; |
|
//printf(" <D>\n"); |
|
|
|
i = 0; |
|
j = 0; |
|
st = 0; |
|
tag = 0; |
|
while(!feof(xmlf)){ |
|
ch = (char)fgetc( xmlf ); |
|
if(ch == '<'){ |
|
tag = 1; |
|
j = 1; |
|
tagBuf[j - 1] = ch; |
|
}else { |
|
if(ch == '>'){ |
|
tagBuf[j ] = ch; |
|
tagBuf[j + 1] = '\0'; |
|
|
|
tagVal = getTeg(tagBuf); |
|
|
|
if(tagVal == ETAGD){ |
|
//printf(" </D>\n"); |
|
return; |
|
} |
|
if(tagVal == Dx){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == EDx){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
|
|
model->fineFunction[0] = (float)atof(buf); |
|
//printf(" <Dx>%f</Dx>\n", model->fineFunction[0]); |
|
} |
|
if(tagVal == Dy){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == EDy){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
|
|
model->fineFunction[1] = (float)atof(buf); |
|
//printf(" <Dy>%f</Dy>\n", model->fineFunction[1]); |
|
} |
|
if(tagVal == Dxx){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == EDxx){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
|
|
model->fineFunction[2] = (float)atof(buf); |
|
//printf(" <Dxx>%f</Dxx>\n", model->fineFunction[2]); |
|
} |
|
if(tagVal == Dyy){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == EDyy){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
|
|
model->fineFunction[3] = (float)atof(buf); |
|
//printf(" <Dyy>%f</Dyy>\n", model->fineFunction[3]); |
|
} |
|
|
|
tag = 0; |
|
i = 0; |
|
}else{ |
|
if((tag == 0)&& (st == 1)){ |
|
buf[i] = ch; i++; |
|
}else{ |
|
tagBuf[j] = ch; j++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
void parserPFilter (FILE * xmlf, int p, int /*N_path*/, CvLSVMFilterObject * model){ |
|
int st = 0; |
|
int sizeX=0, sizeY=0; |
|
int tag; |
|
int tagVal; |
|
char ch; |
|
int i,j, ii; |
|
char buf[1024]; |
|
char tagBuf[1024]; |
|
double *data; |
|
//printf("<PathFilter> (%d)\n", N_path); |
|
|
|
model->V.x = 0; |
|
model->V.y = 0; |
|
model->V.l = 0; |
|
model->fineFunction[0] = 0.0f; |
|
model->fineFunction[1] = 0.0f; |
|
model->fineFunction[2] = 0.0f; |
|
model->fineFunction[3] = 0.0f; |
|
|
|
i = 0; |
|
j = 0; |
|
st = 0; |
|
tag = 0; |
|
while(!feof(xmlf)){ |
|
ch = (char)fgetc( xmlf ); |
|
if(ch == '<'){ |
|
tag = 1; |
|
j = 1; |
|
tagBuf[j - 1] = ch; |
|
}else { |
|
if(ch == '>'){ |
|
tagBuf[j ] = ch; |
|
tagBuf[j + 1] = '\0'; |
|
|
|
tagVal = getTeg(tagBuf); |
|
|
|
if(tagVal == EPFILTER){ |
|
//printf("</PathFilter>\n"); |
|
return; |
|
} |
|
|
|
if(tagVal == TAGV){ |
|
parserV(xmlf, p, model); |
|
} |
|
if(tagVal == TAGD){ |
|
parserD(xmlf, p, model); |
|
} |
|
if(tagVal == SIZEX){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == ESIZEX){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
sizeX = atoi(buf); |
|
model->sizeX = sizeX; |
|
//printf("<sizeX>%d</sizeX>\n", sizeX); |
|
} |
|
if(tagVal == SIZEY){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == ESIZEY){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
sizeY = atoi(buf); |
|
model->sizeY = sizeY; |
|
//printf("<sizeY>%d</sizeY>\n", sizeY); |
|
} |
|
if(tagVal == WEIGHTS){ |
|
data = (double *)malloc( sizeof(double) * p * sizeX * sizeY); |
|
size_t elements_read = fread(data, sizeof(double), p * sizeX * sizeY, xmlf); |
|
CV_Assert(elements_read == (size_t)(p * sizeX * sizeY)); |
|
model->H = (float *)malloc(sizeof(float)* p * sizeX * sizeY); |
|
for(ii = 0; ii < p * sizeX * sizeY; ii++){ |
|
model->H[ii] = (float)data[ii]; |
|
} |
|
free(data); |
|
} |
|
if(tagVal == EWEIGHTS){ |
|
//printf("WEIGHTS OK\n"); |
|
} |
|
tag = 0; |
|
i = 0; |
|
}else{ |
|
if((tag == 0)&& (st == 1)){ |
|
buf[i] = ch; i++; |
|
}else{ |
|
tagBuf[j] = ch; j++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
void parserPFilterS (FILE * xmlf, int p, CvLSVMFilterObject *** model, int *last, int *max){ |
|
int st = 0; |
|
int N_path = 0; |
|
int tag; |
|
int tagVal; |
|
char ch; |
|
int /*i,*/j; |
|
//char buf[1024]; |
|
char tagBuf[1024]; |
|
//printf("<PartFilters>\n"); |
|
|
|
//i = 0; |
|
j = 0; |
|
st = 0; |
|
tag = 0; |
|
while(!feof(xmlf)){ |
|
ch = (char)fgetc( xmlf ); |
|
if(ch == '<'){ |
|
tag = 1; |
|
j = 1; |
|
tagBuf[j - 1] = ch; |
|
}else { |
|
if(ch == '>'){ |
|
tagBuf[j ] = ch; |
|
tagBuf[j + 1] = '\0'; |
|
|
|
tagVal = getTeg(tagBuf); |
|
|
|
if(tagVal == EPFILTERs){ |
|
//printf("</PartFilters>\n"); |
|
return; |
|
} |
|
if(tagVal == PFILTER){ |
|
addFilter(model, last, max); |
|
parserPFilter (xmlf, p, N_path, (*model)[*last]); |
|
N_path++; |
|
} |
|
tag = 0; |
|
//i = 0; |
|
}else{ |
|
if((tag == 0)&& (st == 1)){ |
|
//buf[i] = ch; i++; |
|
}else{ |
|
tagBuf[j] = ch; j++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
void parserComp (FILE * xmlf, int p, int *N_comp, CvLSVMFilterObject *** model, float *b, int *last, int *max){ |
|
int st = 0; |
|
int tag; |
|
int tagVal; |
|
char ch; |
|
int /*i,*/j; |
|
//char buf[1024]; |
|
char tagBuf[1024]; |
|
//printf("<Component> %d\n", *N_comp); |
|
|
|
//i = 0; |
|
j = 0; |
|
st = 0; |
|
tag = 0; |
|
while(!feof(xmlf)){ |
|
ch = (char)fgetc( xmlf ); |
|
if(ch == '<'){ |
|
tag = 1; |
|
j = 1; |
|
tagBuf[j - 1] = ch; |
|
}else { |
|
if(ch == '>'){ |
|
tagBuf[j ] = ch; |
|
tagBuf[j + 1] = '\0'; |
|
|
|
tagVal = getTeg(tagBuf); |
|
|
|
if(tagVal == ECOMP){ |
|
(*N_comp) ++; |
|
return; |
|
} |
|
if(tagVal == RFILTER){ |
|
addFilter(model, last, max); |
|
parserRFilter (xmlf, p, (*model)[*last],b); |
|
} |
|
if(tagVal == PFILTERs){ |
|
parserPFilterS (xmlf, p, model, last, max); |
|
} |
|
tag = 0; |
|
//i = 0; |
|
}else{ |
|
if((tag == 0)&& (st == 1)){ |
|
//buf[i] = ch; i++; |
|
}else{ |
|
tagBuf[j] = ch; j++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
void parserModel(FILE * xmlf, CvLSVMFilterObject *** model, int *last, int *max, int **comp, float **b, int *count, float * score){ |
|
int p = 0; |
|
int N_comp = 0; |
|
int * cmp; |
|
float *bb; |
|
int st = 0; |
|
int tag; |
|
int tagVal; |
|
char ch; |
|
int i,j, ii = 0; |
|
char buf[1024]; |
|
char tagBuf[1024]; |
|
|
|
//printf("<Model>\n"); |
|
|
|
i = 0; |
|
j = 0; |
|
st = 0; |
|
tag = 0; |
|
while(!feof(xmlf)){ |
|
ch = (char)fgetc( xmlf ); |
|
if(ch == '<'){ |
|
tag = 1; |
|
j = 1; |
|
tagBuf[j - 1] = ch; |
|
}else { |
|
if(ch == '>'){ |
|
tagBuf[j ] = ch; |
|
tagBuf[j + 1] = '\0'; |
|
|
|
tagVal = getTeg(tagBuf); |
|
|
|
if(tagVal == EMODEL){ |
|
//printf("</Model>\n"); |
|
for(ii = 0; ii <= *last; ii++){ |
|
(*model)[ii]->numFeatures = p; |
|
} |
|
* count = N_comp; |
|
return; |
|
} |
|
if(tagVal == COMP){ |
|
if(N_comp == 0){ |
|
cmp = (int *)malloc(sizeof(int)); |
|
bb = (float *)malloc(sizeof(float)); |
|
* comp = cmp; |
|
* b = bb; |
|
* count = N_comp + 1; |
|
} else { |
|
cmp = (int *)malloc(sizeof(int) * (N_comp + 1)); |
|
bb = (float *)malloc(sizeof(float) * (N_comp + 1)); |
|
for(ii = 0; ii < N_comp; ii++){ |
|
cmp[ii] = (* comp)[ii]; |
|
bb [ii] = (* b )[ii]; |
|
} |
|
free(* comp); |
|
free(* b ); |
|
* comp = cmp; |
|
* b = bb; |
|
* count = N_comp + 1; |
|
} |
|
parserComp(xmlf, p, &N_comp, model, &((*b)[N_comp]), last, max); |
|
cmp[N_comp - 1] = *last; |
|
} |
|
if(tagVal == P){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == EP){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
p = atoi(buf); |
|
//printf("<P>%d</P>\n", p); |
|
} |
|
if(tagVal == SCORE){ |
|
st = 1; |
|
i = 0; |
|
} |
|
if(tagVal == ESCORE){ |
|
st = 0; |
|
buf[i] = '\0'; |
|
*score = (float)atof(buf); |
|
//printf("<ScoreThreshold>%f</ScoreThreshold>\n", score); |
|
} |
|
tag = 0; |
|
i = 0; |
|
}else{ |
|
if((tag == 0)&& (st == 1)){ |
|
buf[i] = ch; i++; |
|
}else{ |
|
tagBuf[j] = ch; j++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
}//namespace |
|
|
|
int LSVMparser(const char * filename, CvLSVMFilterObject *** model, int *last, int *max, int **comp, float **b, int *count, float * score){ |
|
//int st = 0; |
|
int tag; |
|
char ch; |
|
int /*i,*/j; |
|
FILE *xmlf; |
|
//char buf[1024]; |
|
char tagBuf[1024]; |
|
|
|
(*max) = 10; |
|
(*last) = -1; |
|
(*model) = (CvLSVMFilterObject ** )malloc((sizeof(CvLSVMFilterObject * )) * (*max)); |
|
|
|
//printf("parse : %s\n", filename); |
|
|
|
xmlf = fopen(filename, "rb"); |
|
if(xmlf == NULL) { |
|
free(*model); |
|
*model = NULL; |
|
return LSVM_PARSER_FILE_NOT_FOUND; |
|
} |
|
|
|
//i = 0; |
|
j = 0; |
|
//st = 0; |
|
tag = 0; |
|
while(!feof(xmlf)){ |
|
ch = (char)fgetc( xmlf ); |
|
if(ch == '<'){ |
|
tag = 1; |
|
j = 1; |
|
tagBuf[j - 1] = ch; |
|
}else { |
|
if(ch == '>'){ |
|
tag = 0; |
|
//i = 0; |
|
tagBuf[j ] = ch; |
|
tagBuf[j + 1] = '\0'; |
|
if(getTeg(tagBuf) == MODEL){ |
|
parserModel(xmlf, model, last, max, comp, b, count, score); |
|
} |
|
}else{ |
|
if(tag == 0){ |
|
//buf[i] = ch; i++; |
|
}else{ |
|
tagBuf[j] = ch; j++; |
|
} |
|
} |
|
} |
|
} |
|
|
|
fclose(xmlf); |
|
return LATENT_SVM_OK; |
|
} |
|
|
|
int loadModel( |
|
const char *modelPath, |
|
CvLSVMFilterObject ***filters, |
|
int *kFilters, |
|
int *kComponents, |
|
int **kPartFilters, |
|
float **b, |
|
float *scoreThreshold){ |
|
int last; |
|
int max; |
|
int *comp = NULL; |
|
int count; |
|
int i; |
|
int err; |
|
float score; |
|
//printf("start_parse\n\n"); |
|
|
|
err = LSVMparser(modelPath, filters, &last, &max, &comp, b, &count, &score); |
|
if(err != LATENT_SVM_OK){ |
|
return err; |
|
} |
|
(*kFilters) = last + 1; |
|
(*kComponents) = count; |
|
(*scoreThreshold) = (float) score; |
|
|
|
(*kPartFilters) = (int *)malloc(sizeof(int) * count); |
|
|
|
for(i = 1; i < count;i++){ |
|
(*kPartFilters)[i] = (comp[i] - comp[i - 1]) - 1; |
|
} |
|
(*kPartFilters)[0] = comp[0]; |
|
free(comp); |
|
|
|
return 0; |
|
}
|
|
|