image-barcode-identifier 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -2
- package/dist/client.d.ts +13 -0
- package/dist/client.js +56 -0
- package/dist/client.js.map +1 -0
- package/dist/code128.d.ts +30 -0
- package/dist/code128.js +338 -0
- package/dist/code128.js.map +1 -0
- package/dist/cv.d.ts +8 -0
- package/dist/cv.js +38 -0
- package/dist/cv.js.map +1 -0
- package/dist/geometry.d.ts +46 -0
- package/dist/geometry.js +244 -0
- package/dist/geometry.js.map +1 -0
- package/dist/image.d.ts +10 -0
- package/dist/image.js +74 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/ops.d.ts +22 -0
- package/dist/ops.js +203 -0
- package/dist/ops.js.map +1 -0
- package/dist/pipeline.d.ts +4 -0
- package/dist/pipeline.js +234 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/protocol.d.ts +22 -0
- package/dist/protocol.js +2 -0
- package/dist/protocol.js.map +1 -0
- package/dist/types.d.ts +50 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +1 -0
- package/dist/worker.js +24 -0
- package/dist/worker.js.map +1 -0
- package/dist/zxing.d.ts +16 -0
- package/dist/zxing.js +100 -0
- package/dist/zxing.js.map +1 -0
- package/dist/zxingWasm.generated.d.ts +1 -0
- package/dist/zxingWasm.generated.js +3 -0
- package/dist/zxingWasm.generated.js.map +1 -0
- package/package.json +49 -4
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type Gray } from './ops.js';
|
|
2
|
+
import type { Point } from './types.js';
|
|
3
|
+
export type Mat3 = number[];
|
|
4
|
+
export type Mat23 = number[];
|
|
5
|
+
export type PointMap = (pts: Point[]) => Point[];
|
|
6
|
+
export declare function offsetScale(offset?: Point, scale?: number): PointMap;
|
|
7
|
+
export declare function perspectiveMap(m: Mat3): PointMap;
|
|
8
|
+
export declare function affineMap(m: Mat23): PointMap;
|
|
9
|
+
export declare function invert3x3(m: Mat3): Mat3;
|
|
10
|
+
export declare function invertAffine(m: Mat23): Mat23;
|
|
11
|
+
/** Same as cv2.getRotationMatrix2D(center, angle, 1.0). Positive angle = counter-clockwise. */
|
|
12
|
+
export declare function rotationMatrix(cx: number, cy: number, angleDeg: number): Mat23;
|
|
13
|
+
export type Rect = [x: number, y: number, w: number, h: number];
|
|
14
|
+
export declare function boundingRect(pts: Point[]): Rect;
|
|
15
|
+
export declare function iou(a: Rect, b: Rect): number;
|
|
16
|
+
/** Order as tl, tr, br, bl with the long side along x (bars vertical in the result). */
|
|
17
|
+
export declare function orderQuad(box: Point[]): Point[];
|
|
18
|
+
/** Warp the candidate quad to an upright strip. Returns the strip and the matrix strip -> original. */
|
|
19
|
+
export declare function rectify(gray: Gray, box: Point[], padX?: number, padY?: number, outWidth?: number): {
|
|
20
|
+
strip: Gray;
|
|
21
|
+
inv: Mat3;
|
|
22
|
+
};
|
|
23
|
+
/** Horizontal shear about the vertical centre; bilinear, border replicate. */
|
|
24
|
+
export declare function shear(img: Gray, angleDeg: number): Gray;
|
|
25
|
+
/**
|
|
26
|
+
* Remove residual lean of the bars (rotated quads are often not exactly aligned). Picks the shear that makes
|
|
27
|
+
* column profiles sharpest. Returns the strip and the angle used (0 when left untouched).
|
|
28
|
+
*/
|
|
29
|
+
export declare function deskewBars(strip: Gray, maxAngle?: number): {
|
|
30
|
+
strip: Gray;
|
|
31
|
+
angle: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Finds the rows of an upright strip (bars vertical) that look like bars: strong horizontal gradient, weak
|
|
35
|
+
* vertical gradient. Caption text and whitespace have strong vertical gradients or none at all. Returns the
|
|
36
|
+
* longest such run of rows, or null when the strip has no clear bar rows.
|
|
37
|
+
*
|
|
38
|
+
* Localisation boxes are often much taller than the bars (they include the printed text below), and reading
|
|
39
|
+
* rows that cross the text produces checksum-valid misreads, so decoding is also tried on just these rows.
|
|
40
|
+
*/
|
|
41
|
+
export declare function barRows(strip: Gray): {
|
|
42
|
+
y0: number;
|
|
43
|
+
y1: number;
|
|
44
|
+
} | null;
|
|
45
|
+
/** Crops a strip to its bar rows (see `barRows`), shrinking the run a little to stay clear of its edges. */
|
|
46
|
+
export declare function cropToBars(strip: Gray): Gray | null;
|
package/dist/geometry.js
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// Pure-TS geometry helpers (no OpenCV): quads, matrices, point transforms, bar de-skew.
|
|
2
|
+
import { getPerspectiveTransform, resize, warpPerspective } from './ops.js';
|
|
3
|
+
export function offsetScale(offset = [0, 0], scale = 1) {
|
|
4
|
+
return (pts) => pts.map(([x, y]) => [x / scale + offset[0], y / scale + offset[1]]);
|
|
5
|
+
}
|
|
6
|
+
export function perspectiveMap(m) {
|
|
7
|
+
return (pts) => pts.map(([x, y]) => {
|
|
8
|
+
const d = m[6] * x + m[7] * y + m[8];
|
|
9
|
+
return [(m[0] * x + m[1] * y + m[2]) / d, (m[3] * x + m[4] * y + m[5]) / d];
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export function affineMap(m) {
|
|
13
|
+
return (pts) => pts.map(([x, y]) => [m[0] * x + m[1] * y + m[2], m[3] * x + m[4] * y + m[5]]);
|
|
14
|
+
}
|
|
15
|
+
export function invert3x3(m) {
|
|
16
|
+
const [a, b, c, d, e, f, g, h, i] = m;
|
|
17
|
+
const A = e * i - f * h;
|
|
18
|
+
const B = -(d * i - f * g);
|
|
19
|
+
const C = d * h - e * g;
|
|
20
|
+
const det = a * A + b * B + c * C;
|
|
21
|
+
const id = 1 / det;
|
|
22
|
+
return [
|
|
23
|
+
A * id, -(b * i - c * h) * id, (b * f - c * e) * id,
|
|
24
|
+
B * id, (a * i - c * g) * id, -(a * f - c * d) * id,
|
|
25
|
+
C * id, -(a * h - b * g) * id, (a * e - b * d) * id,
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
export function invertAffine(m) {
|
|
29
|
+
const det = m[0] * m[4] - m[1] * m[3];
|
|
30
|
+
const a = m[4] / det;
|
|
31
|
+
const b = -m[1] / det;
|
|
32
|
+
const d = -m[3] / det;
|
|
33
|
+
const e = m[0] / det;
|
|
34
|
+
return [a, b, -(a * m[2] + b * m[5]), d, e, -(d * m[2] + e * m[5])];
|
|
35
|
+
}
|
|
36
|
+
/** Same as cv2.getRotationMatrix2D(center, angle, 1.0). Positive angle = counter-clockwise. */
|
|
37
|
+
export function rotationMatrix(cx, cy, angleDeg) {
|
|
38
|
+
const rad = (angleDeg * Math.PI) / 180;
|
|
39
|
+
const alpha = Math.cos(rad);
|
|
40
|
+
const beta = Math.sin(rad);
|
|
41
|
+
return [alpha, beta, (1 - alpha) * cx - beta * cy, -beta, alpha, beta * cx + (1 - alpha) * cy];
|
|
42
|
+
}
|
|
43
|
+
export function boundingRect(pts) {
|
|
44
|
+
const xs = pts.map((p) => p[0]);
|
|
45
|
+
const ys = pts.map((p) => p[1]);
|
|
46
|
+
const x0 = Math.floor(Math.min(...xs));
|
|
47
|
+
const y0 = Math.floor(Math.min(...ys));
|
|
48
|
+
return [x0, y0, Math.floor(Math.max(...xs)) - x0 + 1, Math.floor(Math.max(...ys)) - y0 + 1];
|
|
49
|
+
}
|
|
50
|
+
export function iou(a, b) {
|
|
51
|
+
const [ax, ay, aw, ah] = a;
|
|
52
|
+
const [bx, by, bw, bh] = b;
|
|
53
|
+
const inter = Math.max(0, Math.min(ax + aw, bx + bw) - Math.max(ax, bx)) *
|
|
54
|
+
Math.max(0, Math.min(ay + ah, by + bh) - Math.max(ay, by));
|
|
55
|
+
const union = aw * ah + bw * bh - inter;
|
|
56
|
+
return union ? inter / union : 0;
|
|
57
|
+
}
|
|
58
|
+
const dist = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1]);
|
|
59
|
+
/** Order as tl, tr, br, bl with the long side along x (bars vertical in the result). */
|
|
60
|
+
export function orderQuad(box) {
|
|
61
|
+
const argBy = (f, sign) => {
|
|
62
|
+
let best = 0;
|
|
63
|
+
for (let i = 1; i < box.length; i++)
|
|
64
|
+
if (sign * f(box[i]) < sign * f(box[best]))
|
|
65
|
+
best = i;
|
|
66
|
+
return box[best];
|
|
67
|
+
};
|
|
68
|
+
const sum = (p) => p[0] + p[1];
|
|
69
|
+
const diff = (p) => p[1] - p[0];
|
|
70
|
+
const tl = argBy(sum, 1);
|
|
71
|
+
const br = argBy(sum, -1);
|
|
72
|
+
const tr = argBy(diff, 1);
|
|
73
|
+
const bl = argBy(diff, -1);
|
|
74
|
+
if (dist(bl, tl) > dist(tr, tl))
|
|
75
|
+
return [bl, tl, tr, br]; // vertical barcode -> rotate
|
|
76
|
+
return [tl, tr, br, bl];
|
|
77
|
+
}
|
|
78
|
+
/** Warp the candidate quad to an upright strip. Returns the strip and the matrix strip -> original. */
|
|
79
|
+
export function rectify(gray, box, padX = 0.08, padY = 0, outWidth = 1600) {
|
|
80
|
+
const q = orderQuad(box);
|
|
81
|
+
const u = [q[1][0] - q[0][0], q[1][1] - q[0][1]];
|
|
82
|
+
const v = [q[3][0] - q[0][0], q[3][1] - q[0][1]];
|
|
83
|
+
const p = (base, su, sv) => [base[0] + u[0] * su + v[0] * sv, base[1] + u[1] * su + v[1] * sv];
|
|
84
|
+
const padded = [p(q[0], -padX, -padY), p(q[1], padX, -padY), p(q[2], padX, padY), p(q[3], -padX, padY)];
|
|
85
|
+
const wid = dist(padded[1], padded[0]);
|
|
86
|
+
const hei = dist(padded[3], padded[0]);
|
|
87
|
+
const outH = Math.trunc(Math.min(outWidth, Math.max(60, (outWidth * hei) / Math.max(wid, 1e-6))));
|
|
88
|
+
const dst = [[0, 0], [outWidth - 1, 0], [outWidth - 1, outH - 1], [0, outH - 1]];
|
|
89
|
+
const m = getPerspectiveTransform(padded, dst);
|
|
90
|
+
return { strip: warpPerspective(gray, m, outWidth, outH), inv: invert3x3(m) };
|
|
91
|
+
}
|
|
92
|
+
// --------------------------------------------------------------------------- //
|
|
93
|
+
// Bar de-skew
|
|
94
|
+
// --------------------------------------------------------------------------- //
|
|
95
|
+
/** Horizontal shear about the vertical centre; bilinear, border replicate. */
|
|
96
|
+
export function shear(img, angleDeg) {
|
|
97
|
+
const { width: w, height: h, data } = img;
|
|
98
|
+
const t = Math.tan((angleDeg * Math.PI) / 180);
|
|
99
|
+
const out = new Uint8Array(w * h);
|
|
100
|
+
for (let y = 0; y < h; y++) {
|
|
101
|
+
const s = t * (y - h / 2);
|
|
102
|
+
const row = y * w;
|
|
103
|
+
for (let x = 0; x < w; x++) {
|
|
104
|
+
let sx = x - s;
|
|
105
|
+
if (sx <= 0)
|
|
106
|
+
sx = 0;
|
|
107
|
+
else if (sx >= w - 1)
|
|
108
|
+
sx = w - 1;
|
|
109
|
+
const i = Math.floor(sx);
|
|
110
|
+
const f = sx - i;
|
|
111
|
+
const j = i + 1 < w ? i + 1 : i;
|
|
112
|
+
out[row + x] = Math.round(data[row + i] * (1 - f) + data[row + j] * f);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return { data: out, width: w, height: h };
|
|
116
|
+
}
|
|
117
|
+
/** Sum of |column-profile differences| of the sheared image: sharper bars give a larger score. */
|
|
118
|
+
function shearScore(img, angleDeg) {
|
|
119
|
+
const { width: w, height: h, data } = img;
|
|
120
|
+
const t = Math.tan((angleDeg * Math.PI) / 180);
|
|
121
|
+
const col = new Float64Array(w);
|
|
122
|
+
for (let y = 0; y < h; y++) {
|
|
123
|
+
const s = t * (y - h / 2);
|
|
124
|
+
const row = y * w;
|
|
125
|
+
for (let x = 0; x < w; x++) {
|
|
126
|
+
let sx = x - s;
|
|
127
|
+
if (sx <= 0)
|
|
128
|
+
sx = 0;
|
|
129
|
+
else if (sx >= w - 1)
|
|
130
|
+
sx = w - 1;
|
|
131
|
+
const i = Math.floor(sx);
|
|
132
|
+
const f = sx - i;
|
|
133
|
+
const j = i + 1 < w ? i + 1 : i;
|
|
134
|
+
col[x] += data[row + i] * (1 - f) + data[row + j] * f;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
let score = 0;
|
|
138
|
+
for (let x = 1; x < w; x++)
|
|
139
|
+
score += Math.abs(col[x] - col[x - 1]);
|
|
140
|
+
return score / h;
|
|
141
|
+
}
|
|
142
|
+
function argMaxFirst(values, score) {
|
|
143
|
+
let best = values[0];
|
|
144
|
+
let bestScore = score(best);
|
|
145
|
+
for (let i = 1; i < values.length; i++) {
|
|
146
|
+
const s = score(values[i]);
|
|
147
|
+
if (s > bestScore) {
|
|
148
|
+
best = values[i];
|
|
149
|
+
bestScore = s;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return best;
|
|
153
|
+
}
|
|
154
|
+
function arange(start, stop, step) {
|
|
155
|
+
const n = Math.ceil((stop - start) / step);
|
|
156
|
+
return Array.from({ length: n }, (_, i) => start + i * step);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Remove residual lean of the bars (rotated quads are often not exactly aligned). Picks the shear that makes
|
|
160
|
+
* column profiles sharpest. Returns the strip and the angle used (0 when left untouched).
|
|
161
|
+
*/
|
|
162
|
+
export function deskewBars(strip, maxAngle = 20) {
|
|
163
|
+
const sw = 800;
|
|
164
|
+
const sh = Math.max(8, Math.trunc((strip.height * 800) / strip.width));
|
|
165
|
+
const resized = resize(strip, sw, sh, 'area');
|
|
166
|
+
const keep = Math.max(8, Math.trunc(resized.height * 0.65)); // bars only, skip caption text
|
|
167
|
+
const small = { data: resized.data.subarray(0, keep * sw), width: sw, height: keep };
|
|
168
|
+
const score = (a) => shearScore(small, a);
|
|
169
|
+
const coarse = argMaxFirst(arange(-maxAngle, maxAngle + 0.1, 1), score);
|
|
170
|
+
const best = argMaxFirst(arange(coarse - 1, coarse + 1.01, 0.25), score);
|
|
171
|
+
if (Math.abs(best) < 0.4)
|
|
172
|
+
return { strip, angle: 0 };
|
|
173
|
+
return { strip: shear(strip, best), angle: best };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Finds the rows of an upright strip (bars vertical) that look like bars: strong horizontal gradient, weak
|
|
177
|
+
* vertical gradient. Caption text and whitespace have strong vertical gradients or none at all. Returns the
|
|
178
|
+
* longest such run of rows, or null when the strip has no clear bar rows.
|
|
179
|
+
*
|
|
180
|
+
* Localisation boxes are often much taller than the bars (they include the printed text below), and reading
|
|
181
|
+
* rows that cross the text produces checksum-valid misreads, so decoding is also tried on just these rows.
|
|
182
|
+
*/
|
|
183
|
+
export function barRows(strip) {
|
|
184
|
+
const { width: w, height: h, data } = strip;
|
|
185
|
+
if (h < 12)
|
|
186
|
+
return null;
|
|
187
|
+
const score = new Float64Array(h);
|
|
188
|
+
for (let y = 0; y < h; y++) {
|
|
189
|
+
const row = y * w;
|
|
190
|
+
let eh = 0;
|
|
191
|
+
for (let x = 1; x < w; x++)
|
|
192
|
+
eh += Math.abs(data[row + x] - data[row + x - 1]);
|
|
193
|
+
let ev = 0;
|
|
194
|
+
if (y + 1 < h)
|
|
195
|
+
for (let x = 0; x < w; x++)
|
|
196
|
+
ev += Math.abs(data[row + w + x] - data[row + x]);
|
|
197
|
+
score[y] = Math.max(0, eh - 1.5 * ev) / w;
|
|
198
|
+
}
|
|
199
|
+
// smooth over ~2% of the height
|
|
200
|
+
const k = Math.max(1, Math.round(h * 0.01));
|
|
201
|
+
const smooth = new Float64Array(h);
|
|
202
|
+
for (let y = 0; y < h; y++) {
|
|
203
|
+
let acc = 0;
|
|
204
|
+
let n = 0;
|
|
205
|
+
for (let j = Math.max(0, y - k); j <= Math.min(h - 1, y + k); j++, n++)
|
|
206
|
+
acc += score[j];
|
|
207
|
+
smooth[y] = acc / n;
|
|
208
|
+
}
|
|
209
|
+
const max = Math.max(...smooth);
|
|
210
|
+
if (max < 1)
|
|
211
|
+
return null;
|
|
212
|
+
const threshold = 0.5 * max;
|
|
213
|
+
let bestRun = null;
|
|
214
|
+
let y = 0;
|
|
215
|
+
while (y < h) {
|
|
216
|
+
if (smooth[y] < threshold) {
|
|
217
|
+
y++;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
let end = y;
|
|
221
|
+
while (end + 1 < h && smooth[end + 1] >= threshold)
|
|
222
|
+
end++;
|
|
223
|
+
if (!bestRun || end - y > bestRun.y1 - bestRun.y0)
|
|
224
|
+
bestRun = { y0: y, y1: end };
|
|
225
|
+
y = end + 1;
|
|
226
|
+
}
|
|
227
|
+
if (!bestRun || bestRun.y1 - bestRun.y0 < 8)
|
|
228
|
+
return null;
|
|
229
|
+
return bestRun;
|
|
230
|
+
}
|
|
231
|
+
/** Crops a strip to its bar rows (see `barRows`), shrinking the run a little to stay clear of its edges. */
|
|
232
|
+
export function cropToBars(strip) {
|
|
233
|
+
const run = barRows(strip);
|
|
234
|
+
if (!run)
|
|
235
|
+
return null;
|
|
236
|
+
const margin = Math.round((run.y1 - run.y0) * 0.1);
|
|
237
|
+
const y0 = run.y0 + margin;
|
|
238
|
+
const y1 = run.y1 - margin;
|
|
239
|
+
if (y1 - y0 < 6)
|
|
240
|
+
return null;
|
|
241
|
+
const w = strip.width;
|
|
242
|
+
return { data: strip.data.slice(y0 * w, (y1 + 1) * w), width: w, height: y1 - y0 + 1 };
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"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"}
|
package/dist/image.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Gray } from './ops.js';
|
|
2
|
+
import type { ImageInput } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Decodes the input to an 8-bit gray image no larger than `maxEdge` on its longest side. `scale` is
|
|
5
|
+
* output size / input size, used to map result positions back to the input image.
|
|
6
|
+
*/
|
|
7
|
+
export declare function toGray(input: ImageInput, maxEdge: number): Promise<{
|
|
8
|
+
gray: Gray;
|
|
9
|
+
scale: number;
|
|
10
|
+
}>;
|
package/dist/image.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { resize } from './ops.js';
|
|
2
|
+
function isRawImage(input) {
|
|
3
|
+
const i = input;
|
|
4
|
+
return typeof i === 'object' && i !== null && typeof i.width === 'number' && typeof i.height === 'number' && i.data !== undefined;
|
|
5
|
+
}
|
|
6
|
+
function rgbaToGray(data, width, height) {
|
|
7
|
+
const out = new Uint8Array(width * height);
|
|
8
|
+
for (let i = 0, j = 0; i < out.length; i++, j += 4) {
|
|
9
|
+
out[i] = (data[j] * 4899 + data[j + 1] * 9617 + data[j + 2] * 1868 + 8192) >> 14; // 0.299 R + 0.587 G + 0.114 B
|
|
10
|
+
}
|
|
11
|
+
return { data: out, width, height };
|
|
12
|
+
}
|
|
13
|
+
function createCanvas(width, height) {
|
|
14
|
+
if (typeof OffscreenCanvas !== 'undefined')
|
|
15
|
+
return new OffscreenCanvas(width, height);
|
|
16
|
+
const canvas = document.createElement('canvas');
|
|
17
|
+
canvas.width = width;
|
|
18
|
+
canvas.height = height;
|
|
19
|
+
return canvas;
|
|
20
|
+
}
|
|
21
|
+
function sourceSize(source) {
|
|
22
|
+
if (typeof HTMLImageElement !== 'undefined' && source instanceof HTMLImageElement) {
|
|
23
|
+
return { width: source.naturalWidth, height: source.naturalHeight };
|
|
24
|
+
}
|
|
25
|
+
return { width: source.width, height: source.height };
|
|
26
|
+
}
|
|
27
|
+
function drawToGray(source, maxEdge) {
|
|
28
|
+
const { width: sw, height: sh } = sourceSize(source);
|
|
29
|
+
if (!sw || !sh)
|
|
30
|
+
throw new Error('The image has no pixels');
|
|
31
|
+
const scale = Math.min(1, maxEdge / Math.max(sw, sh));
|
|
32
|
+
const w = Math.max(1, Math.round(sw * scale));
|
|
33
|
+
const h = Math.max(1, Math.round(sh * scale));
|
|
34
|
+
const canvas = createCanvas(w, h);
|
|
35
|
+
const ctx = canvas.getContext('2d', { willReadFrequently: true });
|
|
36
|
+
if (!ctx)
|
|
37
|
+
throw new Error('2D canvas is not available');
|
|
38
|
+
ctx.imageSmoothingQuality = 'high';
|
|
39
|
+
ctx.drawImage(source, 0, 0, w, h);
|
|
40
|
+
const { data } = ctx.getImageData(0, 0, w, h);
|
|
41
|
+
return { gray: rgbaToGray(data, w, h), scale: w / sw };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Decodes the input to an 8-bit gray image no larger than `maxEdge` on its longest side. `scale` is
|
|
45
|
+
* output size / input size, used to map result positions back to the input image.
|
|
46
|
+
*/
|
|
47
|
+
export async function toGray(input, maxEdge) {
|
|
48
|
+
if (isRawImage(input)) {
|
|
49
|
+
const gray = rgbaToGray(input.data, input.width, input.height);
|
|
50
|
+
const scale = Math.min(1, maxEdge / Math.max(input.width, input.height));
|
|
51
|
+
if (scale === 1)
|
|
52
|
+
return { gray, scale };
|
|
53
|
+
const w = Math.round(input.width * scale);
|
|
54
|
+
const h = Math.round(input.height * scale);
|
|
55
|
+
return { gray: resize(gray, w, h, 'area'), scale: w / input.width };
|
|
56
|
+
}
|
|
57
|
+
if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {
|
|
58
|
+
input = new Blob([input]);
|
|
59
|
+
}
|
|
60
|
+
if (typeof Blob !== 'undefined' && input instanceof Blob) {
|
|
61
|
+
if (typeof createImageBitmap !== 'function') {
|
|
62
|
+
throw new Error('Decoding an encoded image (Blob/File/bytes) needs a browser or Web Worker. In Node pass raw RGBA pixels: { data, width, height }.');
|
|
63
|
+
}
|
|
64
|
+
const bitmap = await createImageBitmap(input);
|
|
65
|
+
try {
|
|
66
|
+
return drawToGray(bitmap, maxEdge);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
bitmap.close();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return drawToGray(input, maxEdge);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BarcodeReaderConfig, BarcodeResult, ImageInput, ReadOptions } from './types.js';
|
|
2
|
+
export type { BarcodeReaderConfig, BarcodeResult, ImageInput, Point, RawImage, ReadOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Optional. Everything works without configuration: the ZXing WASM is embedded in the package and OpenCV.js
|
|
5
|
+
* is imported on demand. Call this once, before the first read, only to change that.
|
|
6
|
+
*/
|
|
7
|
+
export declare function configure(config?: BarcodeReaderConfig): void;
|
|
8
|
+
/** Download and compile OpenCV + ZXing now, so the first read is fast. */
|
|
9
|
+
export declare function warmup(): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Reads every barcode it can find in an image (or the first one, see `options.all`). Resolves with an empty
|
|
12
|
+
* array when nothing was found.
|
|
13
|
+
*
|
|
14
|
+
* This is CPU heavy (hundreds of ms to several seconds on a phone) and runs on the calling thread. In a UI use
|
|
15
|
+
* the Web Worker client from `image-barcode-identifier/client` instead.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readBarcodes(input: ImageInput, options?: ReadOptions): Promise<BarcodeResult[]>;
|
|
18
|
+
/** The value of the first barcode found, or `null` when there is none. */
|
|
19
|
+
export declare function readBarcode(input: ImageInput, options?: ReadOptions): Promise<string | null>;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { loadCv, setOpencvLoader } from './cv.js';
|
|
2
|
+
import { toGray } from './image.js';
|
|
3
|
+
import { readGray } from './pipeline.js';
|
|
4
|
+
import { configureZxing, warmupZxing } from './zxing.js';
|
|
5
|
+
/**
|
|
6
|
+
* Optional. Everything works without configuration: the ZXing WASM is embedded in the package and OpenCV.js
|
|
7
|
+
* is imported on demand. Call this once, before the first read, only to change that.
|
|
8
|
+
*/
|
|
9
|
+
export function configure(config = {}) {
|
|
10
|
+
setOpencvLoader(config.opencvLoader);
|
|
11
|
+
configureZxing(config);
|
|
12
|
+
}
|
|
13
|
+
/** Download and compile OpenCV + ZXing now, so the first read is fast. */
|
|
14
|
+
export async function warmup() {
|
|
15
|
+
await Promise.all([loadCv(), warmupZxing()]);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Reads every barcode it can find in an image (or the first one, see `options.all`). Resolves with an empty
|
|
19
|
+
* array when nothing was found.
|
|
20
|
+
*
|
|
21
|
+
* This is CPU heavy (hundreds of ms to several seconds on a phone) and runs on the calling thread. In a UI use
|
|
22
|
+
* the Web Worker client from `image-barcode-identifier/client` instead.
|
|
23
|
+
*/
|
|
24
|
+
export async function readBarcodes(input, options = {}) {
|
|
25
|
+
await loadCv();
|
|
26
|
+
const { gray, scale } = await toGray(input, options.maxEdge ?? 4096);
|
|
27
|
+
const results = await readGray(gray, options);
|
|
28
|
+
if (scale === 1)
|
|
29
|
+
return results;
|
|
30
|
+
return results.map((r) => ({
|
|
31
|
+
...r,
|
|
32
|
+
position: r.position && r.position.map(([x, y]) => [Math.round(x / scale), Math.round(y / scale)]),
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
/** The value of the first barcode found, or `null` when there is none. */
|
|
36
|
+
export async function readBarcode(input, options = {}) {
|
|
37
|
+
const [first] = await readBarcodes(input, { ...options, all: false });
|
|
38
|
+
return first ? first.text : null;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIzD;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,SAA8B,EAAE;IACxD,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACrC,cAAc,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAiB,EAAE,UAAuB,EAAE;IAC7E,MAAM,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,GAAG,CAAC;QACJ,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;KACnG,CAAC,CAAC,CAAC;AACN,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAiB,EAAE,UAAuB,EAAE;IAC5E,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC"}
|
package/dist/ops.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Point } from './types.js';
|
|
2
|
+
export interface Gray {
|
|
3
|
+
data: Uint8Array;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function clahe(g: Gray): Gray;
|
|
8
|
+
export declare function sharpen(g: Gray): Gray;
|
|
9
|
+
export declare function otsu(g: Gray): Gray;
|
|
10
|
+
export declare function adaptive(g: Gray): Gray;
|
|
11
|
+
export declare function denoiseOtsu(g: Gray): Gray;
|
|
12
|
+
/** Horizontal-only blur: suppresses moire / noise inside bars without smearing bar edges vertically. */
|
|
13
|
+
export declare function hblur(g: Gray): Gray;
|
|
14
|
+
export declare function resize(g: Gray, width: number, height: number, mode: 'cubic' | 'area'): Gray;
|
|
15
|
+
export declare function crop(g: Gray, x: number, y: number, w: number, h: number): Gray;
|
|
16
|
+
/** `m` is a row-major 3x3 matrix mapping source -> destination (like cv2.warpPerspective). */
|
|
17
|
+
export declare function warpPerspective(g: Gray, m: number[], width: number, height: number): Gray;
|
|
18
|
+
/** `m` is a row-major 2x3 matrix mapping source -> destination (like cv2.warpAffine). */
|
|
19
|
+
export declare function warpAffine(g: Gray, m: number[], width: number, height: number): Gray;
|
|
20
|
+
/** Row-major 3x3 matrix mapping the 4 `src` points onto the 4 `dst` points. */
|
|
21
|
+
export declare function getPerspectiveTransform(src: Point[], dst: Point[]): number[];
|
|
22
|
+
export declare function gradientCandidates(gray: Gray, maxCandidates?: number): Point[][];
|