190 #include <config_auto.h>
194 #include "allheaders.h"
196 static const l_int32 MaxExamplesInClass = 256;
200 static const l_int32 DefaultMinNopad = 1;
201 static const l_float32 DefaultMaxWHRatio = 3.0;
203 static const l_float32 DefaultMaxHTRatio = 2.6;
205 static const l_int32 DefaultThreshold = 150;
206 static const l_int32 DefaultMaxYShift = 1;
248 return (
L_RECOG *)ERROR_PTR(
"recs not defined", __func__, NULL);
292 return (
L_RECOG *)ERROR_PTR(
"pixa not defined", __func__, NULL);
295 threshold, maxyshift);
297 return (
L_RECOG *)ERROR_PTR(
"recog not made", __func__, NULL);
301 return (
L_RECOG *)ERROR_PTR(
"bad templates", __func__, NULL);
334 l_int32 full, n, i, ntext, same, maxd;
339 return (
L_RECOG *)ERROR_PTR(
"pixa not defined", __func__, NULL);
342 return (
L_RECOG *)ERROR_PTR(
"not all pix are 1 bpp", __func__, NULL);
346 return (
L_RECOG *)ERROR_PTR(
"not all pix are present", __func__, NULL);
351 return (
L_RECOG *)ERROR_PTR(
"no pix have text strings", __func__, NULL);
353 L_ERROR(
"%d text strings < %d pix\n", __func__, ntext, n);
355 recog =
recogCreate(scalew, scaleh, linew, threshold, maxyshift);
357 return (
L_RECOG *)ERROR_PTR(
"recog not made", __func__, NULL);
358 for (i = 0; i < n; i++) {
361 if (!text || strlen(text) == 0) {
362 L_ERROR(
"pix[%d] has no text\n", __func__, i);
413 if (scalew < 0 || scaleh < 0)
414 return (
L_RECOG *)ERROR_PTR(
"invalid scalew or scaleh", __func__, NULL);
416 return (
L_RECOG *)ERROR_PTR(
"invalid linew > 10", __func__, NULL);
417 if (threshold == 0) threshold = DefaultThreshold;
418 if (threshold < 0 || threshold > 255) {
419 L_WARNING(
"invalid threshold; using default\n", __func__);
420 threshold = DefaultThreshold;
422 if (maxyshift < 0 || maxyshift > 2) {
423 L_WARNING(
"invalid maxyshift; using default value\n", __func__);
424 maxyshift = DefaultMaxYShift;
425 }
else if (maxyshift == 0) {
426 L_WARNING(
"Using maxyshift = 0; faster, worse correlation results\n",
428 }
else if (maxyshift == 2) {
429 L_WARNING(
"Using maxyshift = 2; slower\n", __func__);
437 recog->
linew = linew;
477 L_WARNING(
"ptr address is null\n", __func__);
481 if ((recog = *precog) == NULL)
return;
528 return ERROR_INT(
"recog not defined", __func__, 0);
564 l_float32 max_wh_ratio,
565 l_float32 max_ht_ratio)
568 return ERROR_INT(
"recog not defined", __func__, 1);
570 recog->
charset_type = (type >= 0) ? type : DefaultCharsetType;
572 recog->
min_nopad = (min_nopad >= 0) ? min_nopad : DefaultMinNopad;
573 recog->
max_wh_ratio = (max_wh_ratio > 0.0) ? max_wh_ratio :
575 recog->
max_ht_ratio = (max_ht_ratio > 1.0) ? max_ht_ratio :
604 L_ERROR(
"invalid charset_type %d\n", __func__, type);
647 return ERROR_INT(
"&index not defined", __func__, 2);
650 return ERROR_INT(
"recog not defined", __func__, 2);
652 return ERROR_INT(
"text not defined", __func__, 2);
656 for (i = 0; i < n; i++) {
690 return ERROR_INT(
"&index not defined", __func__, 1);
693 return ERROR_INT(
"recog not defined", __func__, 1);
695 return ERROR_INT(
"text not defined", __func__, 1);
699 for (i = 0; i < n; i++) {
702 L_ERROR(
"string not found for index %d\n", __func__, i);
705 diff = strcmp(text, charstr);
738 return ERROR_INT(
"&charstr not defined", __func__, 1);
741 return ERROR_INT(
"recog not defined", __func__, 2);
743 if (index < 0 || index >= recog->
setsize)
744 return ERROR_INT(
"invalid index", __func__, 1);
745 LEPT_FREE(*pcharstr);
768 return ERROR_INT(
"&val not defined", __func__, 1);
771 return ERROR_INT(
"str not defined", __func__, 1);
774 return ERROR_INT(
"empty string", __func__, 1);
776 return ERROR_INT(
"invalid string: > 4 bytes", __func__, 1);
778 val = (l_uint8)str[0];
780 val = (val << 8) + (l_uint8)str[1];
782 val = (val << 8) + (l_uint8)str[2];
784 val = (val << 8) + (l_uint8)str[3];
785 *pval = (l_int32)(val & 0x7fffffff);
825 return (
L_RECOG *)ERROR_PTR(
"filename not defined", __func__, NULL);
827 return (
L_RECOG *)ERROR_PTR(
"stream not opened", __func__, NULL);
831 return (
L_RECOG *)ERROR_PTR(
"recog not read", __func__, NULL);
848 l_int32 version, setsize, threshold, scalew, scaleh, linew;
849 l_int32 maxyshift, nc;
856 return (
L_RECOG *)ERROR_PTR(
"stream not defined", __func__, NULL);
858 if (fscanf(fp,
"\nRecog Version %d\n", &version) != 1)
859 return (
L_RECOG *)ERROR_PTR(
"not a recog file", __func__, NULL);
860 if (version != RECOG_VERSION_NUMBER)
861 return (
L_RECOG *)ERROR_PTR(
"invalid recog version", __func__, NULL);
862 if (fscanf(fp,
"Size of character set = %d\n", &setsize) != 1)
863 return (
L_RECOG *)ERROR_PTR(
"setsize not read", __func__, NULL);
864 if (fscanf(fp,
"Binarization threshold = %d\n", &threshold) != 1)
865 return (
L_RECOG *)ERROR_PTR(
"binary thresh not read", __func__, NULL);
866 if (fscanf(fp,
"Maxyshift = %d\n", &maxyshift) != 1)
867 return (
L_RECOG *)ERROR_PTR(
"maxyshift not read", __func__, NULL);
868 if (fscanf(fp,
"Scale to width = %d\n", &scalew) != 1)
869 return (
L_RECOG *)ERROR_PTR(
"width not read", __func__, NULL);
870 if (fscanf(fp,
"Scale to height = %d\n", &scaleh) != 1)
871 return (
L_RECOG *)ERROR_PTR(
"height not read", __func__, NULL);
872 if (fscanf(fp,
"Normalized line width = %d\n", &linew) != 1)
873 return (
L_RECOG *)ERROR_PTR(
"line width not read", __func__, NULL);
874 if ((recog =
recogCreate(scalew, scaleh, linew, threshold,
876 return (
L_RECOG *)ERROR_PTR(
"recog not made", __func__, NULL);
878 if (fscanf(fp,
"\nLabels for character set:\n") != 0) {
880 return (
L_RECOG *)ERROR_PTR(
"label intro not read", __func__, NULL);
885 return (
L_RECOG *)ERROR_PTR(
"dna_tochar not read", __func__, NULL);
891 return (
L_RECOG *)ERROR_PTR(
"sa_text not read", __func__, NULL);
895 if (fscanf(fp,
"\nPixaa of all samples in the training set:\n") != 0) {
897 return (
L_RECOG *)ERROR_PTR(
"pixaa intro not read", __func__, NULL);
901 return (
L_RECOG *)ERROR_PTR(
"pixaa not read", __func__, NULL);
908 L_ERROR(
"(setsize = %d) != (paa count = %d)\n", __func__,
916 return (
L_RECOG *)ERROR_PTR(
"bad templates", __func__, NULL);
936 return (
L_RECOG *)ERROR_PTR(
"data not defined", __func__, NULL);
938 return (
L_RECOG *)ERROR_PTR(
"stream not opened", __func__, NULL);
942 if (!recog) L_ERROR(
"recog not read\n", __func__);
971 return ERROR_INT(
"filename not defined", __func__, 1);
973 return ERROR_INT(
"recog not defined", __func__, 1);
976 return ERROR_INT(
"stream not opened", __func__, 1);
980 return ERROR_INT(
"recog not written to stream", __func__, 1);
997 return ERROR_INT(
"stream not defined", __func__, 1);
999 return ERROR_INT(
"recog not defined", __func__, 1);
1001 fprintf(fp,
"\nRecog Version %d\n", RECOG_VERSION_NUMBER);
1002 fprintf(fp,
"Size of character set = %d\n", recog->
setsize);
1003 fprintf(fp,
"Binarization threshold = %d\n", recog->
threshold);
1004 fprintf(fp,
"Maxyshift = %d\n", recog->
maxyshift);
1005 fprintf(fp,
"Scale to width = %d\n", recog->
scalew);
1006 fprintf(fp,
"Scale to height = %d\n", recog->
scaleh);
1007 fprintf(fp,
"Normalized line width = %d\n", recog->
linew);
1008 fprintf(fp,
"\nLabels for character set:\n");
1011 fprintf(fp,
"\nPixaa of all samples in the training set:\n");
1039 if (pdata) *pdata = NULL;
1040 if (psize) *psize = 0;
1042 return ERROR_INT(
"&data not defined", __func__, 1);
1044 return ERROR_INT(
"&size not defined", __func__, 1);
1046 return ERROR_INT(
"recog not defined", __func__, 1);
1049 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1050 return ERROR_INT(
"stream not opened", __func__, 1);
1054 *psize = *psize - 1;
1056 L_INFO(
"work-around: writing to a temp file\n", __func__);
1059 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1061 if ((fp = tmpfile()) == NULL)
1062 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1090 return (
PIXA *)ERROR_PTR(
"recog not defined", __func__, NULL);
1107 l_int32 i, j, n1, n2;
1113 return ERROR_INT(
"recog not defined", __func__, 1);
1118 for (i = 0; i < n1; i++) {
1122 for (j = 0; j < n2; j++) {
1159 l_int32 i, j, nc, ns;
1165 return ERROR_INT(
"&recog not defined", __func__, 1);
1166 if ((recog = *precog) == NULL)
1167 return ERROR_INT(
"recog not defined", __func__, 1);
1171 return ERROR_INT(
"paa not defined", __func__, 1);
1175 for (i = 0; i < nc; i++) {
1181 for (j = 0; j < ns; j++) {
1183 if (debug)
lept_stderr(
"pix[%d,%d]: text = %s\n", i, j, text);
1192 return ERROR_INT(
"bad templates; recog destroyed", __func__, 1);
void bmfDestroy(L_BMF **pbmf)
bmfDestroy()
L_BMF * bmfCreate(const char *dir, l_int32 fontsize)
bmfCreate()
L_DNA * l_dnaReadStream(FILE *fp)
l_dnaReadStream()
l_ok l_dnaWriteStream(FILE *fp, L_DNA *da)
l_dnaWriteStream()
L_DNA * l_dnaCreate(l_int32 n)
l_dnaCreate()
l_ok l_dnaGetIValue(L_DNA *da, l_int32 index, l_int32 *pival)
l_dnaGetIValue()
l_ok l_dnaAddNumber(L_DNA *da, l_float64 val)
l_dnaAddNumber()
void l_dnaDestroy(L_DNA **pda)
l_dnaDestroy()
l_int32 l_dnaGetCount(L_DNA *da)
l_dnaGetCount()
void numaDestroy(NUMA **pna)
numaDestroy()
void numaaDestroy(NUMAA **pnaa)
numaaDestroy()
void pixDestroy(PIX **ppix)
pixDestroy()
char * pixGetText(PIX *pix)
pixGetText()
l_ok pixSetText(PIX *pix, const char *textstring)
pixSetText()
l_int32 * makePixelSumTab8(void)
makePixelSumTab8()
l_int32 * makePixelCentroidTab8(void)
makePixelCentroidTab8()
PIXAA * pixaaCreate(l_int32 n)
pixaaCreate()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
l_ok pixaVerifyDepth(PIXA *pixa, l_int32 *psame, l_int32 *pmaxd)
pixaVerifyDepth()
l_ok pixaCountText(PIXA *pixa, l_int32 *pntext)
pixaCountText()
PIXAA * pixaaReadStream(FILE *fp)
pixaaReadStream()
l_ok pixaaAddPix(PIXAA *paa, l_int32 index, PIX *pix, BOX *box, l_int32 copyflag)
pixaaAddPix()
l_ok pixaaAddPixa(PIXAA *paa, PIXA *pixa, l_int32 copyflag)
pixaaAddPixa()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()
l_ok pixaIsFull(PIXA *pixa, l_int32 *pfullpa, l_int32 *pfullba)
pixaIsFull()
l_ok pixaaWriteStream(FILE *fp, PIXAA *paa)
pixaaWriteStream()
void pixaaDestroy(PIXAA **ppaa)
pixaaDestroy()
l_int32 pixaaGetCount(PIXAA *paa, NUMA **pna)
pixaaGetCount()
PIXA * pixaaGetPixa(PIXAA *paa, l_int32 index, l_int32 accesstype)
pixaaGetPixa()
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
PIXA * pixaaFlattenToPixa(PIXAA *paa, NUMA **pnaindex, l_int32 copyflag)
pixaaFlattenToPixa()
void ptaaDestroy(PTAA **pptaa)
ptaaDestroy()
void ptaDestroy(PTA **ppta)
ptaDestroy()
l_ok recogStringToIndex(L_RECOG *recog, char *text, l_int32 *pindex)
recogStringToIndex()
l_ok recogWrite(const char *filename, L_RECOG *recog)
recogWrite()
L_RECOG * recogCreateFromRecog(L_RECOG *recs, l_int32 scalew, l_int32 scaleh, l_int32 linew, l_int32 threshold, l_int32 maxyshift)
recogCreateFromRecog()
static l_int32 recogGetCharsetSize(l_int32 type)
recogGetCharsetSize()
L_RECOG * recogRead(const char *filename)
recogRead()
l_ok recogWriteMem(l_uint8 **pdata, size_t *psize, L_RECOG *recog)
recogWriteMem()
l_ok recogWriteStream(FILE *fp, L_RECOG *recog)
recogWriteStream()
l_ok recogSetParams(L_RECOG *recog, l_int32 type, l_int32 min_nopad, l_float32 max_wh_ratio, l_float32 max_ht_ratio)
recogSetParams()
static l_int32 recogAddAllSamples(L_RECOG **precog, PIXAA *paa, l_int32 debug)
recogAddAllSamples()
l_ok l_convertCharstrToInt(const char *str, l_int32 *pval)
l_convertCharstrToInt()
PIXA * recogExtractPixa(L_RECOG *recog)
recogExtractPixa()
l_int32 recogGetClassIndex(L_RECOG *recog, l_int32 val, char *text, l_int32 *pindex)
recogGetClassIndex()
static l_int32 recogAddCharstrLabels(L_RECOG *recog)
recogAddCharstrLabels()
L_RECOG * recogCreate(l_int32 scalew, l_int32 scaleh, l_int32 linew, l_int32 threshold, l_int32 maxyshift)
recogCreate()
L_RECOG * recogCreateFromPixa(PIXA *pixa, l_int32 scalew, l_int32 scaleh, l_int32 linew, l_int32 threshold, l_int32 maxyshift)
recogCreateFromPixa()
L_RECOG * recogReadMem(const l_uint8 *data, size_t size)
recogReadMem()
l_int32 recogGetClassString(L_RECOG *recog, l_int32 index, char **pcharstr)
recogGetClassString()
l_int32 recogGetCount(L_RECOG *recog)
recogGetCount()
L_RECOG * recogReadStream(FILE *fp)
recogReadStream()
void recogDestroy(L_RECOG **precog)
recogDestroy()
L_RECOG * recogCreateFromPixaNoFinish(PIXA *pixa, l_int32 scalew, l_int32 scaleh, l_int32 linew, l_int32 threshold, l_int32 maxyshift)
recogCreateFromPixaNoFinish()
l_ok recogDestroyDid(L_RECOG *recog)
recogDestroyDid()
void rchaDestroy(L_RCHA **prcha)
rchaDestroy()
void rchDestroy(L_RCH **prch)
rchDestroy()
l_ok recogTrainingFinished(L_RECOG **precog, l_int32 modifyflag, l_int32 minsize, l_float32 minfract)
recogTrainingFinished()
l_ok recogTrainLabeled(L_RECOG *recog, PIX *pixs, BOX *box, char *text, l_int32 debug)
recogTrainLabeled()
SARRAY * sarrayCreate(l_int32 n)
sarrayCreate()
char * sarrayGetString(SARRAY *sa, l_int32 index, l_int32 copyflag)
sarrayGetString()
SARRAY * sarrayReadStream(FILE *fp)
sarrayReadStream()
void sarrayDestroy(SARRAY **psa)
sarrayDestroy()
l_ok sarrayAddString(SARRAY *sa, const char *string, l_int32 copyflag)
sarrayAddString()
l_ok sarrayWriteStream(FILE *fp, SARRAY *sa)
sarrayWriteStream()
struct L_Dna * dna_tochar
struct Pixa * pixadb_split
struct Pixa * pixadb_boot
void lept_stderr(const char *fmt,...)
lept_stderr()
char * stringNew(const char *src)
stringNew()
l_uint8 * l_binaryReadStream(FILE *fp, size_t *pnbytes)
l_binaryReadStream()
FILE * fopenReadFromMemory(const l_uint8 *data, size_t size)
fopenReadFromMemory()
FILE * fopenWriteStream(const char *filename, const char *modestring)
fopenWriteStream()
FILE * fopenWriteWinTempfile(void)
fopenWriteWinTempfile()
FILE * fopenReadStream(const char *filename)
fopenReadStream()