-#include <pam.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include <assert.h>
-#include <string.h>
-#define eassert assert
-#define debug stdout
+#include "ocr.h"
typedef struct {
unsigned long rgb; /* on screen */
static int height, width;
static char *image;
-static void debug_flush(void) {
+void debug_flush(void) {
eassert(!fflush(debug));
eassert(!ferror(debug));
}
#define START_MAIN {200,200}
+#define MIN_COLUMNS 6
#define INTERESTING_COLUMNS 6
-#define MAX_COLUMNS 7
+#define TEXT_COLUMNS 2
+#define MAX_COLUMNS 7
static Rect mainr = { START_MAIN,START_MAIN };
static int commbasey, comminty;
static int colrightx[INTERESTING_COLUMNS];
-
+static int text_h;
+static OcrReader *rd;
static const CanonColourInfo canoncolourinfos[]= {
{ 0x475A5E, '*' }, /* edge */
}
static void debug_rect(const char *what, int whati, Rect rr) {
+#ifdef DEBUG_RECTANGLES
int y,r,w;
fprintf(debug, "%s %d: %d,%d..%d,%d:\n", what, whati,
rr.tl.x,rr.tl.y, rr.br.x,rr.br.y);
fputc('|',debug);
fputc('\n',debug);
}
+#endif
debug_flush();
}
down.y++;
WALK_UNTIL_MUST(down, y,+1, mainr.br.y, '+');
+#ifdef DEBUG_RECTANGLES
int xscaleunit, y,x;
for (y=0, xscaleunit=1; y<4; y++, xscaleunit*=10) {
fprintf(debug," ");
}
fputc('\n',debug);
}
+#endif
commbasey= up.y;
comminty= down.y - up.y + 2;
- fprintf(debug, "up.y=%d down.y=%d commbasey=%d comminty=%d\n",
- up.y,down.y, commbasey,comminty);
Point across= { mainr.tl.x, commbasey };
int colno=0;
eassert(colno < MAX_COLUMNS);
int colrx= across.x;
if (colrx > mainr.br.x) colrx= mainr.br.x;
- if (colno < INTERESTING_COLUMNS) {
+ if (colno < INTERESTING_COLUMNS)
colrightx[colno]= colrx;
- fprintf(debug,"colrightx[%d]= %d\n",colno,colrx);
- } else {
- fprintf(debug,"extra colr %d %d\n",colno,colrx);
- }
colno++;
require_rectangle(across.x,mainr.tl.y, across.x,mainr.br.y, "+");
across.x++;
}
-
+ eassert(colno >= MIN_COLUMNS);
+
+ text_h = comminty - 1;
}
static void find_commodity(int offset, Rect *rr) {
rr->br.x= mainr.br.x;
}
+static void find_table_entry(Rect commod, int colno, Rect *cellr) {
+ cellr->tl.y= commod.tl.y;
+ cellr->br.y= commod.br.y;
+ cellr->tl.x= !colno ? commod.tl.x : colrightx[colno-1]+2;
+ cellr->br.x= colrightx[colno];
+ debug_rect("cell", colno, *cellr);
+ require_rectangle_r(*cellr, " o");
+}
+
static void load_image_and_canonify(void) {
struct pam inpam;
unsigned char rgb[3];
break;
}
}
+#ifdef DEBUG_RECTANGLES
fprintf(debug, "%4d ",y);
r= fwrite(image + y*width, 1,width, debug); eassert(r==width);
fputc('\n',debug);
+#endif
}
debug_flush();
}
+static void ocr_rectangle(Rect r, const OcrCellType ct) {
+ OcrResultGlyph *results, *res;
+
+ int w= r.br.x - r.tl.x + 1;
+ Pixcol cols[w+1];
+ int x,y;
+ for (x=0; x<w; x++) {
+ Pixcol cx, rv;
+ for (y=0, cx=0, rv=1; y<text_h; y++, rv<<=1) {
+ switch (get(x+r.tl.x, y+r.tl.y)) {
+ case ' ': break;
+ case 'o': cx |= rv; break;
+ default: eassert(!"wrong pixel");
+ }
+ }
+ cols[x]= cx;
+ }
+ cols[w]= 0;
+
+ results= ocr(rd,ct,w,cols);
+ printf("YES! \"");
+ for (res=results; res->s; res++)
+ printf("%s",res->s);
+ printf("\"\n");
+ eassert(!ferror(stdout));
+ eassert(!fflush(stdout));
+}
+
int main(void) {
+ Rect thisr, entryr;
+ int tryrect, colno;
+
load_image_and_canonify();
find_structure();
+ rd= ocr_init(text_h);
- Rect thisr;
- int tryrect;
for (tryrect= +height; tryrect >= -height; tryrect--) {
find_commodity(tryrect, &thisr);
- if (thisr.tl.x >= 0)
- debug_rect("commod",tryrect, thisr);
+ if (thisr.tl.x < 0)
+ continue;
+ debug_rect("commod",tryrect, thisr);
+
+ for (colno=0; colno<MIN_COLUMNS; colno++) {
+ find_table_entry(thisr,colno,&entryr);
+ ocr_rectangle(entryr,
+ colno<TEXT_COLUMNS
+ ? &ocr_celltype_text
+ : &ocr_celltype_number);
+ }
}
return 0;
}
+
+const char *get_vardir(void) { return "."; }