413 #include <config_auto.h>
417 #include "allheaders.h"
422 static const l_int32 InitialPtrArraySize = 20;
423 static const l_int32 MaxPtrArraySize = 10000;
424 static const l_int32 DefaultArraySampling = 30;
425 static const l_int32 MinArraySampling = 8;
426 static const l_int32 DefaultMinLines = 15;
427 static const l_int32 MinMinLines = 4;
428 static const l_int32 DefaultMaxRefDist = 16;
429 static const l_int32 DefaultUseBoth = TRUE;
430 static const l_int32 DefaultCheckColumns = TRUE;
433 static const l_int32 DefaultMaxLineCurv = 150;
434 static const l_int32 DefaultMinDiffLineCurv = 0;
435 static const l_int32 DefaultMaxDiffLineCurv = 170;
436 static const l_int32 DefaultMaxEdgeCurv = 50;
437 static const l_int32 DefaultMaxDiffEdgeCurv = 40;
438 static const l_int32 DefaultMaxEdgeSlope = 80;
464 PROCNAME(
"dewarpCreate");
467 return (
L_DEWARP *)ERROR_PTR(
"pixs not defined", procName, NULL);
468 if (pixGetDepth(pixs) != 1)
469 return (
L_DEWARP *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
474 dew->
w = pixGetWidth(pixs);
475 dew->
h = pixGetHeight(pixs);
522 PROCNAME(
"dewarpDestroy");
525 L_WARNING(
"ptr address is null!\n", procName);
528 if ((dew = *pdew) == NULL)
588 PROCNAME(
"dewarpaCreate");
591 nptrs = InitialPtrArraySize;
592 if (nptrs > MaxPtrArraySize)
593 return (
L_DEWARPA *)ERROR_PTR(
"too many pages", procName, NULL);
594 if (redfactor != 1 && redfactor != 2)
595 return (
L_DEWARPA *)ERROR_PTR(
"redfactor not in {1,2}",
598 sampling = DefaultArraySampling;
599 }
else if (sampling < MinArraySampling) {
600 L_WARNING(
"sampling too small; setting to %d\n", procName,
602 sampling = MinArraySampling;
605 minlines = DefaultMinLines;
606 }
else if (minlines < MinMinLines) {
607 L_WARNING(
"minlines too small; setting to %d\n", procName,
609 minlines = DefaultMinLines;
612 maxdist = DefaultMaxRefDist;
619 return (
L_DEWARPA *)ERROR_PTR(
"dewarp ptrs not made", procName, NULL);
633 dewa->
useboth = DefaultUseBoth;
675 l_int32 i, nptrs, pageno;
680 PROCNAME(
"dewarpaCreateFromPixacomp");
683 return (
L_DEWARPA *)ERROR_PTR(
"pixac not defined", procName, NULL);
687 sampling, 1, minlines, maxdist)) == NULL)
688 return (
L_DEWARPA *)ERROR_PTR(
"dewa not made", procName, NULL);
691 for (i = 0; i < nptrs; i++) {
694 if (pixt && (pixGetWidth(pixt) > 1)) {
698 ERROR_INT(
"unable to make dew!", procName, 1);
709 L_ERROR(
"unable to build model for page %d\n", procName, i);
736 PROCNAME(
"dewarpaDestroy");
739 L_WARNING(
"ptr address is null!\n", procName);
742 if ((dewa = *pdewa) == NULL)
745 for (i = 0; i < dewa->
nalloc; i++) {
746 if ((dew = dewa->
dewarp[i]) != NULL)
774 PROCNAME(
"dewarpaDestroyDewarp");
777 return ERROR_INT(
"dewa or dew not defined", procName, 1);
778 if (pageno < 0 || pageno > dewa->
maxpage)
779 return ERROR_INT(
"page out of bounds", procName, 1);
780 if ((dew = dewa->
dewarp[pageno]) == NULL)
781 return ERROR_INT(
"dew not defined", procName, 1);
784 dewa->
dewarp[pageno] = NULL;
815 l_int32 pageno, n, newsize;
818 PROCNAME(
"dewarpaInsertDewarp");
821 return ERROR_INT(
"dewa not defined", procName, 1);
823 return ERROR_INT(
"dew not defined", procName, 1);
827 if (pageno > MaxPtrArraySize)
828 return ERROR_INT(
"too many pages", procName, 1);
837 newsize = 2 * pageno;
838 else if (pageno >= n)
842 return ERROR_INT(
"extension failed", procName, 1);
847 dewa->
dewarp[pageno] = dew;
882 PROCNAME(
"dewarpaExtendArraysToSize");
885 return ERROR_INT(
"dewa not defined", procName, 1);
887 if (size > dewa->
nalloc) {
890 size *
sizeof(
L_DEWARP *))) == NULL)
891 return ERROR_INT(
"new ptr array not returned", procName, 1);
895 size *
sizeof(
L_DEWARP *))) == NULL)
896 return ERROR_INT(
"new ptr cache array not returned", procName, 1);
914 PROCNAME(
"dewarpaGetDewarp");
917 return (
L_DEWARP *)ERROR_PTR(
"dewa not defined", procName, NULL);
918 if (index < 0 || index > dewa->
maxpage) {
919 L_ERROR(
"index = %d is invalid; max index = %d\n",
920 procName, index, dewa->
maxpage);
924 return dewa->
dewarp[index];
981 l_int32 max_linecurv,
982 l_int32 min_diff_linecurv,
983 l_int32 max_diff_linecurv,
984 l_int32 max_edgecurv,
985 l_int32 max_diff_edgecurv,
986 l_int32 max_edgeslope)
988 PROCNAME(
"dewarpaSetCurvatures");
991 return ERROR_INT(
"dewa not defined", procName, 1);
993 if (max_linecurv == -1)
998 if (min_diff_linecurv == -1)
1003 if (max_diff_linecurv == -1)
1008 if (max_edgecurv == -1)
1013 if (max_diff_edgecurv == -1)
1018 if (max_edgeslope == -1)
1047 PROCNAME(
"dewarpaUseBothArrays");
1050 return ERROR_INT(
"dewa not defined", procName, 1);
1084 l_int32 check_columns)
1086 PROCNAME(
"dewarpaSetCheckColumns");
1089 return ERROR_INT(
"dewa not defined", procName, 1);
1112 PROCNAME(
"dewarpaSetMaxDistance");
1115 return ERROR_INT(
"dewa not defined", procName, 1);
1138 PROCNAME(
"dewarpRead");
1141 return (
L_DEWARP *)ERROR_PTR(
"filename not defined", procName, NULL);
1143 return (
L_DEWARP *)ERROR_PTR(
"stream not opened", procName, NULL);
1147 return (
L_DEWARP *)ERROR_PTR(
"dew not read", procName, NULL);
1175 l_int32 version, sampling, redfactor, minlines, pageno, hasref, refpage;
1176 l_int32 w, h, nx, ny, vdispar, hdispar, nlines;
1177 l_int32 mincurv, maxcurv, leftslope, rightslope, leftcurv, rightcurv;
1179 FPIX *fpixv, *fpixh;
1181 PROCNAME(
"dewarpReadStream");
1184 return (
L_DEWARP *)ERROR_PTR(
"stream not defined", procName, NULL);
1186 if (fscanf(fp,
"\nDewarp Version %d\n", &version) != 1)
1187 return (
L_DEWARP *)ERROR_PTR(
"not a dewarp file", procName, NULL);
1189 return (
L_DEWARP *)ERROR_PTR(
"invalid dewarp version", procName, NULL);
1190 if (fscanf(fp,
"pageno = %d\n", &pageno) != 1)
1191 return (
L_DEWARP *)ERROR_PTR(
"read fail for pageno", procName, NULL);
1192 if (fscanf(fp,
"hasref = %d, refpage = %d\n", &hasref, &refpage) != 2)
1193 return (
L_DEWARP *)ERROR_PTR(
"read fail for hasref, refpage",
1195 if (fscanf(fp,
"sampling = %d, redfactor = %d\n", &sampling, &redfactor)
1197 return (
L_DEWARP *)ERROR_PTR(
"read fail for sampling/redfactor",
1199 if (fscanf(fp,
"nlines = %d, minlines = %d\n", &nlines, &minlines) != 2)
1200 return (
L_DEWARP *)ERROR_PTR(
"read fail for nlines/minlines",
1202 if (fscanf(fp,
"w = %d, h = %d\n", &w, &h) != 2)
1203 return (
L_DEWARP *)ERROR_PTR(
"read fail for w, h", procName, NULL);
1204 if (fscanf(fp,
"nx = %d, ny = %d\n", &nx, &ny) != 2)
1205 return (
L_DEWARP *)ERROR_PTR(
"read fail for nx, ny", procName, NULL);
1206 if (fscanf(fp,
"vert_dispar = %d, horiz_dispar = %d\n", &vdispar, &hdispar)
1208 return (
L_DEWARP *)ERROR_PTR(
"read fail for flags", procName, NULL);
1210 if (fscanf(fp,
"min line curvature = %d, max line curvature = %d\n",
1211 &mincurv, &maxcurv) != 2)
1212 return (
L_DEWARP *)ERROR_PTR(
"read fail for mincurv & maxcurv",
1216 if (fscanf(fp,
"left edge slope = %d, right edge slope = %d\n",
1217 &leftslope, &rightslope) != 2)
1218 return (
L_DEWARP *)ERROR_PTR(
"read fail for leftslope & rightslope",
1220 if (fscanf(fp,
"left edge curvature = %d, right edge curvature = %d\n",
1221 &leftcurv, &rightcurv) != 2)
1222 return (
L_DEWARP *)ERROR_PTR(
"read fail for leftcurv & rightcurv",
1227 return (
L_DEWARP *)ERROR_PTR(
"read fail for vdispar",
1232 return (
L_DEWARP *)ERROR_PTR(
"read fail for hdispar",
1284 PROCNAME(
"dewarpReadMem");
1287 return (
L_DEWARP *)ERROR_PTR(
"data not defined", procName, NULL);
1289 return (
L_DEWARP *)ERROR_PTR(
"stream not opened", procName, NULL);
1293 if (!dew) L_ERROR(
"dew not read\n", procName);
1312 PROCNAME(
"dewarpWrite");
1315 return ERROR_INT(
"filename not defined", procName, 1);
1317 return ERROR_INT(
"dew not defined", procName, 1);
1320 return ERROR_INT(
"stream not opened", procName, 1);
1324 return ERROR_INT(
"dew not written to stream", procName, 1);
1347 l_int32 vdispar, hdispar;
1349 PROCNAME(
"dewarpWriteStream");
1352 return ERROR_INT(
"stream not defined", procName, 1);
1354 return ERROR_INT(
"dew not defined", procName, 1);
1357 fprintf(fp,
"pageno = %d\n", dew->
pageno);
1358 fprintf(fp,
"hasref = %d, refpage = %d\n", dew->
hasref, dew->
refpage);
1359 fprintf(fp,
"sampling = %d, redfactor = %d\n",
1361 fprintf(fp,
"nlines = %d, minlines = %d\n", dew->
nlines, dew->
minlines);
1362 fprintf(fp,
"w = %d, h = %d\n", dew->
w, dew->
h);
1363 fprintf(fp,
"nx = %d, ny = %d\n", dew->
nx, dew->
ny);
1366 fprintf(fp,
"vert_dispar = %d, horiz_dispar = %d\n", vdispar, hdispar);
1368 fprintf(fp,
"min line curvature = %d, max line curvature = %d\n",
1371 fprintf(fp,
"left edge slope = %d, right edge slope = %d\n",
1373 fprintf(fp,
"left edge curvature = %d, right edge curvature = %d\n",
1381 L_WARNING(
"no disparity arrays!\n", procName);
1407 PROCNAME(
"dewarpWriteMem");
1409 if (pdata) *pdata = NULL;
1410 if (psize) *psize = 0;
1412 return ERROR_INT(
"&data not defined", procName, 1);
1414 return ERROR_INT(
"&size not defined", procName, 1);
1416 return ERROR_INT(
"dew not defined", procName, 1);
1419 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1420 return ERROR_INT(
"stream not opened", procName, 1);
1424 *psize = *psize - 1;
1426 L_INFO(
"work-around: writing to a temp file\n", procName);
1429 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
1431 if ((fp = tmpfile()) == NULL)
1432 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
1458 PROCNAME(
"dewarpaRead");
1461 return (
L_DEWARPA *)ERROR_PTR(
"filename not defined", procName, NULL);
1463 return (
L_DEWARPA *)ERROR_PTR(
"stream not opened", procName, NULL);
1467 return (
L_DEWARPA *)ERROR_PTR(
"dewa not read", procName, NULL);
1492 l_int32 i, version, ndewarp, maxpage;
1493 l_int32 sampling, redfactor, minlines, maxdist, useboth;
1494 l_int32 max_linecurv, min_diff_linecurv, max_diff_linecurv;
1495 l_int32 max_edgeslope, max_edgecurv, max_diff_edgecurv;
1500 PROCNAME(
"dewarpaReadStream");
1503 return (
L_DEWARPA *)ERROR_PTR(
"stream not defined", procName, NULL);
1505 if (fscanf(fp,
"\nDewarpa Version %d\n", &version) != 1)
1506 return (
L_DEWARPA *)ERROR_PTR(
"not a dewarpa file", procName, NULL);
1508 return (
L_DEWARPA *)ERROR_PTR(
"invalid dewarp version", procName, NULL);
1510 if (fscanf(fp,
"ndewarp = %d, maxpage = %d\n", &ndewarp, &maxpage) != 2)
1511 return (
L_DEWARPA *)ERROR_PTR(
"read fail for maxpage+", procName, NULL);
1513 return (
L_DEWARPA *)ERROR_PTR(
"pages not >= 1", procName, NULL);
1514 if (ndewarp > MaxPtrArraySize)
1515 return (
L_DEWARPA *)ERROR_PTR(
"too many pages", procName, NULL);
1517 "sampling = %d, redfactor = %d, minlines = %d, maxdist = %d\n",
1518 &sampling, &redfactor, &minlines, &maxdist) != 4)
1519 return (
L_DEWARPA *)ERROR_PTR(
"read fail for 4 params", procName, NULL);
1521 "max_linecurv = %d, min_diff_linecurv = %d, max_diff_linecurv = %d\n",
1522 &max_linecurv, &min_diff_linecurv, &max_diff_linecurv) != 3)
1523 return (
L_DEWARPA *)ERROR_PTR(
"read fail for linecurv", procName, NULL);
1525 "max_edgeslope = %d, max_edgecurv = %d, max_diff_edgecurv = %d\n",
1526 &max_edgeslope, &max_edgecurv, &max_diff_edgecurv) != 3)
1527 return (
L_DEWARPA *)ERROR_PTR(
"read fail for edgecurv", procName, NULL);
1528 if (fscanf(fp,
"fullmodel = %d\n", &useboth) != 1)
1529 return (
L_DEWARPA *)ERROR_PTR(
"read fail for useboth", procName, NULL);
1531 dewa =
dewarpaCreate(maxpage + 1, sampling, redfactor, minlines, maxdist);
1542 for (i = 0; i < ndewarp; i++) {
1544 L_ERROR(
"read fail for dew[%d]\n", procName, i);
1572 PROCNAME(
"dewarpaReadMem");
1575 return (
L_DEWARPA *)ERROR_PTR(
"data not defined", procName, NULL);
1577 return (
L_DEWARPA *)ERROR_PTR(
"stream not opened", procName, NULL);
1581 if (!dewa) L_ERROR(
"dewa not read\n", procName);
1600 PROCNAME(
"dewarpaWrite");
1603 return ERROR_INT(
"filename not defined", procName, 1);
1605 return ERROR_INT(
"dewa not defined", procName, 1);
1608 return ERROR_INT(
"stream not opened", procName, 1);
1612 return ERROR_INT(
"dewa not written to stream", procName, 1);
1628 l_int32 ndewarp, i, pageno;
1630 PROCNAME(
"dewarpaWriteStream");
1633 return ERROR_INT(
"stream not defined", procName, 1);
1635 return ERROR_INT(
"dewa not defined", procName, 1);
1644 return ERROR_INT(
"dewa->namodels not made", procName, 1);
1648 fprintf(fp,
"ndewarp = %d, maxpage = %d\n", ndewarp, dewa->
maxpage);
1649 fprintf(fp,
"sampling = %d, redfactor = %d, minlines = %d, maxdist = %d\n",
1652 "max_linecurv = %d, min_diff_linecurv = %d, max_diff_linecurv = %d\n",
1655 "max_edgeslope = %d, max_edgecurv = %d, max_diff_edgecurv = %d\n",
1657 fprintf(fp,
"fullmodel = %d\n", dewa->
useboth);
1658 for (i = 0; i < ndewarp; i++) {
1688 PROCNAME(
"dewarpaWriteMem");
1690 if (pdata) *pdata = NULL;
1691 if (psize) *psize = 0;
1693 return ERROR_INT(
"&data not defined", procName, 1);
1695 return ERROR_INT(
"&size not defined", procName, 1);
1697 return ERROR_INT(
"dewa not defined", procName, 1);
1700 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1701 return ERROR_INT(
"stream not opened", procName, 1);
1705 *psize = *psize - 1;
1707 L_INFO(
"work-around: writing to a temp file\n", procName);
1710 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
1712 if ((fp = tmpfile()) == NULL)
1713 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
L_DEWARPA * dewarpaRead(const char *filename)
dewarpaRead()
L_DEWARPA * dewarpaReadStream(FILE *fp)
dewarpaReadStream()
l_ok dewarpaUseBothArrays(L_DEWARPA *dewa, l_int32 useboth)
dewarpaUseBothArrays()
l_ok dewarpaSetMaxDistance(L_DEWARPA *dewa, l_int32 maxdist)
dewarpaSetMaxDistance()
L_DEWARP * dewarpCreateRef(l_int32 pageno, l_int32 refpage)
dewarpCreateRef()
void dewarpaDestroy(L_DEWARPA **pdewa)
dewarpaDestroy()
static l_int32 dewarpaExtendArraysToSize(L_DEWARPA *dewa, l_int32 size)
dewarpaExtendArraysToSize()
l_ok dewarpWriteStream(FILE *fp, L_DEWARP *dew)
dewarpWriteStream()
l_ok dewarpaDestroyDewarp(L_DEWARPA *dewa, l_int32 pageno)
dewarpaDestroyDewarp()
l_ok dewarpaInsertDewarp(L_DEWARPA *dewa, L_DEWARP *dew)
dewarpaInsertDewarp()
void dewarpDestroy(L_DEWARP **pdew)
dewarpDestroy()
l_ok dewarpWrite(const char *filename, L_DEWARP *dew)
dewarpWrite()
L_DEWARP * dewarpReadStream(FILE *fp)
dewarpReadStream()
L_DEWARPA * dewarpaCreateFromPixacomp(PIXAC *pixac, l_int32 useboth, l_int32 sampling, l_int32 minlines, l_int32 maxdist)
dewarpaCreateFromPixacomp()
l_ok dewarpaSetCheckColumns(L_DEWARPA *dewa, l_int32 check_columns)
dewarpaSetCheckColumns()
L_DEWARPA * dewarpaReadMem(const l_uint8 *data, size_t size)
dewarpaReadMem()
l_ok dewarpaWriteStream(FILE *fp, L_DEWARPA *dewa)
dewarpaWriteStream()
l_ok dewarpWriteMem(l_uint8 **pdata, size_t *psize, L_DEWARP *dew)
dewarpWriteMem()
L_DEWARP * dewarpaGetDewarp(L_DEWARPA *dewa, l_int32 index)
dewarpaGetDewarp()
L_DEWARPA * dewarpaCreate(l_int32 nptrs, l_int32 sampling, l_int32 redfactor, l_int32 minlines, l_int32 maxdist)
dewarpaCreate()
L_DEWARP * dewarpCreate(PIX *pixs, l_int32 pageno)
dewarpCreate()
l_ok dewarpaWrite(const char *filename, L_DEWARPA *dewa)
dewarpaWrite()
L_DEWARP * dewarpReadMem(const l_uint8 *data, size_t size)
dewarpReadMem()
l_ok dewarpaWriteMem(l_uint8 **pdata, size_t *psize, L_DEWARPA *dewa)
dewarpaWriteMem()
l_ok dewarpaSetCurvatures(L_DEWARPA *dewa, l_int32 max_linecurv, l_int32 min_diff_linecurv, l_int32 max_diff_linecurv, l_int32 max_edgecurv, l_int32 max_diff_edgecurv, l_int32 max_edgeslope)
dewarpaSetCurvatures()
L_DEWARP * dewarpRead(const char *filename)
dewarpRead()
l_ok dewarpBuildPageModel(L_DEWARP *dew, const char *debugfile)
dewarpBuildPageModel()
l_ok dewarpMinimize(L_DEWARP *dew)
dewarpMinimize()
l_ok dewarpaListPages(L_DEWARPA *dewa)
dewarpaListPages()
l_ok dewarpaInsertRefModels(L_DEWARPA *dewa, l_int32 notests, l_int32 debug)
dewarpaInsertRefModels()
#define DEWARP_VERSION_NUMBER
l_ok fpixWriteStream(FILE *fp, FPIX *fpix)
fpixWriteStream()
void fpixDestroy(FPIX **pfpix)
fpixDestroy()
FPIX * fpixReadStream(FILE *fp)
fpixReadStream()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
NUMA * numaCreate(l_int32 n)
numaCreate()
void numaDestroy(NUMA **pna)
numaDestroy()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
void pixDestroy(PIX **ppix)
pixDestroy()
PIX * pixClone(PIX *pixs)
pixClone()
l_int32 pixacompGetOffset(PIXAC *pixac)
pixacompGetOffset()
l_int32 pixacompGetCount(PIXAC *pixac)
pixacompGetCount()
PIX * pixacompGetPix(PIXAC *pixac, l_int32 index)
pixacompGetPix()
struct FPix * fullvdispar
struct FPix * fullydispar
struct FPix * fullhdispar
struct FPix * sampydispar
struct FPix * sampvdispar
struct FPix * samphdispar
l_int32 min_diff_linecurv
struct L_Dewarp ** dewarp
l_int32 max_diff_linecurv
struct L_Dewarp ** dewarpcache
l_int32 max_diff_edgecurv
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()
void * reallocNew(void **pindata, size_t oldsize, size_t newsize)
reallocNew()
FILE * fopenWriteWinTempfile(void)
fopenWriteWinTempfile()
FILE * fopenReadStream(const char *filename)
fopenReadStream()