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)
131 return ERROR_INT(
"&pixd not defined", __func__, 1);
134 L_WARNING(
"invalid grayin = %d; clipping at 255\n", __func__, grayin);
140 return ERROR_INT(
"no model available", __func__, 1);
145 return ERROR_INT(
"pixv not made", __func__, 1);
150 pixDisplayWithTitle(pixv, 300, 0,
"pixv", 1);
153 pixWriteDebug(
"/tmp/lept/dewapply/001.png", pixs, IFF_PNG);
154 pixWriteDebug(
"/tmp/lept/dewapply/002.png", pixv, IFF_PNG);
159 if (dew->
hvalid == FALSE) {
160 L_INFO(
"invalid horiz model for page %d\n", __func__, pageno);
166 pixDisplayWithTitle(pixh, 600, 0,
"pixh", 1);
167 pixWriteDebug(
"/tmp/lept/dewapply/003.png", pixh, IFF_PNG);
170 L_ERROR(
"horiz disparity failed on page %d\n",
180 "Dewarp Apply Disparity", debugfile);
220 const char *debugfile)
222 l_int32 ncols, debug;
227 return ERROR_INT(
"&dew not defined", __func__, 1);
231 return ERROR_INT(
"dewa not defined", __func__, 1);
232 if (pageno < 0 || pageno > dewa->
maxpage)
233 return ERROR_INT(
"invalid pageno", __func__, 1);
235 return ERROR_INT(
"pixs not defined", __func__, 1);
238 debug = (debugfile) ? 1 : 0;
248 L_INFO(
"no valid dew model for page %d\n", __func__, pageno);
258 if (dew2->
vvalid == FALSE)
259 return ERROR_INT(
"no model; shouldn't happen", __func__, 1);
270 L_INFO(
"found %d columns; not correcting horiz disparity\n",
310 l_int32 i, j, w, h, d, fw, fh, wpld, wplf, isrc, val8;
311 l_uint32 *datad, *lined;
312 l_float32 *dataf, *linef;
318 return (
PIX *)ERROR_PTR(
"dew not defined", __func__, NULL);
320 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
322 if (d != 1 && d != 8 && d != 32)
323 return (
PIX *)ERROR_PTR(
"pix not 1, 8 or 32 bpp", __func__, NULL);
325 return (
PIX *)ERROR_PTR(
"fullvdispar not defined", __func__, NULL);
327 if (fw < w || fh < h) {
328 lept_stderr(
"fw = %d, w = %d, fh = %d, h = %d\n", fw, w, fh, h);
329 return (
PIX *)ERROR_PTR(
"invalid fpix size", __func__, NULL);
339 wpld = pixGetWpl(pixd);
343 for (i = 0; i < h; i++) {
344 lined = datad + i * wpld;
345 linef = dataf + i * wplf;
346 for (j = 0; j < w; j++) {
347 isrc = (l_int32)(i - linef[j] + 0.5);
349 isrc = L_MIN(L_MAX(isrc, 0), h - 1);
350 if (isrc >= 0 && isrc < h) {
358 for (i = 0; i < h; i++) {
359 lined = datad + i * wpld;
360 linef = dataf + i * wplf;
361 for (j = 0; j < w; j++) {
362 isrc = (l_int32)(i - linef[j] + 0.5);
364 isrc = L_MIN(L_MAX(isrc, 0), h - 1);
365 if (isrc >= 0 && isrc < h) {
373 for (i = 0; i < h; i++) {
374 lined = datad + i * wpld;
375 linef = dataf + i * wplf;
376 for (j = 0; j < w; j++) {
377 isrc = (l_int32)(i - linef[j] + 0.5);
379 isrc = L_MIN(L_MAX(isrc, 0), h - 1);
380 if (isrc >= 0 && isrc < h)
418 l_int32 i, j, w, h, d, fw, fh, wpls, wpld, wplf, jsrc, val8;
419 l_uint32 *datas, *lines, *datad, *lined;
420 l_float32 *dataf, *linef;
425 return (
PIX *)ERROR_PTR(
"dew not defined", __func__, pixs);
427 return (
PIX *)ERROR_PTR(
"pixs not defined", __func__, NULL);
429 if (d != 1 && d != 8 && d != 32)
430 return (
PIX *)ERROR_PTR(
"pix not 1, 8 or 32 bpp", __func__, NULL);
432 return (
PIX *)ERROR_PTR(
"fullhdispar not defined", __func__, NULL);
434 if (fw < w || fh < h) {
435 lept_stderr(
"fw = %d, w = %d, fh = %d, h = %d\n", fw, w, fh, h);
436 return (
PIX *)ERROR_PTR(
"invalid fpix size", __func__, NULL);
447 wpls = pixGetWpl(pixs);
448 wpld = pixGetWpl(pixd);
451 for (i = 0; i < h; i++) {
452 lines = datas + i * wpls;
453 lined = datad + i * wpld;
454 linef = dataf + i * wplf;
455 for (j = 0; j < w; j++) {
456 jsrc = (l_int32)(j - linef[j] + 0.5);
458 jsrc = L_MIN(L_MAX(jsrc, 0), w - 1);
459 if (jsrc >= 0 && jsrc < w) {
466 for (i = 0; i < h; i++) {
467 lines = datas + i * wpls;
468 lined = datad + i * wpld;
469 linef = dataf + i * wplf;
470 for (j = 0; j < w; j++) {
471 jsrc = (l_int32)(j - linef[j] + 0.5);
473 jsrc = L_MIN(L_MAX(jsrc, 0), w - 1);
474 if (jsrc >= 0 && jsrc < w) {
481 for (i = 0; i < h; i++) {
482 lines = datas + i * wpls;
483 lined = datad + i * wpld;
484 linef = dataf + i * wplf;
485 for (j = 0; j < w; j++) {
486 jsrc = (l_int32)(j - linef[j] + 0.5);
488 jsrc = L_MIN(L_MAX(jsrc, 0), w - 1);
489 if (jsrc >= 0 && jsrc < w)
490 lined[j] = lines[jsrc];
539 const char *debugfile)
549 return ERROR_INT(
"&boxad not defined", __func__, 1);
554 return ERROR_INT(
"no model available", __func__, 1);
559 return ERROR_INT(
"boxa1 not made", __func__, 1);
565 if (debugfile && mapdir != 1)
566 L_INFO(
"Reverse map direction; no debug output\n", __func__);
567 debug_out = debugfile && (mapdir == 1);
574 pixWriteDebug(
"/tmp/lept/dewboxa/01.png", pix1, IFF_PNG);
579 pixWriteDebug(
"/tmp/lept/dewboxa/02.png", pix1, IFF_PNG);
585 if (dew->
hvalid == FALSE) {
586 L_INFO(
"invalid horiz model for page %d\n", __func__, pageno);
590 L_ERROR(
"horiz disparity fails on page %d\n", __func__, pageno);
599 pixWriteDebug(
"/tmp/lept/dewboxa/03.png", pix1, IFF_PNG);
612 "Dewarp Apply Disparity Boxa", debugfile);
613 lept_stderr(
"Dewarp Apply Disparity Boxa pdf file: %s\n",
640 l_int32 x, y, w, h, ib, ip, nbox, wpl;
642 l_float32 *data, *line;
649 return (
BOXA *)ERROR_PTR(
"dew not defined", __func__, NULL);
651 return (
BOXA *)ERROR_PTR(
"boxa not defined", __func__, NULL);
652 if (direction == L_VERT)
654 else if (direction == L_HORIZ)
657 return (
BOXA *)ERROR_PTR(
"invalid direction", __func__, NULL);
659 return (
BOXA *)ERROR_PTR(
"full disparity not defined", __func__, NULL);
668 for (ib = 0; ib < nbox; ib++) {
672 for (ip = 0; ip < 4; ip++) {
674 line = data + y * wpl;
675 if (direction == L_VERT) {
724 return ERROR_INT(
"dew not defined", __func__, 1);
732 return ERROR_INT(
"dewt not found", __func__, 1);
778 l_int32 width, height, fw, fh, deltaw, deltah, redfactor;
779 FPIX *fpixt1, *fpixt2;
782 return ERROR_INT(
"dew not defined", __func__, 1);
784 return ERROR_INT(
"no sampled vert disparity", __func__, 1);
799 if (width > fw || height > fw)
804 if (width > fw || height > fw)
809 deltaw = width - dew->
sampling * (dew->
nx - 1) + 2;
810 deltah = height - dew->
sampling * (dew->
ny - 1) + 2;
812 deltaw = redfactor * L_MAX(0, deltaw);
813 deltah = redfactor * L_MAX(0, deltah);
824 if (deltah == 0 && deltaw == 0) {
843 if (deltah == 0 && deltaw == 0) {
885 fpixSampledDisparity(
FPIX *fpixs,
888 l_int32 w, h, wd, hd, i, j, is, js;
893 return (
FPIX *)ERROR_PTR(
"fpixs not defined", __func__, NULL);
895 return (
FPIX *)ERROR_PTR(
"sampling < 1", __func__, NULL);
898 wd = 1 + (w + sampling - 2) / sampling;
899 hd = 1 + (h + sampling - 2) / sampling;
900 if (wd < 3 || hd < 3)
901 return (
FPIX *)ERROR_PTR(
"wd < 3 or hd < 3", __func__, NULL);
903 for (i = 0; i < hd; i++) {
905 if (is >= h)
continue;
906 for (j = 0; j < wd; j++) {
908 if (js >= w)
continue;
917 static const l_float32 DefaultSlopeFactor = 0.1;
943 fpixExtraHorizDisparity(
FPIX *fpixv,
947 l_int32 w, h, i, j, fw, wpl, maxloc;
948 l_float32 val1, val2, vdisp, vdisp0, maxval;
949 l_float32 *data, *line, *fadiff;
954 return (
FPIX *)ERROR_PTR(
"fpixv not defined", __func__, NULL);
956 return (
FPIX *)ERROR_PTR(
"&xwid not defined", __func__, NULL);
958 factor = DefaultSlopeFactor;
967 for (j = 0; j < w; j++) {
970 vdisp = factor * (val2 - val1) / (l_float32)h;
971 if (j == 0) vdisp0 = vdisp;
972 vdisp = vdisp0 - vdisp;
976 *pxwid = (l_int32)(maxval + 0.5);
983 for (i = 0; i < h; i++) {
984 line = data + i * wpl;
985 for (j = 0; j < fw; 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_ok boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
l_int32 boxaGetCount(const BOXA *boxa)
boxaGetCount()
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()