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);
595 return (
L_DEWARPA *)ERROR_PTR(
"redfactor not in {1,2}",
599 }
else if (
sampling < MinArraySampling) {
600 L_WARNING(
"sampling too small; setting to %d\n", procName,
606 }
else if (
minlines < MinMinLines) {
607 L_WARNING(
"minlines too small; setting to %d\n", procName,
612 maxdist = DefaultMaxRefDist;
619 return (
L_DEWARPA *)ERROR_PTR(
"dewarp ptrs not made", procName, NULL);
680 PROCNAME(
"dewarpaCreateFromPixacomp");
683 return (
L_DEWARPA *)ERROR_PTR(
"pixac not defined", procName, 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)
774 PROCNAME(
"dewarpaDestroyDewarp");
777 return ERROR_INT(
"dewa or dew not defined", procName, 1);
779 return ERROR_INT(
"page out of bounds", procName, 1);
781 return ERROR_INT(
"dew not defined", procName, 1);
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);
842 return ERROR_INT(
"extension failed", procName, 1);
882 PROCNAME(
"dewarpaExtendArraysToSize");
885 return ERROR_INT(
"dewa not defined", procName, 1);
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);
919 L_ERROR(
"index = %d is invalid; max index = %d\n",
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);
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",
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",
1212 return (
L_DEWARP *)ERROR_PTR(
"read fail for mincurv & maxcurv",
1216 if (fscanf(fp,
"left edge slope = %d, right edge slope = %d\n",
1218 return (
L_DEWARP *)ERROR_PTR(
"read fail for leftslope & rightslope",
1220 if (fscanf(fp,
"left edge curvature = %d, right edge curvature = %d\n",
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;
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",
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);
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",
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);
struct FPix * sampvdispar
struct L_Dewarp ** dewarp
struct L_Dewarp ** dewarpcache
struct FPix * samphdispar
l_ok dewarpaDestroyDewarp(L_DEWARPA *dewa, l_int32 pageno)
dewarpaDestroyDewarp()
PIX * pixacompGetPix(PIXAC *pixac, l_int32 index)
pixacompGetPix()
l_int32 max_diff_linecurv
l_int32 pixacompGetOffset(PIXAC *pixac)
pixacompGetOffset()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_ok dewarpaWriteStream(FILE *fp, L_DEWARPA *dewa)
dewarpaWriteStream()
L_DEWARP * dewarpCreate(PIX *pixs, l_int32 pageno)
dewarpCreate()
l_int32 max_diff_edgecurv
l_ok fpixWriteStream(FILE *fp, FPIX *fpix)
fpixWriteStream()
static l_int32 dewarpaExtendArraysToSize(L_DEWARPA *dewa, l_int32 size)
dewarpaExtendArraysToSize()
FILE * fopenReadFromMemory(const l_uint8 *data, size_t size)
fopenReadFromMemory()
void dewarpDestroy(L_DEWARP **pdew)
dewarpDestroy()
l_ok dewarpWriteMem(l_uint8 **pdata, size_t *psize, L_DEWARP *dew)
dewarpWriteMem()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_ok dewarpaWrite(const char *filename, L_DEWARPA *dewa)
dewarpaWrite()
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()
void dewarpaDestroy(L_DEWARPA **pdewa)
dewarpaDestroy()
l_ok dewarpaSetMaxDistance(L_DEWARPA *dewa, l_int32 maxdist)
dewarpaSetMaxDistance()
l_ok dewarpBuildPageModel(L_DEWARP *dew, const char *debugfile)
dewarpBuildPageModel()
l_ok dewarpaListPages(L_DEWARPA *dewa)
dewarpaListPages()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
#define DEWARP_VERSION_NUMBER
l_int32 min_diff_linecurv
l_int32 numaGetCount(NUMA *na)
numaGetCount()
struct FPix * fullydispar
l_ok dewarpMinimize(L_DEWARP *dew)
dewarpMinimize()
l_ok dewarpaWriteMem(l_uint8 **pdata, size_t *psize, L_DEWARPA *dewa)
dewarpaWriteMem()
L_DEWARPA * dewarpaReadMem(const l_uint8 *data, size_t size)
dewarpaReadMem()
void * reallocNew(void **pindata, size_t oldsize, size_t newsize)
reallocNew()
L_DEWARPA * dewarpaRead(const char *filename)
dewarpaRead()
L_DEWARPA * dewarpaCreate(l_int32 nptrs, l_int32 sampling, l_int32 redfactor, l_int32 minlines, l_int32 maxdist)
dewarpaCreate()
PIX * pixClone(PIX *pixs)
pixClone()
l_ok dewarpWriteStream(FILE *fp, L_DEWARP *dew)
dewarpWriteStream()
L_DEWARPA * dewarpaReadStream(FILE *fp)
dewarpaReadStream()
void pixDestroy(PIX **ppix)
pixDestroy()
struct FPix * sampydispar
L_DEWARP * dewarpReadStream(FILE *fp)
dewarpReadStream()
void numaDestroy(NUMA **pna)
numaDestroy()
L_DEWARP * dewarpRead(const char *filename)
dewarpRead()
FILE * fopenWriteStream(const char *filename, const char *modestring)
fopenWriteStream()
FILE * fopenWriteWinTempfile(void)
fopenWriteWinTempfile()
FILE * fopenReadStream(const char *filename)
fopenReadStream()
l_uint8 * l_binaryReadStream(FILE *fp, size_t *pnbytes)
l_binaryReadStream()
l_ok dewarpaUseBothArrays(L_DEWARPA *dewa, l_int32 useboth)
dewarpaUseBothArrays()
L_DEWARPA * dewarpaCreateFromPixacomp(PIXAC *pixac, l_int32 useboth, l_int32 sampling, l_int32 minlines, l_int32 maxdist)
dewarpaCreateFromPixacomp()
l_ok dewarpaInsertDewarp(L_DEWARPA *dewa, L_DEWARP *dew)
dewarpaInsertDewarp()
L_DEWARP * dewarpReadMem(const l_uint8 *data, size_t size)
dewarpReadMem()
struct FPix * fullvdispar
l_ok dewarpWrite(const char *filename, L_DEWARP *dew)
dewarpWrite()
l_ok dewarpaSetCheckColumns(L_DEWARPA *dewa, l_int32 check_columns)
dewarpaSetCheckColumns()
l_int32 pixacompGetCount(PIXAC *pixac)
pixacompGetCount()
struct FPix * fullhdispar
FPIX * fpixReadStream(FILE *fp)
fpixReadStream()
void fpixDestroy(FPIX **pfpix)
fpixDestroy()
l_ok dewarpaInsertRefModels(L_DEWARPA *dewa, l_int32 notests, l_int32 debug)
dewarpaInsertRefModels()
L_DEWARP * dewarpCreateRef(l_int32 pageno, l_int32 refpage)
dewarpCreateRef()
L_DEWARP * dewarpaGetDewarp(L_DEWARPA *dewa, l_int32 index)
dewarpaGetDewarp()