diff options
Diffstat (limited to 'leptonica/prog/findpattern1.c')
-rw-r--r-- | leptonica/prog/findpattern1.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/leptonica/prog/findpattern1.c b/leptonica/prog/findpattern1.c new file mode 100644 index 00000000..42395db7 --- /dev/null +++ b/leptonica/prog/findpattern1.c @@ -0,0 +1,145 @@ +/*====================================================================* + - Copyright (C) 2001 Leptonica. All rights reserved. + - + - Redistribution and use in source and binary forms, with or without + - modification, are permitted provided that the following conditions + - are met: + - 1. Redistributions of source code must retain the above copyright + - notice, this list of conditions and the following disclaimer. + - 2. Redistributions in binary form must reproduce the above + - copyright notice, this list of conditions and the following + - disclaimer in the documentation and/or other materials + - provided with the distribution. + - + - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY + - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *====================================================================*/ + +/* + * findpattern1.c + * + * findpattern1 filein patternfile fileout + * + * This is setup with input parameters to generate a hit-miss + * Sel from 'patternfile' and use it on 'filein' at 300 ppi. + * For example, use char.tif of a "c" bitmap, taken from the + * the page image feyn.tif: + * + * findpattern1 feyn.tif char.tif /tmp/result.tif + * + * This shows a number of different outputs, including a magnified + * image of the Sel superimposed on the "c" bitmap. + */ + +#ifdef HAVE_CONFIG_H +#include <config_auto.h> +#endif /* HAVE_CONFIG_H */ + +#include "allheaders.h" + + /* for pixGenerateSelWithRuns() */ +static const l_int32 NumHorLines = 11; +static const l_int32 NumVertLines = 8; +static const l_int32 MinRunlength = 1; + + /* for pixDisplayHitMissSel() */ +static const l_uint32 HitColor = 0xff880000; +static const l_uint32 MissColor = 0x00ff8800; + + +int main(int argc, + char **argv) +{ +char *filein, *fileout, *patternfile; +l_int32 w, h, i, n; +BOX *box, *boxe; +BOXA *boxa1, *boxa2; +PIX *pixs, *pixp, *pixpe, *pix1, *pix2, *pix3, *pix4, *pixhmt; +PIXCMAP *cmap; +SEL *sel_2h, *sel; +static char mainName[] = "findpattern1"; + + if (argc != 4) + return ERROR_INT(" Syntax: findpattern1 filein patternfile fileout", + mainName, 1); + filein = argv[1]; + patternfile = argv[2]; + fileout = argv[3]; + + setLeptDebugOK(1); + lept_mkdir("lept/hmt"); + + if ((pixs = pixRead(filein)) == NULL) + return ERROR_INT("pixs not made", mainName, 1); + if ((pixp = pixRead(patternfile)) == NULL) + return ERROR_INT("pixp not made", mainName, 1); + pixGetDimensions(pixp, &w, &h, NULL); + + /* Generate the hit-miss Sel with runs */ + sel = pixGenerateSelWithRuns(pixp, NumHorLines, NumVertLines, 0, + MinRunlength, 7, 7, 0, 0, &pixpe); + + /* Display the Sel two ways */ + selWriteStream(stderr, sel); + pix1 = pixDisplayHitMissSel(pixpe, sel, 9, HitColor, MissColor); + pixDisplay(pix1, 200, 200); + pixWrite("/tmp/lept/hmt/pix1.png", pix1, IFF_PNG); + + /* Use the Sel to find all instances in the page */ + startTimer(); + pixhmt = pixHMT(NULL, pixs, sel); + lept_stderr("Time to find patterns = %7.3f\n", stopTimer()); + + /* Small erosion to remove noise; typically not necessary if + * there are enough elements in the Sel */ + sel_2h = selCreateBrick(1, 2, 0, 0, SEL_HIT); + pix2 = pixErode(NULL, pixhmt, sel_2h); + + /* Display the result visually by placing the Sel at each + * location found */ + pix3 = pixDilate(NULL, pix2, sel); + cmap = pixcmapCreate(1); + pixcmapAddColor(cmap, 255, 255, 255); + pixcmapAddColor(cmap, 255, 0, 0); + pixSetColormap(pix3, cmap); + pixWrite(fileout, pix3, IFF_PNG); + + /* Display output with a red outline around each located pattern */ + boxa1 = pixConnCompBB(pix2, 8); + n = boxaGetCount(boxa1); + boxa2 = boxaCreate(n); + pix4 = pixConvert1To2Cmap(pixs); + for (i = 0; i < n; i++) { + box = boxaGetBox(boxa1, i, L_COPY); + boxe = boxCreate(box->x - w / 2, box->y - h / 2, w + 4, h + 4); + boxaAddBox(boxa2, boxe, L_INSERT); + pixRenderBoxArb(pix4, boxe, 2, 255, 0, 0); + boxDestroy(&box); + } + pixWrite("/tmp/lept/hmt/outline.png", pix4, IFF_PNG); + boxaWriteStream(stderr, boxa2); + + pixDestroy(&pixs); + pixDestroy(&pixp); + pixDestroy(&pixpe); + pixDestroy(&pix1); + pixDestroy(&pix2); + pixDestroy(&pix3); + pixDestroy(&pix4); + pixDestroy(&pixhmt); + selDestroy(&sel); + selDestroy(&sel_2h); + boxaDestroy(&boxa1); + boxaDestroy(&boxa2); + return 0; +} + |