/*! * recogAppend() * * Input: recog1 * recog2 (gets added to recog1) * Return: 0 if OK, 1 on error * * Notes: * (1) This is used to make a training recognizer from more than * one trained recognizer source. It should only be used * when the bitmaps for corresponding character classes are * very similar. That constraint does not arise when * the character classes are disjoint; e.g., if recog1 is * digits and recog2 is alphabetical. * (2) This is done by appending recog2 to recog1. Averages are * computed for each recognizer, if necessary, before appending. * (3) Non-array fields are combined using the appropriate min and max. */ l_int32 recogAppend(L_RECOG *recog1, L_RECOG *recog2) { PROCNAME("recogAppend"); if (!recog1) return ERROR_INT("recog1 not defined", procName, 1); if (!recog2) return ERROR_INT("recog2 not defined", procName, 1); /* Make sure both are finalized with all arrays computed */ recogAverageSamples(recog1, 0); recogAverageSamples(recog2, 0); /* Combine non-array field values */ recog1->minwidth_u = L_MIN(recog1->minwidth_u, recog2->minwidth_u); recog1->maxwidth_u = L_MAX(recog1->maxwidth_u, recog2->maxwidth_u); recog1->minheight_u = L_MIN(recog1->minheight_u, recog2->minheight_u); recog1->maxheight_u = L_MAX(recog1->maxheight_u, recog2->maxheight_u); recog1->minwidth = L_MIN(recog1->minwidth, recog2->minwidth); recog1->maxwidth = L_MAX(recog1->maxwidth, recog2->maxwidth); recog1->min_splitw = L_MIN(recog1->min_splitw, recog2->min_splitw); recog1->min_splith = L_MIN(recog1->min_splith, recog2->min_splith); recog1->max_splith = L_MAX(recog1->max_splith, recog2->max_splith); /* Combine array field values */ recog1->setsize += recog2->setsize; sarrayAppendRange(recog1->sa_text, recog2->sa_text, 0, -1); l_dnaJoin(recog1->dna_tochar, recog2->dna_tochar, 0, -1); pixaaJoin(recog1->pixaa_u, recog2->pixaa_u, 0, -1); pixaJoin(recog1->pixa_u, recog2->pixa_u, 0, -1); ptaaJoin(recog1->ptaa_u, recog2->ptaa_u, 0, -1); ptaJoin(recog1->pta_u, recog2->pta_u, 0, -1); numaaJoin(recog1->naasum_u, recog2->naasum_u, 0, -1); numaJoin(recog1->nasum_u, recog2->nasum_u, 0, -1); pixaaJoin(recog1->pixaa, recog2->pixaa, 0, -1); pixaJoin(recog1->pixa, recog2->pixa, 0, -1); ptaaJoin(recog1->ptaa, recog2->ptaa, 0, -1); ptaJoin(recog1->pta, recog2->pta, 0, -1); numaaJoin(recog1->naasum, recog2->naasum, 0, -1); numaJoin(recog1->nasum, recog2->nasum, 0, -1); return 0; }
jboolean Java_com_googlecode_leptonica_android_Pixa_nativeJoin(JNIEnv *env, jclass clazz, jlong nativePixa, jlong otherPixa) { PIXA *pixa = (PIXA *) nativePixa; PIXA *pixas = (PIXA *) otherPixa; if (pixaJoin(pixa, pixas, 0, 0)) { return JNI_FALSE; } return JNI_TRUE; }
jboolean Java_com_example_ocr_Pixa_nativeJoin(JNIEnv *env, jclass clazz, jint nativePixa, jint otherPixa) { PIXA *pixa = (PIXA *) nativePixa; PIXA *pixas = (PIXA *) otherPixa; if (pixaJoin(pixa, pixas, 0, 0)) { return JNI_FALSE; } return JNI_TRUE; }
PIXA *MakeBootnum1(void) { const char *str; PIXA *pixa1, *pixa2, *pixa3; pixa1 = pixaRead("recog/digits/digit_set02.pa"); str = "10, 27, 35, 45, 48, 74, 79, 97, 119, 124, 148"; pixa3 = pixaSelectWithString(pixa1, str, NULL); pixaDestroy(&pixa1); pixa1 = pixaRead("recog/digits/digit_set03.pa"); str = "2, 15, 30, 50, 60, 75, 95, 105, 121, 135"; pixa2 = pixaSelectWithString(pixa1, str, NULL); pixaJoin(pixa3, pixa2, 0, -1); pixaDestroy(&pixa1); pixaDestroy(&pixa2); pixa1 = pixaRead("recog/digits/digit_set05.pa"); str = "0, 15, 30, 49, 60, 75, 90, 105, 120, 135"; pixa2 = pixaSelectWithString(pixa1, str, NULL); pixaJoin(pixa3, pixa2, 0, -1); pixaDestroy(&pixa1); pixaDestroy(&pixa2); pixa1 = pixaRead("recog/digits/digit_set06.pa"); str = "4, 15, 30, 48, 60, 78, 90, 105, 120, 135"; pixa2 = pixaSelectWithString(pixa1, str, NULL); pixaJoin(pixa3, pixa2, 0, -1); pixaDestroy(&pixa1); pixaDestroy(&pixa2); pixa1 = pixaRead("recog/digits/digit_set07.pa"); str = "3, 15, 30, 45, 60, 77, 78, 91, 105, 120, 149"; pixa2 = pixaSelectWithString(pixa1, str, NULL); pixaJoin(pixa3, pixa2, 0, -1); pixaDestroy(&pixa1); pixaDestroy(&pixa2); pixa1 = pixaRead("recog/digits/digit_set08.pa"); str = "0, 20, 30, 45, 60, 75, 90, 106, 121, 135"; pixa2 = pixaSelectWithString(pixa1, str, NULL); pixaJoin(pixa3, pixa2, 0, -1); pixaDestroy(&pixa1); pixaDestroy(&pixa2); pixa1 = pixaRead("recog/digits/digit_set09.pa"); str = "0, 20, 32, 47, 54, 63, 75, 91, 105, 125, 136"; pixa2 = pixaSelectWithString(pixa1, str, NULL); pixaJoin(pixa3, pixa2, 0, -1); pixaDestroy(&pixa1); pixaDestroy(&pixa2); pixa1 = pixaRead("recog/digits/digit_set11.pa"); str = "0, 15, 36, 46, 62, 63, 76, 91, 106, 123, 135"; pixa2 = pixaSelectWithString(pixa1, str, NULL); pixaJoin(pixa3, pixa2, 0, -1); pixaDestroy(&pixa1); pixaDestroy(&pixa2); pixa1 = pixaRead("recog/digits/digit_set12.pa"); str = "1, 20, 31, 45, 61, 75, 95, 107, 120, 135"; pixa2 = pixaSelectWithString(pixa1, str, NULL); pixaJoin(pixa3, pixa2, 0, -1); pixaDestroy(&pixa1); pixaDestroy(&pixa2); pixa1 = pixaRead("recog/digits/digit_set13.pa"); str = "1, 16, 31, 48, 63, 78, 98, 105, 123, 136"; pixa2 = pixaSelectWithString(pixa1, str, NULL); pixaJoin(pixa3, pixa2, 0, -1); pixaDestroy(&pixa1); pixaDestroy(&pixa2); return pixa3; }