/*! * boxaaReadStream() * * Input: stream * Return: boxaa, or null on error */ BOXAA * boxaaReadStream(FILE *fp) { l_int32 n, i, x, y, w, h, version; l_int32 ignore; BOXA *boxa; BOXAA *baa; PROCNAME("boxaaReadStream"); if (!fp) return (BOXAA *)ERROR_PTR("stream not defined", procName, NULL); if (fscanf(fp, "\nBoxaa Version %d\n", &version) != 1) return (BOXAA *)ERROR_PTR("not a boxaa file", procName, NULL); if (version != BOXAA_VERSION_NUMBER) return (BOXAA *)ERROR_PTR("invalid boxa version", procName, NULL); if (fscanf(fp, "Number of boxa = %d\n", &n) != 1) return (BOXAA *)ERROR_PTR("not a boxaa file", procName, NULL); if ((baa = boxaaCreate(n)) == NULL) return (BOXAA *)ERROR_PTR("boxaa not made", procName, NULL); for (i = 0; i < n; i++) { if (fscanf(fp, "\nBoxa[%d] extent: x = %d, y = %d, w = %d, h = %d", &ignore, &x, &y, &w, &h) != 5) return (BOXAA *)ERROR_PTR("boxa descr not valid", procName, NULL); if ((boxa = boxaReadStream(fp)) == NULL) return (BOXAA *)ERROR_PTR("boxa not made", procName, NULL); boxaaAddBoxa(baa, boxa, L_INSERT); } return baa; }
/*! * pixaReadStream() * * Input: stream * Return: pixa, or null on error */ PIXA * pixaReadStream(FILE *fp) { l_int32 n, i, xres, yres, version; l_int32 ignore; BOXA *boxa; PIX *pix; PIXA *pixa; PROCNAME("pixaReadStream"); #if !HAVE_LIBPNG /* defined in environ.h */ return (PIXA *)ERROR_PTR("no libpng: can't read data", procName, NULL); #else if (!fp) return (PIXA *)ERROR_PTR("stream not defined", procName, NULL); if (fscanf(fp, "\nPixa Version %d\n", &version) != 1) return (PIXA *)ERROR_PTR("not a pixa file", procName, NULL); if (version != PIXA_VERSION_NUMBER) return (PIXA *)ERROR_PTR("invalid pixa version", procName, NULL); if (fscanf(fp, "Number of pix = %d\n", &n) != 1) return (PIXA *)ERROR_PTR("not a pixa file", procName, NULL); if ((pixa = pixaCreate(n)) == NULL) return (PIXA *)ERROR_PTR("pixa not made", procName, NULL); if ((boxa = boxaReadStream(fp)) == NULL) return (PIXA *)ERROR_PTR("boxa not made", procName, NULL); boxaDestroy(&pixa->boxa); pixa->boxa = boxa; for (i = 0; i < n; i++) { if ((fscanf(fp, " pix[%d]: xres = %d, yres = %d\n", &ignore, &xres, &yres)) != 3) return (PIXA *)ERROR_PTR("res reading", procName, NULL); if ((pix = pixReadStreamPng(fp)) == NULL) return (PIXA *)ERROR_PTR("pix not read", procName, NULL); pixSetXRes(pix, xres); pixSetYRes(pix, yres); pixaAddPix(pixa, pix, L_INSERT); } return pixa; #endif /* !HAVE_LIBPNG */ }
/*! * boxaRead() * * Input: filename * Return: boxa, or null on error */ BOXA * boxaRead(const char *filename) { FILE *fp; BOXA *boxa; PROCNAME("boxaRead"); if (!filename) return (BOXA *)ERROR_PTR("filename not defined", procName, NULL); if ((fp = fopenReadStream(filename)) == NULL) return (BOXA *)ERROR_PTR("stream not opened", procName, NULL); if ((boxa = boxaReadStream(fp)) == NULL) { fclose(fp); return (BOXA *)ERROR_PTR("boxa not read", procName, NULL); } fclose(fp); return boxa; }
/*! * pixaaReadStream() * * Input: stream * Return: pixaa, or null on error */ PIXAA * pixaaReadStream(FILE *fp) { l_int32 n, i, version; l_int32 ignore; BOXA *boxa; PIXA *pixa; PIXAA *pixaa; PROCNAME("pixaaReadStream"); if (!fp) return (PIXAA *)ERROR_PTR("stream not defined", procName, NULL); if (fscanf(fp, "\nPixaa Version %d\n", &version) != 1) return (PIXAA *)ERROR_PTR("not a pixaa file", procName, NULL); if (version != PIXAA_VERSION_NUMBER) return (PIXAA *)ERROR_PTR("invalid pixaa version", procName, NULL); if (fscanf(fp, "Number of pixa = %d\n", &n) != 1) return (PIXAA *)ERROR_PTR("not a pixaa file", procName, NULL); if ((pixaa = pixaaCreate(n)) == NULL) return (PIXAA *)ERROR_PTR("pixaa not made", procName, NULL); if ((boxa = boxaReadStream(fp)) == NULL) return (PIXAA *)ERROR_PTR("boxa not made", procName, NULL); boxaDestroy(&pixaa->boxa); pixaa->boxa = boxa; for (i = 0; i < n; i++) { if ((fscanf(fp, "\n\n --------------- pixa[%d] ---------------\n", &ignore)) != 1) { return (PIXAA *)ERROR_PTR("text reading", procName, NULL); } if ((pixa = pixaReadStream(fp)) == NULL) return (PIXAA *)ERROR_PTR("pixa not read", procName, NULL); pixaaAddPixa(pixaa, pixa, L_INSERT); } return pixaa; }
/*! * boxaaReadStreamVersion2() * * Input: stream * Return: boxaa, or null on error * */ BOXAA * boxaaReadStreamVersion2(FILE *fp) { l_int32 n, i, x, y, w, h, version; l_int32 ignore; BOXA *boxa; BOXAA *baa; PROCNAME("boxaaReadStreamVersion2"); if (!fp) return (BOXAA *)ERROR_PTR("stream not defined", procName, NULL); if (fscanf(fp, "\nBoxaa Version %d\n", &version) != 1) return (BOXAA *)ERROR_PTR("not a boxaa file", procName, NULL); if (version != 2) { fprintf(stderr, "This is version %d\n", version); return (BOXAA *)ERROR_PTR("Not old version 2", procName, NULL); } if (fscanf(fp, "Number of boxa = %d\n", &n) != 1) return (BOXAA *)ERROR_PTR("not a boxaa file", procName, NULL); if ((baa = boxaaCreate(n)) == NULL) return (BOXAA *)ERROR_PTR("boxaa not made", procName, NULL); for (i = 0; i < n; i++) { if (fscanf(fp, " Boxa[%d]: x = %d, y = %d, w = %d, h = %d\n", &ignore, &x, &y, &w, &h) != 5) return (BOXAA *)ERROR_PTR("boxa descr not valid", procName, NULL); if ((boxa = boxaReadStream(fp)) == NULL) return (BOXAA *)ERROR_PTR("boxa not made", procName, NULL); boxaaAddBoxa(baa, boxa, L_INSERT); } return baa; }
int main(int argc, char **argv) { l_uint8 *array1, *array2; l_int32 n1, n2, n3; size_t size1, size2; FILE *fp; BOXA *boxa1, *boxa2; PIX *pixs, *pix1; PIXA *pixa1; PIXCMAP *cmap; L_REGPARAMS *rp; if (regTestSetup(argc, argv, &rp)) return 1; pixs = pixRead("feyn.tif"); /* --------------------------------------------------------------- * * Test pixConnComp() and pixCountConnComp(), * * with output to both boxa and pixa * * --------------------------------------------------------------- */ /* First, test with 4-cc */ boxa1= pixConnComp(pixs, &pixa1, 4); n1 = boxaGetCount(boxa1); boxa2= pixConnComp(pixs, NULL, 4); n2 = boxaGetCount(boxa2); pixCountConnComp(pixs, 4, &n3); fprintf(stderr, "Number of 4 c.c.: n1 = %d; n2 = %d, n3 = %d\n", n1, n2, n3); regTestCompareValues(rp, n1, n2, 0); /* 0 */ regTestCompareValues(rp, n1, n3, 0); /* 1 */ regTestCompareValues(rp, n1, 4452, 0); /* 2 */ pix1 = pixaDisplay(pixa1, pixGetWidth(pixs), pixGetHeight(pixs)); regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 3 */ regTestComparePix(rp, pixs, pix1); /* 4 */ pixaDestroy(&pixa1); boxaDestroy(&boxa1); boxaDestroy(&boxa2); pixDestroy(&pix1); /* Test with 8-cc */ boxa1= pixConnComp(pixs, &pixa1, 8); n1 = boxaGetCount(boxa1); boxa2= pixConnComp(pixs, NULL, 8); n2 = boxaGetCount(boxa2); pixCountConnComp(pixs, 8, &n3); fprintf(stderr, "Number of 8 c.c.: n1 = %d; n2 = %d, n3 = %d\n", n1, n2, n3); regTestCompareValues(rp, n1, n2, 0); /* 5 */ regTestCompareValues(rp, n1, n3, 0); /* 6 */ regTestCompareValues(rp, n1, 4305, 0); /* 7 */ pix1 = pixaDisplay(pixa1, pixGetWidth(pixs), pixGetHeight(pixs)); regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 8 */ regTestComparePix(rp, pixs, pix1); /* 9 */ pixaDestroy(&pixa1); boxaDestroy(&boxa1); boxaDestroy(&boxa2); pixDestroy(&pix1); /* --------------------------------------------------------------- * * Test boxa I/O * * --------------------------------------------------------------- */ lept_mkdir("lept/conn"); boxa1 = pixConnComp(pixs, NULL, 4); fp = lept_fopen("/tmp/lept/conn/boxa1.ba", "wb+"); boxaWriteStream(fp, boxa1); lept_fclose(fp); fp = lept_fopen("/tmp/lept/conn/boxa1.ba", "rb"); boxa2 = boxaReadStream(fp); lept_fclose(fp); fp = lept_fopen("/tmp/lept/conn/boxa2.ba", "wb+"); boxaWriteStream(fp, boxa2); lept_fclose(fp); array1 = l_binaryRead("/tmp/lept/conn/boxa1.ba", &size1); array2 = l_binaryRead("/tmp/lept/conn/boxa2.ba", &size2); regTestCompareStrings(rp, array1, size1, array2, size2); /* 10 */ lept_free(array1); lept_free(array2); boxaDestroy(&boxa1); boxaDestroy(&boxa2); /* --------------------------------------------------------------- * * Just for fun, display each component as a random color in * * cmapped 8 bpp. Background is color 0; it is set to white. * * --------------------------------------------------------------- */ boxa1 = pixConnComp(pixs, &pixa1, 4); pix1 = pixaDisplayRandomCmap(pixa1, pixGetWidth(pixs), pixGetHeight(pixs)); cmap = pixGetColormap(pix1); pixcmapResetColor(cmap, 0, 255, 255, 255); /* reset background to white */ regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 11 */ if (rp->display) pixDisplay(pix1, 100, 100); boxaDestroy(&boxa1); pixDestroy(&pix1); pixaDestroy(&pixa1); pixDestroy(&pixs); return regTestCleanup(rp); }
main(int argc, char **argv) { l_uint8 *array1, *array2; l_int32 i, n, np, same, diff, nbytes1, nbytes2; FILE *fp; BOX *box; BOXA *boxa, *boxa2; PIX *pixs, *pixd; PIXA *pixa; PIXCMAP *cmap; static char mainName[] = "conncomp_reg"; if (argc != 1) exit(ERROR_INT(" Syntax: conncomp_reg", mainName, 1)); if ((pixs = pixRead("feyn.tif")) == NULL) exit(ERROR_INT("pixs not made", mainName, 1)); /* Test pixConnComp() with output to both boxa and pixa */ /* First, test with 4-cc */ boxa = pixConnComp(pixs, &pixa, 4); n = boxaGetCount(boxa); fprintf(stderr, "Number of 4 c.c. b.b: %d\n", n); np = pixaGetCount(pixa); fprintf(stderr, "Number of 4 c.c. pix: %d\n", np); pixd = pixaDisplay(pixa, pixGetWidth(pixs), pixGetHeight(pixs)); pixWrite("/tmp/junkout1.png", pixd, IFF_PNG); pixEqual(pixs, pixd, &same); if (same == 1) fprintf(stderr, "Source and reconstructed pix are the same.\n"); else fprintf(stderr, "Error: source and reconstructed pix differ!\n"); pixaDestroy(&pixa); boxaDestroy(&boxa); pixDestroy(&pixd); /* Test with 8-cc */ boxa = pixConnComp(pixs, &pixa, 8); n = boxaGetCount(boxa); fprintf(stderr, "Number of 8 c.c. b.b: %d\n", n); np = pixaGetCount(pixa); fprintf(stderr, "Number of 8 c.c. pix: %d\n", np); pixd = pixaDisplay(pixa, pixGetWidth(pixs), pixGetHeight(pixs)); pixWrite("/tmp/junkout2.png", pixd, IFF_PNG); pixEqual(pixs, pixd, &same); if (same == 1) fprintf(stderr, "Source and reconstructed pix are the same.\n"); else fprintf(stderr, "Error: source and reconstructed pix differ!\n"); pixaDestroy(&pixa); boxaDestroy(&boxa); pixDestroy(&pixd); /* Test i/o */ boxa = pixConnComp(pixs, NULL, 4); fp = fopen("/tmp/junk1.ba", "wb+"); boxaWriteStream(fp, boxa); fclose(fp); fp = fopen("/tmp/junk1.ba", "r"); boxa2 = boxaReadStream(fp); fclose(fp); fp = fopen("/tmp/junk2.ba", "wb+"); boxaWriteStream(fp, boxa2); fclose(fp); array1 = arrayRead("/tmp/junk1.ba", &nbytes1); array2 = arrayRead("/tmp/junk2.ba", &nbytes2); diff = strcmp((char *)array1, (char *)array2); if (nbytes1 != nbytes2 || diff) fprintf(stderr, "I/O error for boxes.\n"); else fprintf(stderr, "I/O valid for boxes.\n"); FREE(array1); FREE(array2); boxaDestroy(&boxa); boxaDestroy(&boxa2); /* Just for fun, display each component as a random color * in cmapped 8 bpp. Background is color 0; it is set to white. */ boxa = pixConnComp(pixs, &pixa, 4); pixd = pixaDisplayRandomCmap(pixa, pixGetWidth(pixs), pixGetHeight(pixs)); cmap = pixGetColormap(pixd); pixcmapResetColor(cmap, 0, 255, 255, 255); /* reset background to white */ pixDisplay(pixd, 100, 100); boxaDestroy(&boxa); pixDestroy(&pixd); pixaDestroy(&pixa); pixDestroy(&pixs); exit(0); }