403 #include "allheaders.h" 408 static const l_int32 INITIAL_PTR_ARRAYSIZE = 20;
409 static const l_int32 MAX_PTR_ARRAYSIZE = 10000;
410 static const l_int32 DEFAULT_ARRAY_SAMPLING = 30;
411 static const l_int32 MIN_ARRAY_SAMPLING = 8;
412 static const l_int32 DEFAULT_MIN_LINES = 15;
413 static const l_int32 MIN_MIN_LINES = 4;
414 static const l_int32 DEFAULT_MAX_REF_DIST = 16;
415 static const l_int32 DEFAULT_USE_BOTH = TRUE;
416 static const l_int32 DEFAULT_CHECK_COLUMNS = FALSE;
419 static const l_int32 DEFAULT_MAX_LINECURV = 180;
420 static const l_int32 DEFAULT_MIN_DIFF_LINECURV = 0;
421 static const l_int32 DEFAULT_MAX_DIFF_LINECURV = 200;
422 static const l_int32 DEFAULT_MAX_EDGECURV = 50;
423 static const l_int32 DEFAULT_MAX_DIFF_EDGECURV = 40;
424 static const l_int32 DEFAULT_MAX_EDGESLOPE = 80;
451 PROCNAME(
"dewarpCreate");
454 return (
L_DEWARP *)ERROR_PTR(
"pixs not defined", procName, NULL);
455 if (pixGetDepth(
pixs) != 1)
456 return (
L_DEWARP *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
459 return (
L_DEWARP *)ERROR_PTR(
"dew not made", procName, NULL);
462 dew->
w = pixGetWidth(
pixs);
463 dew->
h = pixGetHeight(
pixs);
491 PROCNAME(
"dewarpCreateRef");
494 return (
L_DEWARP *)ERROR_PTR(
"dew not made", procName, NULL);
513 PROCNAME(
"dewarpDestroy");
516 L_WARNING(
"ptr address is null!\n", procName);
519 if ((dew = *pdew) == NULL)
580 PROCNAME(
"dewarpaCreate");
583 nptrs = INITIAL_PTR_ARRAYSIZE;
584 if (nptrs > MAX_PTR_ARRAYSIZE)
585 return (
L_DEWARPA *)ERROR_PTR(
"too many pages", procName, NULL);
587 return (
L_DEWARPA *)ERROR_PTR(
"redfactor not in {1,2}",
591 }
else if (
sampling < MIN_ARRAY_SAMPLING) {
592 L_WARNING(
"sampling too small; setting to %d\n", procName,
598 }
else if (
minlines < MIN_MIN_LINES) {
599 L_WARNING(
"minlines too small; setting to %d\n", procName,
604 maxdist = DEFAULT_MAX_REF_DIST;
611 return (
L_DEWARPA *)ERROR_PTR(
"dewarp ptrs not made", procName, NULL);
672 PROCNAME(
"dewarpaCreateFromPixacomp");
675 return (
L_DEWARPA *)ERROR_PTR(
"pixac not defined", procName, NULL);
680 return (
L_DEWARPA *)ERROR_PTR(
"dewa not made", procName, NULL);
683 for (i = 0; i < nptrs; i++) {
686 if (pixt && (pixGetWidth(pixt) > 1)) {
690 ERROR_INT(
"unable to make dew!", procName, 1);
701 L_ERROR(
"unable to build model for page %d\n", procName, i);
728 PROCNAME(
"dewarpaDestroy");
731 L_WARNING(
"ptr address is null!\n", procName);
734 if ((
dewa = *pdewa) == NULL)
767 PROCNAME(
"dewarpaDestroyDewarp");
770 return ERROR_INT(
"dewa or dew not defined", procName, 1);
772 return ERROR_INT(
"page out of bounds", procName, 1);
774 return ERROR_INT(
"dew not defined", procName, 1);
808 l_int32
pageno, n, newsize;
811 PROCNAME(
"dewarpaInsertDewarp");
814 return ERROR_INT(
"dewa not defined", procName, 1);
816 return ERROR_INT(
"dew not defined", procName, 1);
820 if (
pageno > MAX_PTR_ARRAYSIZE)
821 return ERROR_INT(
"too many pages", procName, 1);
873 PROCNAME(
"dewarpaExtendArraysToSize");
876 return ERROR_INT(
"dewa not defined", procName, 1);
881 size *
sizeof(
L_DEWARP *))) == NULL)
882 return ERROR_INT(
"new ptr array not returned", procName, 1);
886 size *
sizeof(
L_DEWARP *))) == NULL)
887 return ERROR_INT(
"new ptr cache array not returned", procName, 1);
905 PROCNAME(
"dewarpaGetDewarp");
908 return (
L_DEWARP *)ERROR_PTR(
"dewa not defined", procName, NULL);
910 L_ERROR(
"index = %d is invalid; max index = %d\n",
967 l_int32 max_linecurv,
968 l_int32 min_diff_linecurv,
969 l_int32 max_diff_linecurv,
970 l_int32 max_edgecurv,
971 l_int32 max_diff_edgecurv,
972 l_int32 max_edgeslope)
974 PROCNAME(
"dewarpaSetCurvatures");
977 return ERROR_INT(
"dewa not defined", procName, 1);
979 if (max_linecurv == -1)
984 if (min_diff_linecurv == -1)
989 if (max_diff_linecurv == -1)
994 if (max_edgecurv == -1)
999 if (max_diff_edgecurv == -1)
1004 if (max_edgeslope == -1)
1033 PROCNAME(
"dewarpaUseBothArrays");
1036 return ERROR_INT(
"dewa not defined", procName, 1);
1069 l_int32 check_columns)
1071 PROCNAME(
"dewarpaSetCheckColumns");
1074 return ERROR_INT(
"dewa not defined", procName, 1);
1097 PROCNAME(
"dewarpaSetMaxDistance");
1100 return ERROR_INT(
"dewa not defined", procName, 1);
1123 PROCNAME(
"dewarpRead");
1126 return (
L_DEWARP *)ERROR_PTR(
"filename not defined", procName, NULL);
1128 return (
L_DEWARP *)ERROR_PTR(
"stream not opened", procName, NULL);
1132 return (
L_DEWARP *)ERROR_PTR(
"dew not read", procName, NULL);
1164 FPIX *fpixv, *fpixh;
1166 PROCNAME(
"dewarpReadStream");
1169 return (
L_DEWARP *)ERROR_PTR(
"stream not defined", procName, NULL);
1171 if (fscanf(fp,
"\nDewarp Version %d\n", &version) != 1)
1172 return (
L_DEWARP *)ERROR_PTR(
"not a dewarp file", procName, NULL);
1174 return (
L_DEWARP *)ERROR_PTR(
"invalid dewarp version", procName, NULL);
1175 if (fscanf(fp,
"pageno = %d\n", &
pageno) != 1)
1176 return (
L_DEWARP *)ERROR_PTR(
"read fail for pageno", procName, NULL);
1177 if (fscanf(fp,
"hasref = %d, refpage = %d\n", &
hasref, &
refpage) != 2)
1178 return (
L_DEWARP *)ERROR_PTR(
"read fail for hasref, refpage",
1182 return (
L_DEWARP *)ERROR_PTR(
"read fail for sampling/redfactor",
1184 if (fscanf(fp,
"nlines = %d, minlines = %d\n", &
nlines, &
minlines) != 2)
1185 return (
L_DEWARP *)ERROR_PTR(
"read fail for nlines/minlines",
1187 if (fscanf(fp,
"w = %d, h = %d\n", &
w, &
h) != 2)
1188 return (
L_DEWARP *)ERROR_PTR(
"read fail for w, h", procName, NULL);
1189 if (fscanf(fp,
"nx = %d, ny = %d\n", &
nx, &
ny) != 2)
1190 return (
L_DEWARP *)ERROR_PTR(
"read fail for nx, ny", procName, NULL);
1191 if (fscanf(fp,
"vert_dispar = %d, horiz_dispar = %d\n", &vdispar, &hdispar)
1193 return (
L_DEWARP *)ERROR_PTR(
"read fail for flags", procName, NULL);
1195 if (fscanf(fp,
"min line curvature = %d, max line curvature = %d\n",
1197 return (
L_DEWARP *)ERROR_PTR(
"read fail for mincurv & maxcurv",
1201 if (fscanf(fp,
"left edge slope = %d, right edge slope = %d\n",
1203 return (
L_DEWARP *)ERROR_PTR(
"read fail for leftslope & rightslope",
1205 if (fscanf(fp,
"left edge curvature = %d, right edge curvature = %d\n",
1207 return (
L_DEWARP *)ERROR_PTR(
"read fail for leftcurv & rightcurv",
1212 return (
L_DEWARP *)ERROR_PTR(
"read fail for vdispar",
1217 return (
L_DEWARP *)ERROR_PTR(
"read fail for hdispar",
1269 PROCNAME(
"dewarpReadMem");
1272 return (
L_DEWARP *)ERROR_PTR(
"data not defined", procName, NULL);
1274 return (
L_DEWARP *)ERROR_PTR(
"stream not opened", procName, NULL);
1278 if (!dew) L_ERROR(
"dew not read\n", procName);
1297 PROCNAME(
"dewarpWrite");
1300 return ERROR_INT(
"filename not defined", procName, 1);
1302 return ERROR_INT(
"dew not defined", procName, 1);
1305 return ERROR_INT(
"stream not opened", procName, 1);
1309 return ERROR_INT(
"dew not written to stream", procName, 1);
1332 l_int32 vdispar, hdispar;
1334 PROCNAME(
"dewarpWriteStream");
1337 return ERROR_INT(
"stream not defined", procName, 1);
1339 return ERROR_INT(
"dew not defined", procName, 1);
1342 fprintf(fp,
"pageno = %d\n", dew->
pageno);
1343 fprintf(fp,
"hasref = %d, refpage = %d\n", dew->
hasref, dew->
refpage);
1344 fprintf(fp,
"sampling = %d, redfactor = %d\n",
1346 fprintf(fp,
"nlines = %d, minlines = %d\n", dew->
nlines, dew->
minlines);
1347 fprintf(fp,
"w = %d, h = %d\n", dew->
w, dew->
h);
1348 fprintf(fp,
"nx = %d, ny = %d\n", dew->
nx, dew->
ny);
1351 fprintf(fp,
"vert_dispar = %d, horiz_dispar = %d\n", vdispar, hdispar);
1353 fprintf(fp,
"min line curvature = %d, max line curvature = %d\n",
1356 fprintf(fp,
"left edge slope = %d, right edge slope = %d\n",
1358 fprintf(fp,
"left edge curvature = %d, right edge curvature = %d\n",
1366 L_WARNING(
"no disparity arrays!\n", procName);
1392 PROCNAME(
"dewarpWriteMem");
1394 if (pdata) *pdata = NULL;
1395 if (psize) *psize = 0;
1397 return ERROR_INT(
"&data not defined", procName, 1);
1399 return ERROR_INT(
"&size not defined", procName, 1);
1401 return ERROR_INT(
"dew not defined", procName, 1);
1404 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1405 return ERROR_INT(
"stream not opened", procName, 1);
1408 L_INFO(
"work-around: writing to a temp file\n", procName);
1411 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
1413 if ((fp = tmpfile()) == NULL)
1414 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
1440 PROCNAME(
"dewarpaRead");
1443 return (
L_DEWARPA *)ERROR_PTR(
"filename not defined", procName, NULL);
1445 return (
L_DEWARPA *)ERROR_PTR(
"stream not opened", procName, NULL);
1449 return (
L_DEWARPA *)ERROR_PTR(
"dewa not read", procName, NULL);
1474 l_int32 i, version, ndewarp, maxpage;
1476 l_int32 max_linecurv, min_diff_linecurv, max_diff_linecurv;
1477 l_int32 max_edgeslope, max_edgecurv, max_diff_edgecurv;
1482 PROCNAME(
"dewarpaReadStream");
1485 return (
L_DEWARPA *)ERROR_PTR(
"stream not defined", procName, NULL);
1487 if (fscanf(fp,
"\nDewarpa Version %d\n", &version) != 1)
1488 return (
L_DEWARPA *)ERROR_PTR(
"not a dewarpa file", procName, NULL);
1490 return (
L_DEWARPA *)ERROR_PTR(
"invalid dewarp version", procName, NULL);
1492 if (fscanf(fp,
"ndewarp = %d, maxpage = %d\n", &ndewarp, &maxpage) != 2)
1493 return (
L_DEWARPA *)ERROR_PTR(
"read fail for maxpage+", procName, NULL);
1495 "sampling = %d, redfactor = %d, minlines = %d, maxdist = %d\n",
1497 return (
L_DEWARPA *)ERROR_PTR(
"read fail for 4 params", procName, NULL);
1499 "max_linecurv = %d, min_diff_linecurv = %d, max_diff_linecurv = %d\n",
1500 &max_linecurv, &min_diff_linecurv, &max_diff_linecurv) != 3)
1501 return (
L_DEWARPA *)ERROR_PTR(
"read fail for linecurv", procName, NULL);
1503 "max_edgeslope = %d, max_edgecurv = %d, max_diff_edgecurv = %d\n",
1504 &max_edgeslope, &max_edgecurv, &max_diff_edgecurv) != 3)
1505 return (
L_DEWARPA *)ERROR_PTR(
"read fail for edgecurv", procName, NULL);
1506 if (fscanf(fp,
"fullmodel = %d\n", &useboth) != 1)
1507 return (
L_DEWARPA *)ERROR_PTR(
"read fail for useboth", procName, NULL);
1520 for (i = 0; i < ndewarp; i++) {
1522 L_ERROR(
"read fail for dew[%d]\n", procName, i);
1550 PROCNAME(
"dewarpaReadMem");
1553 return (
L_DEWARPA *)ERROR_PTR(
"data not defined", procName, NULL);
1555 return (
L_DEWARPA *)ERROR_PTR(
"stream not opened", procName, NULL);
1559 if (!
dewa) L_ERROR(
"dewa not read\n", procName);
1578 PROCNAME(
"dewarpaWrite");
1581 return ERROR_INT(
"filename not defined", procName, 1);
1583 return ERROR_INT(
"dewa not defined", procName, 1);
1586 return ERROR_INT(
"stream not opened", procName, 1);
1590 return ERROR_INT(
"dewa not written to stream", procName, 1);
1606 l_int32 ndewarp, i,
pageno;
1608 PROCNAME(
"dewarpaWriteStream");
1611 return ERROR_INT(
"stream not defined", procName, 1);
1613 return ERROR_INT(
"dewa not defined", procName, 1);
1622 return ERROR_INT(
"dewa->namodels not made", procName, 1);
1626 fprintf(fp,
"ndewarp = %d, maxpage = %d\n", ndewarp,
dewa->
maxpage);
1627 fprintf(fp,
"sampling = %d, redfactor = %d, minlines = %d, maxdist = %d\n",
1630 "max_linecurv = %d, min_diff_linecurv = %d, max_diff_linecurv = %d\n",
1633 "max_edgeslope = %d, max_edgecurv = %d, max_diff_edgecurv = %d\n",
1636 for (i = 0; i < ndewarp; i++) {
1666 PROCNAME(
"dewarpaWriteMem");
1668 if (pdata) *pdata = NULL;
1669 if (psize) *psize = 0;
1671 return ERROR_INT(
"&data not defined", procName, 1);
1673 return ERROR_INT(
"&size not defined", procName, 1);
1675 return ERROR_INT(
"dewa not defined", procName, 1);
1678 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1679 return ERROR_INT(
"stream not opened", procName, 1);
1682 L_INFO(
"work-around: writing to a temp file\n", procName);
1685 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
1687 if ((fp = tmpfile()) == NULL)
1688 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
struct FPix * sampvdispar
struct L_Dewarp ** dewarp
l_int32 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()
struct L_Dewarp ** dewarpcache
struct FPix * samphdispar
PIX * pixacompGetPix(PIXAC *pixac, l_int32 index)
pixacompGetPix()
l_int32 numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_int32 max_diff_linecurv
l_int32 pixacompGetOffset(PIXAC *pixac)
pixacompGetOffset()
l_int32 dewarpaListPages(L_DEWARPA *dewa)
dewarpaListPages()
l_int32 dewarpaInsertDewarp(L_DEWARPA *dewa, L_DEWARP *dew)
dewarpaInsertDewarp()
L_DEWARP * dewarpCreate(PIX *pixs, l_int32 pageno)
dewarpCreate()
l_int32 max_diff_edgecurv
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_int32 dewarpWriteStream(FILE *fp, L_DEWARP *dew)
dewarpWriteStream()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_int32 dewarpaWrite(const char *filename, L_DEWARPA *dewa)
dewarpaWrite()
l_int32 dewarpaSetMaxDistance(L_DEWARPA *dewa, l_int32 maxdist)
dewarpaSetMaxDistance()
void * reallocNew(void **pindata, l_int32 oldsize, l_int32 newsize)
reallocNew()
void dewarpaDestroy(L_DEWARPA **pdewa)
dewarpaDestroy()
l_int32 dewarpaInsertRefModels(L_DEWARPA *dewa, l_int32 notests, l_int32 debug)
dewarpaInsertRefModels()
l_int32 dewarpWriteMem(l_uint8 **pdata, size_t *psize, L_DEWARP *dew)
dewarpWriteMem()
l_int32 dewarpaSetCheckColumns(L_DEWARPA *dewa, l_int32 check_columns)
dewarpaSetCheckColumns()
#define DEWARP_VERSION_NUMBER
l_int32 min_diff_linecurv
l_int32 numaGetCount(NUMA *na)
numaGetCount()
struct FPix * fullydispar
l_int32 dewarpaWriteStream(FILE *fp, L_DEWARPA *dewa)
dewarpaWriteStream()
l_int32 dewarpMinimize(L_DEWARP *dew)
dewarpMinimize()
l_int32 dewarpaUseBothArrays(L_DEWARPA *dewa, l_int32 useboth)
dewarpaUseBothArrays()
L_DEWARPA * dewarpaReadMem(const l_uint8 *data, size_t size)
dewarpaReadMem()
FILE * fopenWriteWinTempfile()
fopenWriteWinTempfile()
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_DEWARPA * dewarpaReadStream(FILE *fp)
dewarpaReadStream()
l_int32 fpixWriteStream(FILE *fp, FPIX *fpix)
fpixWriteStream()
void pixDestroy(PIX **ppix)
pixDestroy()
struct FPix * sampydispar
L_DEWARP * dewarpReadStream(FILE *fp)
dewarpReadStream()
l_int32 dewarpWrite(const char *filename, L_DEWARP *dew)
dewarpWrite()
void numaDestroy(NUMA **pna)
numaDestroy()
L_DEWARP * dewarpRead(const char *filename)
dewarpRead()
FILE * fopenWriteStream(const char *filename, const char *modestring)
fopenWriteStream()
FILE * fopenReadStream(const char *filename)
fopenReadStream()
l_uint8 * l_binaryReadStream(FILE *fp, size_t *pnbytes)
l_binaryReadStream()
l_int32 dewarpaWriteMem(l_uint8 **pdata, size_t *psize, L_DEWARPA *dewa)
dewarpaWriteMem()
L_DEWARPA * dewarpaCreateFromPixacomp(PIXAC *pixac, l_int32 useboth, l_int32 sampling, l_int32 minlines, l_int32 maxdist)
dewarpaCreateFromPixacomp()
L_DEWARP * dewarpReadMem(const l_uint8 *data, size_t size)
dewarpReadMem()
l_int32 dewarpaDestroyDewarp(L_DEWARPA *dewa, l_int32 pageno)
dewarpaDestroyDewarp()
struct FPix * fullvdispar
l_int32 pixacompGetCount(PIXAC *pixac)
pixacompGetCount()
l_int32 numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
struct FPix * fullhdispar
l_int32 dewarpBuildPageModel(L_DEWARP *dew, const char *debugfile)
dewarpBuildPageModel()
FPIX * fpixReadStream(FILE *fp)
fpixReadStream()
void fpixDestroy(FPIX **pfpix)
fpixDestroy()
L_DEWARP * dewarpCreateRef(l_int32 pageno, l_int32 refpage)
dewarpCreateRef()
L_DEWARP * dewarpaGetDewarp(L_DEWARPA *dewa, l_int32 index)
dewarpaGetDewarp()