55 #include <config_auto.h>
59 #include "allheaders.h"
62 l_int32 x, l_int32 y,
L_DEWARP **pdew,
63 const char *debugfile);
123 const char *debugfile)
128 PROCNAME(
"dewarpaApplyDisparity");
133 return ERROR_INT(
"&pixd not defined", procName, 1);
136 L_WARNING(
"invalid grayin = %d; clipping at 255\n", procName, grayin);
142 return ERROR_INT(
"no model available", procName, 1);
147 return ERROR_INT(
"pixv not made", procName, 1);
152 pixDisplayWithTitle(pixv, 300, 0,
"pixv", 1);
155 pixWriteDebug(
"/tmp/lept/dewapply/001.png", pixs, IFF_PNG);
156 pixWriteDebug(
"/tmp/lept/dewapply/002.png", pixv, IFF_PNG);
161 if (dew->
hvalid == FALSE) {
162 L_INFO(
"invalid horiz model for page %d\n", procName, pageno);
168 pixDisplayWithTitle(pixh, 600, 0,
"pixh", 1);
169 pixWriteDebug(
"/tmp/lept/dewapply/003.png", pixh, IFF_PNG);
172 L_ERROR(
"horiz disparity failed on page %d\n",
182 "Dewarp Apply Disparity", debugfile);
222 const char *debugfile)
224 l_int32 ncols, debug;
228 PROCNAME(
"dewarpaApplyInit");
231 return ERROR_INT(
"&dew not defined", procName, 1);
235 return ERROR_INT(
"dewa not defined", procName, 1);
236 if (pageno < 0 || pageno > dewa->
maxpage)
237 return ERROR_INT(
"invalid pageno", procName, 1);
239 return ERROR_INT(
"pixs not defined", procName, 1);
242 debug = (debugfile) ? 1 : 0;
252 L_INFO(
"no valid dew model for page %d\n", procName, pageno);
262 if (dew2->
vvalid == FALSE)
263 return ERROR_INT(
"no model; shouldn't happen", procName, 1);
274 L_INFO(
"found %d columns; not correcting horiz disparity\n",
314 l_int32 i, j, w, h, d, fw, fh, wpld, wplf, isrc, val8;
315 l_uint32 *datad, *lined;
316 l_float32 *dataf, *linef;
321 PROCNAME(
"pixApplyVertDisparity");
324 return (
PIX *)ERROR_PTR(
"dew not defined", procName, NULL);
326 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
328 if (d != 1 && d != 8 && d != 32)
329 return (
PIX *)ERROR_PTR(
"pix not 1, 8 or 32 bpp", procName, NULL);
331 return (
PIX *)ERROR_PTR(
"fullvdispar not defined", procName, NULL);
333 if (fw < w || fh < h) {
334 lept_stderr(
"fw = %d, w = %d, fh = %d, h = %d\n", fw, w, fh, h);
335 return (
PIX *)ERROR_PTR(
"invalid fpix size", procName, NULL);
345 wpld = pixGetWpl(pixd);
349 for (i = 0; i < h; i++) {
350 lined = datad + i * wpld;
351 linef = dataf + i * wplf;
352 for (j = 0; j < w; j++) {
353 isrc = (l_int32)(i - linef[j] + 0.5);
355 isrc = L_MIN(L_MAX(isrc, 0), h - 1);
356 if (isrc >= 0 && isrc < h) {
364 for (i = 0; i < h; i++) {
365 lined = datad + i * wpld;
366 linef = dataf + i * wplf;
367 for (j = 0; j < w; j++) {
368 isrc = (l_int32)(i - linef[j] + 0.5);
370 isrc = L_MIN(L_MAX(isrc, 0), h - 1);
371 if (isrc >= 0 && isrc < h) {
379 for (i = 0; i < h; i++) {
380 lined = datad + i * wpld;
381 linef = dataf + i * wplf;
382 for (j = 0; j < w; j++) {
383 isrc = (l_int32)(i - linef[j] + 0.5);
385 isrc = L_MIN(L_MAX(isrc, 0), h - 1);
386 if (isrc >= 0 && isrc < h)
424 l_int32 i, j, w, h, d, fw, fh, wpls, wpld, wplf, jsrc, val8;
425 l_uint32 *datas, *lines, *datad, *lined;
426 l_float32 *dataf, *linef;
430 PROCNAME(
"pixApplyHorizDisparity");
433 return (
PIX *)ERROR_PTR(
"dew not defined", procName, pixs);
435 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
437 if (d != 1 && d != 8 && d != 32)
438 return (
PIX *)ERROR_PTR(
"pix not 1, 8 or 32 bpp", procName, NULL);
440 return (
PIX *)ERROR_PTR(
"fullhdispar not defined", procName, NULL);
442 if (fw < w || fh < h) {
443 lept_stderr(
"fw = %d, w = %d, fh = %d, h = %d\n", fw, w, fh, h);
444 return (
PIX *)ERROR_PTR(
"invalid fpix size", procName, NULL);
455 wpls = pixGetWpl(pixs);
456 wpld = pixGetWpl(pixd);
459 for (i = 0; i < h; i++) {
460 lines = datas + i * wpls;
461 lined = datad + i * wpld;
462 linef = dataf + i * wplf;
463 for (j = 0; j < w; j++) {
464 jsrc = (l_int32)(j - linef[j] + 0.5);
466 jsrc = L_MIN(L_MAX(jsrc, 0), w - 1);
467 if (jsrc >= 0 && jsrc < w) {
474 for (i = 0; i < h; i++) {
475 lines = datas + i * wpls;
476 lined = datad + i * wpld;
477 linef = dataf + i * wplf;
478 for (j = 0; j < w; j++) {
479 jsrc = (l_int32)(j - linef[j] + 0.5);
481 jsrc = L_MIN(L_MAX(jsrc, 0), w - 1);
482 if (jsrc >= 0 && jsrc < w) {
489 for (i = 0; i < h; i++) {
490 lines = datas + i * wpls;
491 lined = datad + i * wpld;
492 linef = dataf + i * wplf;
493 for (j = 0; j < w; j++) {
494 jsrc = (l_int32)(j - linef[j] + 0.5);
496 jsrc = L_MIN(L_MAX(jsrc, 0), w - 1);
497 if (jsrc >= 0 && jsrc < w)
498 lined[j] = lines[jsrc];
547 const char *debugfile)
554 PROCNAME(
"dewarpaApplyDisparityBoxa");
559 return ERROR_INT(
"&boxad not defined", procName, 1);
564 return ERROR_INT(
"no model available", procName, 1);
569 return ERROR_INT(
"boxa1 not made", procName, 1);
575 if (debugfile && mapdir != 1)
576 L_INFO(
"Reverse map direction; no debug output\n", procName);
577 debug_out = debugfile && (mapdir == 1);
584 pixWriteDebug(
"/tmp/lept/dewboxa/01.png", pix1, IFF_PNG);
589 pixWriteDebug(
"/tmp/lept/dewboxa/02.png", pix1, IFF_PNG);
595 if (dew->
hvalid == FALSE) {
596 L_INFO(
"invalid horiz model for page %d\n", procName, pageno);
600 L_ERROR(
"horiz disparity fails on page %d\n", procName, pageno);
609 pixWriteDebug(
"/tmp/lept/dewboxa/03.png", pix1, IFF_PNG);
622 "Dewarp Apply Disparity Boxa", debugfile);
623 lept_stderr(
"Dewarp Apply Disparity Boxa pdf file: %s\n",
650 l_int32 x, y, w, h, ib, ip, nbox, wpl;
652 l_float32 *data, *line;
658 PROCNAME(
"boxaApplyDisparity");
661 return (
BOXA *)ERROR_PTR(
"dew not defined", procName, NULL);
663 return (
BOXA *)ERROR_PTR(
"boxa not defined", procName, NULL);
664 if (direction == L_VERT)
666 else if (direction == L_HORIZ)
669 return (
BOXA *)ERROR_PTR(
"invalid direction", procName, NULL);
671 return (
BOXA *)ERROR_PTR(
"full disparity not defined", procName, NULL);
680 for (ib = 0; ib < nbox; ib++) {
684 for (ip = 0; ip < 4; ip++) {
686 line = data + y * wpl;
687 if (direction == L_VERT) {
735 PROCNAME(
"dewarpMinimize");
738 return ERROR_INT(
"dew not defined", procName, 1);
746 return ERROR_INT(
"dewt not found", procName, 1);
792 l_int32 width, height, fw, fh, deltaw, deltah, redfactor;
793 FPIX *fpixt1, *fpixt2;
795 PROCNAME(
"dewarpPopulateFullRes");
798 return ERROR_INT(
"dew not defined", procName, 1);
800 return ERROR_INT(
"no sampled vert disparity", procName, 1);
815 if (width > fw || height > fw)
820 if (width > fw || height > fw)
825 deltaw = width - dew->
sampling * (dew->
nx - 1) + 2;
826 deltah = height - dew->
sampling * (dew->
ny - 1) + 2;
828 deltaw = redfactor * L_MAX(0, deltaw);
829 deltah = redfactor * L_MAX(0, deltah);
840 if (deltah == 0 && deltaw == 0) {
859 if (deltah == 0 && deltaw == 0) {
901 fpixSampledDisparity(
FPIX *fpixs,
904 l_int32 w, h, wd, hd, i, j, is, js;
908 PROCNAME(
"fpixSampledDisparity");
911 return (
FPIX *)ERROR_PTR(
"fpixs not defined", procName, NULL);
913 return (
FPIX *)ERROR_PTR(
"sampling < 1", procName, NULL);
916 wd = 1 + (w + sampling - 2) / sampling;
917 hd = 1 + (h + sampling - 2) / sampling;
918 if (wd < 3 || hd < 3)
919 return (
FPIX *)ERROR_PTR(
"wd < 3 or hd < 3", procName, NULL);
921 for (i = 0; i < hd; i++) {
923 if (is >= h)
continue;
924 for (j = 0; j < wd; j++) {
926 if (js >= w)
continue;
935 static const l_float32 DefaultSlopeFactor = 0.1;
961 fpixExtraHorizDisparity(
FPIX *fpixv,
965 l_int32 w, h, i, j, fw, wpl, maxloc;
966 l_float32 val1, val2, vdisp, vdisp0, maxval;
967 l_float32 *data, *line, *fadiff;
971 PROCNAME(
"fpixExtraHorizDisparity");
974 return (
FPIX *)ERROR_PTR(
"fpixv not defined", procName, NULL);
976 return (
FPIX *)ERROR_PTR(
"&xwid not defined", procName, NULL);
978 factor = DefaultSlopeFactor;
987 for (j = 0; j < w; j++) {
990 vdisp = factor * (val2 - val1) / (l_float32)h;
991 if (j == 0) vdisp0 = vdisp;
992 vdisp = vdisp0 - vdisp;
996 *pxwid = (l_int32)(maxval + 0.5);
1003 for (i = 0; i < h; i++) {
1004 line = data + i * wpl;
1005 for (j = 0; j < fw; j++) {
1007 line[j] = fadiff[j];
#define SET_DATA_BIT(pdata, n)
#define GET_DATA_BYTE(pdata, n)
#define GET_DATA_FOUR_BYTES(pdata, n)
#define SET_DATA_BYTE(pdata, n, val)
#define GET_DATA_BIT(pdata, n)
BOXA * boxaCopy(BOXA *boxa, l_int32 copyflag)
boxaCopy()
void boxDestroy(BOX **pbox)
boxDestroy()
l_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
l_ok boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
BOX * boxaGetBox(BOXA *boxa, l_int32 index, l_int32 accessflag)
boxaGetBox()
BOXA * boxaCreate(l_int32 n)
boxaCreate()
PTA * boxConvertToPta(BOX *box, l_int32 ncorners)
boxConvertToPta()
BOX * ptaConvertToBox(PTA *pta)
ptaConvertToBox()
L_DEWARP * dewarpaGetDewarp(L_DEWARPA *dewa, l_int32 index)
dewarpaGetDewarp()
static l_int32 dewarpaApplyInit(L_DEWARPA *dewa, l_int32 pageno, PIX *pixs, l_int32 x, l_int32 y, L_DEWARP **pdew, const char *debugfile)
dewarpaApplyInit()
static PIX * pixApplyHorizDisparity(L_DEWARP *dew, PIX *pixs, l_int32 grayin)
pixApplyHorizDisparity()
static PIX * pixApplyVertDisparity(L_DEWARP *dew, PIX *pixs, l_int32 grayin)
pixApplyVertDisparity()
l_ok dewarpaApplyDisparity(L_DEWARPA *dewa, l_int32 pageno, PIX *pixs, l_int32 grayin, l_int32 x, l_int32 y, PIX **ppixd, const char *debugfile)
dewarpaApplyDisparity()
static BOXA * boxaApplyDisparity(L_DEWARP *dew, BOXA *boxa, l_int32 direction, l_int32 mapdir)
boxaApplyDisparity()
l_ok dewarpMinimize(L_DEWARP *dew)
dewarpMinimize()
l_ok dewarpaApplyDisparityBoxa(L_DEWARPA *dewa, l_int32 pageno, PIX *pixs, BOXA *boxas, l_int32 mapdir, l_int32 x, l_int32 y, BOXA **pboxad, const char *debugfile)
dewarpaApplyDisparityBoxa()
l_ok dewarpPopulateFullRes(L_DEWARP *dew, PIX *pix, l_int32 x, l_int32 y)
dewarpPopulateFullRes()
l_ok dewarpDebug(L_DEWARP *dew, const char *subdirs, l_int32 index)
dewarpDebug()
l_ok dewarpaInsertRefModels(L_DEWARPA *dewa, l_int32 notests, l_int32 debug)
dewarpaInsertRefModels()
l_ok fpixGetDimensions(FPIX *fpix, l_int32 *pw, l_int32 *ph)
fpixGetDimensions()
l_int32 fpixGetWpl(FPIX *fpix)
fpixGetWpl()
l_ok fpixSetPixel(FPIX *fpix, l_int32 x, l_int32 y, l_float32 val)
fpixSetPixel()
void fpixDestroy(FPIX **pfpix)
fpixDestroy()
FPIX * fpixCreate(l_int32 width, l_int32 height)
fpixCreate()
l_ok fpixGetPixel(FPIX *fpix, l_int32 x, l_int32 y, l_float32 *pval)
fpixGetPixel()
l_float32 * fpixGetData(FPIX *fpix)
fpixGetData()
FPIX * fpixCopy(FPIX *fpixs)
fpixCopy()
FPIX * fpixAddSlopeBorder(FPIX *fpixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
fpixAddSlopeBorder()
FPIX * fpixScaleByInteger(FPIX *fpixs, l_int32 factor)
fpixScaleByInteger()
l_ok fpixAddMultConstant(FPIX *fpix, l_float32 addc, l_float32 multc)
fpixAddMultConstant()
l_ok pixRenderBoxaArb(PIX *pix, BOXA *boxa, l_int32 width, l_uint8 rval, l_uint8 gval, l_uint8 bval)
pixRenderBoxaArb()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
NUMA * numaCreate(l_int32 n)
numaCreate()
void numaDestroy(NUMA **pna)
numaDestroy()
l_float32 * numaGetFArray(NUMA *na, l_int32 copyflag)
numaGetFArray()
l_ok numaGetMax(NUMA *na, l_float32 *pmaxval, l_int32 *pimaxloc)
numaGetMax()
l_ok pixCountTextColumns(PIX *pixs, l_float32 deltafract, l_float32 peakfract, l_float32 clipfract, l_int32 *pncols, PIXA *pixadb)
pixCountTextColumns()
l_ok convertFilesToPdf(const char *dirname, const char *substr, l_int32 res, l_float32 scalefactor, l_int32 type, l_int32 quality, const char *title, const char *fileout)
convertFilesToPdf()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixCreateTemplate(const PIX *pixs)
pixCreateTemplate()
PIX * pixClone(PIX *pixs)
pixClone()
void ** pixGetLinePtrs(PIX *pix, l_int32 *psize)
pixGetLinePtrs()
l_ok pixSetAllGray(PIX *pix, l_int32 grayval)
pixSetAllGray()
PIX * pixConvertTo1(PIX *pixs, l_int32 threshold)
pixConvertTo1()
PIX * pixConvertTo32(PIX *pixs)
pixConvertTo32()
l_ok ptaGetIPt(PTA *pta, l_int32 index, l_int32 *px, l_int32 *py)
ptaGetIPt()
l_ok ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
PTA * ptaCreate(l_int32 n)
ptaCreate()
void ptaDestroy(PTA **ppta)
ptaDestroy()
struct FPix * fullvdispar
struct FPix * fullhdispar
struct FPix * sampvdispar
struct FPix * samphdispar
void lept_stderr(const char *fmt,...)
lept_stderr()
l_int32 lept_rmdir(const char *subdir)
lept_rmdir()
l_int32 lept_mkdir(const char *subdir)
lept_mkdir()