chiark
/
gitweb
/
~yarrgweb
/
ypp-sc-tools.web-live.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
some more cleaning
[ypp-sc-tools.web-live.git]
/
pctb
/
structure.c
diff --git
a/pctb/structure.c
b/pctb/structure.c
index 5a593887350025f8ce39c5e5d2a90e9c72df61e9..200b86ea43c28b5e3a0bd58a5f299be8ed2be941 100644
(file)
--- a/
pctb/structure.c
+++ b/
pctb/structure.c
@@
-96,7
+96,6
@@
static void mustfail1(const char *file, int line, const char *what) {
"Unable to figure out contents of YPP client display.\n"
"Please check the following:\n"
" * YPP client is showing commodity listing screen\n"
"Unable to figure out contents of YPP client display.\n"
"Please check the following:\n"
" * YPP client is showing commodity listing screen\n"
- " * YPP client has antialiased text turned off (Ye / Options / General)\n"
" * YPP client window is on top (we try to raise it but your window\n"
" manager might have prevented that from succeeding)\n"
" * Your X display is 24bpp (NB some VNC servers use 16bpp by default)\n"
" * YPP client window is on top (we try to raise it but your window\n"
" manager might have prevented that from succeeding)\n"
" * Your X display is 24bpp (NB some VNC servers use 16bpp by default)\n"
@@
-320,6
+319,8
@@
void find_structure(CanonImage *im, int *max_relevant_y_r) {
SET_ONCE(text_h, comminty - 1);
if (max_relevant_y_r)
SET_ONCE(*max_relevant_y_r, mainr.br.y + 10);
SET_ONCE(text_h, comminty - 1);
if (max_relevant_y_r)
SET_ONCE(*max_relevant_y_r, mainr.br.y + 10);
+
+ MUST( text_h <= OCR_MAX_H, MI(text_h) );
}
void check_correct_commodities(void) {
}
void check_correct_commodities(void) {
@@
-460,28
+461,38
@@
static void find_table_entry(Rect commod, int colno, Rect *cell) {
const RgbImage *ri= cim->rgb;
Rgb background= ri_rgb(ri, cell->br.x, cell->br.y);
const RgbImage *ri= cim->rgb;
Rgb background= ri_rgb(ri, cell->br.x, cell->br.y);
- long bg_count=0,
white_count=0, blac
k_count=0;
+ long bg_count=0,
light_count=0, dar
k_count=0;
Point p;
FOR_P_RECT(p,*cell) {
Rgb here= ri_rgb(ri, p.x, p.y);
if (here == background) bg_count++;
Point p;
FOR_P_RECT(p,*cell) {
Rgb here= ri_rgb(ri, p.x, p.y);
if (here == background) bg_count++;
- else if (here
== 0) blac
k_count++;
- else if (here
== 0xffffffU) white
_count++;
+ else if (here
< background) dar
k_count++;
+ else if (here
> background) light
_count++;
}
long total_count= RECT_W(*cell) * RECT_H(*cell);
}
long total_count= RECT_W(*cell) * RECT_H(*cell);
- MUST( bg_count > 8*total_count / 10,
- MR(*cell);MIL(bg_count);MIL(white_count);MIL(black_count) );
+ MUST( bg_count > total_count / 2,
+ MR(*cell);MIL(total_count);MIL(bg_count);
+ MIL(light_count);MIL(dark_count) );
if (bg_count == total_count)
return;
if (bg_count == total_count)
return;
- MUST( !!black_count != !!white_count,
- MR(*cell);MIL(bg_count);MIL(white_count);MIL(black_count) );
+ MUST( !!dark_count != !!light_count,
+ MR(*cell);MIL(total_count);MIL(bg_count);
+ MIL(light_count);MIL(dark_count) );
- debugf("TABLEENTRY col=%d %d,%d..%d,%d bg=%ld
white=%ld blac
k=%ld\n",
+ debugf("TABLEENTRY col=%d %d,%d..%d,%d bg=%ld
light=%ld dar
k=%ld\n",
colno, cell->tl.x,cell->tl.y, cell->br.x,cell->br.y,
colno, cell->tl.x,cell->tl.y, cell->br.x,cell->br.y,
- bg_count,
white_count, blac
k_count);
+ bg_count,
light_count, dar
k_count);
- Rgb foreground= white_count ? 0xffffffU : 0;
+ Rgb foreground;
+ double fg_extra;
+ if (light_count) {
+ foreground= 0xffffffU;
+ fg_extra= +1;
+ } else {
+ foreground= 0;
+ fg_extra= -1;
+ }
int monochrome= 1;
FOR_P_RECT(p,*cell) {
int monochrome= 1;
FOR_P_RECT(p,*cell) {
@@
-493,13
+504,13
@@
static void find_table_entry(Rect commod, int colno, Rect *cell) {
unsigned char bg_chan= background >> (i*8);
unsigned char fg_chan= foreground >> (i*8);
double alpha_chan=
unsigned char bg_chan= background >> (i*8);
unsigned char fg_chan= foreground >> (i*8);
double alpha_chan=
- ((double)here_chan - (double)bg_chan) /
- ((
double)fg_chan
- (double)bg_chan);
+ ((double)here_chan
- (double)bg_chan) /
+ ((
fg_chan + fg_extra)
- (double)bg_chan);
alpha[i]= alpha_chan;
alpha_mean += alpha_chan * (1/3.0);
}
alpha[i]= alpha_chan;
alpha_mean += alpha_chan * (1/3.0);
}
- double thresh= 1.
0
/AAMAXVAL;
+ double thresh= 1.
5
/AAMAXVAL;
double alpha_min= alpha_mean - thresh;
double alpha_max= alpha_mean + thresh;
for (i=0; i<3; i++)
double alpha_min= alpha_mean - thresh;
double alpha_max= alpha_mean + thresh;
for (i=0; i<3; i++)
@@
-507,10
+518,11
@@
static void find_table_entry(Rect commod, int colno, Rect *cell) {
MI(i);MRGB(here);MRGB(background);MRGB(foreground);
MF(alpha_min);MF(alpha[i]);MF(alpha_max) );
MI(i);MRGB(here);MRGB(background);MRGB(foreground);
MF(alpha_min);MF(alpha[i]);MF(alpha_max) );
- MUST( 0 <= alpha_mean && alpha_mean <
= 1
,
+ MUST( 0 <= alpha_mean && alpha_mean <
0.999
,
MRGB(here);MRGB(background);MRGB(foreground);
MRGB(here);MRGB(background);MRGB(foreground);
- MF(alpha_mean) );
- int here_int= AAMAXVAL*alpha_mean;
+ MF(alpha_mean); MF(alpha[0]);MF(alpha[1]);MF(alpha[2]); );
+ int here_int= floor((AAMAXVAL+1)*alpha_mean);
+ assert(here_int <= AAMAXVAL);
if (!(here_int==0 || here_int==AAMAXVAL)) monochrome=0;
cim->d[p.y * cim->w + p.x]= '0' + here_int;
}
if (!(here_int==0 || here_int==AAMAXVAL)) monochrome=0;
cim->d[p.y * cim->w + p.x]= '0' + here_int;
}
@@
-527,22
+539,17
@@
static void ocr_rectangle(Rect r, const OcrCellType ct, FILE *tsv_output) {
Pixcol cols[w+1];
int x,y;
for (x=0; x<w; x++) {
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
) {
+
FILLZERO(cols[x])
;
+ for (y=0
; y<text_h; y++
) {
Point here= { x+r.tl.x, y+r.tl.y };
int pixel= get_p(here);
Point here= { x+r.tl.x, y+r.tl.y };
int pixel= get_p(here);
- switch (pixel) {
- case ' ': break;
- case '0': break;
- case '0'+AAMAXVAL: cx |= rv; break;
- default:
- MUST(!"wrong pixel",
- MC(pixel);MP(here);MSB(ocr_celltype_name(ct));MR(r); );
- }
+ if (pixel==' ') pixel= '0';
+ MUST( pixel >= '0' && pixel <= '0'+AAMAXVAL,
+ MC(pixel);MP(here);MSB(ocr_celltype_name(ct));MR(r); );
+ pixcol_p_add(&cols[x], y, pixel-'0');
}
}
- cols[x]= cx;
}
}
-
cols[w]= 0
;
+
FILLZERO(cols[w])
;
results= ocr(rd,ct,w,cols);
for (res=results; res->s; res++)
results= ocr(rd,ct,w,cols);
for (res=results; res->s; res++)