/*! * recogaReadStream() * * Input: stream * Return: recog, or null on error */ L_RECOGA * recogaReadStream(FILE *fp) { l_int32 version, i, nrec, ignore; L_RECOG *recog; L_RECOGA *recoga; PROCNAME("recogaReadStream"); if (!fp) return (L_RECOGA *)ERROR_PTR("stream not defined", procName, NULL); if (fscanf(fp, "\nRecog Version %d\n", &version) != 1) return (L_RECOGA *)ERROR_PTR("not a recog file", procName, NULL); if (version != RECOG_VERSION_NUMBER) return (L_RECOGA *)ERROR_PTR("invalid recog version", procName, NULL); if (fscanf(fp, "Number of recognizers = %d\n\n", &nrec) != 1) return (L_RECOGA *)ERROR_PTR("nrec not read", procName, NULL); recoga = recogaCreate(nrec); for (i = 0; i < nrec; i++) { ignore = fscanf(fp, "==============================\n"); if (fscanf(fp, "Recognizer %d\n", &ignore) != 1) return (L_RECOGA *)ERROR_PTR("malformed file", procName, NULL); if ((recog = recogReadStream(fp)) == NULL) { recogaDestroy(&recoga); L_ERROR("recog read failed for recog %d\n", procName, i); return NULL; } ignore = fscanf(fp, "\n"); recogaAddRecog(recoga, recog); } return recoga; }
/*! * recogaCreateFromPixaa() * * Input: paa (of labelled, 1 bpp images) * scalew (scale all widths to this; use 0 for no scaling) * scaleh (scale all heights to this; use 0 for no scaling) * templ_type (L_USE_AVERAGE or L_USE_ALL) * threshold (for binarization; typically ~128) * maxyshift (from nominal centroid alignment; typically 0 or 1) * Return: recoga, or null on error * * Notes: * (1) This is a convenience function for training from labelled data. * (2) Each pixa in the paa is a set of labelled data that is used * to train a recognizer (e.g., for a set of characters in a font). * Each image DC in the pixa is put into a class in its * recognizer, defined by its character label. All examples in * the same class should be similar. * (3) The pixaa can be written by recogaWritePixaa(), and must contain * the unscaled bitmaps used for training. */ L_RECOGA * recogaCreateFromPixaa(PIXAA *paa, l_int32 scalew, l_int32 scaleh, l_int32 templ_type, l_int32 threshold, l_int32 maxyshift) { l_int32 n, i, full; L_RECOG *recog; L_RECOGA *recoga; PIXA *pixa; PROCNAME("recogaCreateFromPixaa"); if (!paa) return (L_RECOGA *)ERROR_PTR("paa not defined", procName, NULL); if (pixaaVerifyDepth(paa, NULL) != 1) return (L_RECOGA *)ERROR_PTR("all pix not 1 bpp", procName, NULL); pixaaIsFull(paa, &full); if (!full) return (L_RECOGA *)ERROR_PTR("all pix not present", procName, NULL); n = pixaaGetCount(paa, NULL); recoga = recogaCreate(n); for (i = 0; i < n; i++) { pixa = pixaaGetPixa(paa, i, L_CLONE); recog = recogCreateFromPixa(pixa, scalew, scaleh, templ_type, threshold, maxyshift); recogaAddRecog(recoga, recog); pixaDestroy(&pixa); } return recoga; }
/*! * recogaCreateFromRecog() * * Input: recog * Return: recoga, or null on error * * Notes: * (1) This is a convenience function for making a recoga after * you have a recog. The recog is owned by the recoga. * (2) For splitting connected components, the * input recog must be from the material to be identified, * and not a generic bootstrap recog. Those can be added later. */ L_RECOGA * recogaCreateFromRecog(L_RECOG *recog) { L_RECOGA *recoga; PROCNAME("recogaCreateFromRecog"); if (!recog) return (L_RECOGA *)ERROR_PTR("recog not defined", procName, NULL); recoga = recogaCreate(1); recogaAddRecog(recoga, recog); return recoga; }