scanic 0.1.5 → 0.1.7
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 +40 -10
- package/dist/scanic.js +324 -508
- package/dist/scanic.js.map +1 -1
- package/dist/scanic.umd.cjs +1 -1
- package/dist/scanic.umd.cjs.map +1 -1
- package/package.json +10 -2
package/dist/scanic.js
CHANGED
|
@@ -2,7 +2,7 @@ const K = {
|
|
|
2
2
|
// Contour detection params
|
|
3
3
|
MIN_CONTOUR_AREA: 1e3,
|
|
4
4
|
MIN_CONTOUR_POINTS: 10
|
|
5
|
-
}, O = 0, z = 1, x = 2,
|
|
5
|
+
}, O = 0, z = 1, x = 2, U = [
|
|
6
6
|
{ dx: 0, dy: -1 },
|
|
7
7
|
// 0: Top
|
|
8
8
|
{ dx: 1, dy: -1 },
|
|
@@ -21,93 +21,93 @@ const K = {
|
|
|
21
21
|
// 7: Top-left
|
|
22
22
|
];
|
|
23
23
|
function V(I, A = {}) {
|
|
24
|
-
const g = A.width || Math.sqrt(I.length), C = A.height || I.length / g, E = A.mode !== void 0 ? A.mode : z, B = A.method !== void 0 ? A.method : x, Q = A.minArea || K.MIN_CONTOUR_AREA, i = g + 2, s = C + 2,
|
|
25
|
-
for (let
|
|
26
|
-
for (let
|
|
27
|
-
I[
|
|
28
|
-
const
|
|
29
|
-
let
|
|
30
|
-
for (let
|
|
31
|
-
for (let
|
|
32
|
-
const
|
|
33
|
-
let
|
|
34
|
-
if (
|
|
35
|
-
if (E === O && !
|
|
36
|
-
|
|
24
|
+
const g = A.width || Math.sqrt(I.length), C = A.height || I.length / g, E = A.mode !== void 0 ? A.mode : z, B = A.method !== void 0 ? A.method : x, Q = A.minArea || K.MIN_CONTOUR_AREA, i = g + 2, s = C + 2, o = new Int32Array(i * s);
|
|
25
|
+
for (let D = 0; D < C; D++)
|
|
26
|
+
for (let c = 0; c < g; c++)
|
|
27
|
+
I[D * g + c] > 0 && (o[(D + 1) * i + (c + 1)] = 1);
|
|
28
|
+
const t = [];
|
|
29
|
+
let e = 2;
|
|
30
|
+
for (let D = 1; D <= C; D++)
|
|
31
|
+
for (let c = 1; c <= g; c++) {
|
|
32
|
+
const y = o[D * i + c], w = o[D * i + (c - 1)];
|
|
33
|
+
let n = null, h = !1, N = -1;
|
|
34
|
+
if (y === 1 && w === 0 ? (h = !0, n = { x: c, y: D }, N = 2) : y === 0 && w >= 1 && w !== -1 && w === 1 && (h = !1, n = { x: c - 1, y: D }, N = 6), n) {
|
|
35
|
+
if (E === O && !h) {
|
|
36
|
+
o[n.y * i + n.x] = -1;
|
|
37
37
|
continue;
|
|
38
38
|
}
|
|
39
|
-
const F =
|
|
40
|
-
if (
|
|
41
|
-
let
|
|
42
|
-
B === x && (
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
45
|
-
const
|
|
39
|
+
const F = e++, G = _(o, i, s, n, N, F);
|
|
40
|
+
if (G && G.length > 0) {
|
|
41
|
+
let S = G;
|
|
42
|
+
B === x && (S = $(G));
|
|
43
|
+
const J = S.map((k) => ({ x: k.x - 1, y: k.y - 1 }));
|
|
44
|
+
if (J.length >= (B === x ? 4 : K.MIN_CONTOUR_POINTS)) {
|
|
45
|
+
const k = {
|
|
46
46
|
id: F,
|
|
47
|
-
points:
|
|
48
|
-
isOuter:
|
|
47
|
+
points: J,
|
|
48
|
+
isOuter: h
|
|
49
49
|
// Calculate area and bounding box later if needed for filtering/sorting
|
|
50
50
|
};
|
|
51
|
-
|
|
51
|
+
t.push(k);
|
|
52
52
|
}
|
|
53
53
|
} else
|
|
54
|
-
|
|
54
|
+
o[n.y * i + n.x] === 1 && (o[n.y * i + n.x] = F);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
t.forEach((D) => {
|
|
58
|
+
D.area = AA(D.points), D.boundingBox = IA(D.points);
|
|
59
59
|
});
|
|
60
|
-
const
|
|
61
|
-
return
|
|
60
|
+
const a = t.filter((D) => D.area >= Q);
|
|
61
|
+
return a.sort((D, c) => c.area - D.area), A.debug && (A.debug.labels = o, A.debug.rawContours = t, A.debug.finalContours = a), a;
|
|
62
62
|
}
|
|
63
63
|
function _(I, A, g, C, E, B) {
|
|
64
64
|
const Q = [], i = /* @__PURE__ */ new Set();
|
|
65
|
-
let s = { ...C },
|
|
65
|
+
let s = { ...C }, o = -1;
|
|
66
66
|
I[C.y * A + C.x] = B;
|
|
67
|
-
let
|
|
68
|
-
const
|
|
69
|
-
for (;
|
|
70
|
-
let
|
|
71
|
-
if (
|
|
72
|
-
let
|
|
73
|
-
for (let
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
if (
|
|
77
|
-
|
|
67
|
+
let t = 0;
|
|
68
|
+
const e = A * g;
|
|
69
|
+
for (; t++ < e; ) {
|
|
70
|
+
let a;
|
|
71
|
+
if (o === -1) {
|
|
72
|
+
let y = !1;
|
|
73
|
+
for (let w = 0; w < 8; w++) {
|
|
74
|
+
a = (E + w) % 8;
|
|
75
|
+
const n = s.x + U[a].dx, h = s.y + U[a].dy;
|
|
76
|
+
if (n >= 0 && n < A && h >= 0 && h < g && I[h * A + n] > 0) {
|
|
77
|
+
y = !0;
|
|
78
78
|
break;
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
|
-
if (!
|
|
81
|
+
if (!y) return null;
|
|
82
82
|
} else
|
|
83
|
-
|
|
84
|
-
let
|
|
85
|
-
for (let
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
|
|
83
|
+
a = (o + 2) % 8;
|
|
84
|
+
let D = null;
|
|
85
|
+
for (let y = 0; y < 8; y++) {
|
|
86
|
+
const w = (a + y) % 8, n = s.x + U[w].dx, h = s.y + U[w].dy;
|
|
87
|
+
if (n >= 0 && n < A && h >= 0 && h < g && I[h * A + n] > 0) {
|
|
88
|
+
D = { x: n, y: h }, o = (w + 4) % 8;
|
|
89
89
|
break;
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
-
if (!
|
|
92
|
+
if (!D) {
|
|
93
93
|
Q.length === 0 && Q.push({ ...s }), console.warn(`Contour tracing stopped unexpectedly at (${s.x - 1}, ${s.y - 1}) for contour ${B}`);
|
|
94
94
|
break;
|
|
95
95
|
}
|
|
96
|
-
const
|
|
97
|
-
if (i.has(
|
|
96
|
+
const c = `${s.x},${s.y}`;
|
|
97
|
+
if (i.has(c))
|
|
98
98
|
return Q;
|
|
99
|
-
if (Q.push({ ...s }), i.add(
|
|
99
|
+
if (Q.push({ ...s }), i.add(c), I[D.y * A + D.x] === 1 && (I[D.y * A + D.x] = B), s = D, s.x === C.x && s.y === C.y)
|
|
100
100
|
break;
|
|
101
101
|
}
|
|
102
|
-
return
|
|
102
|
+
return t >= e ? (console.warn(`Contour tracing exceeded max steps for contour ${B}`), null) : Q;
|
|
103
103
|
}
|
|
104
104
|
function $(I) {
|
|
105
105
|
if (I.length <= 2)
|
|
106
106
|
return I;
|
|
107
107
|
const A = [], g = I.length;
|
|
108
108
|
for (let C = 0; C < g; C++) {
|
|
109
|
-
const E = I[(C + g - 1) % g], B = I[C], Q = I[(C + 1) % g], i = B.x - E.x, s = B.y - E.y,
|
|
110
|
-
i *
|
|
109
|
+
const E = I[(C + g - 1) % g], B = I[C], Q = I[(C + 1) % g], i = B.x - E.x, s = B.y - E.y, o = Q.x - B.x, t = Q.y - B.y;
|
|
110
|
+
i * t !== s * o && A.push(B);
|
|
111
111
|
}
|
|
112
112
|
if (A.length === 0 && g > 0) {
|
|
113
113
|
if (g === 1) return [I[0]];
|
|
@@ -142,7 +142,7 @@ function IA(I) {
|
|
|
142
142
|
}
|
|
143
143
|
return { minX: A, minY: g, maxX: C, maxY: E };
|
|
144
144
|
}
|
|
145
|
-
function
|
|
145
|
+
function u(I, A = 1) {
|
|
146
146
|
if (I.length <= 2)
|
|
147
147
|
return I;
|
|
148
148
|
let g = 0, C = 0;
|
|
@@ -152,7 +152,7 @@ function q(I, A = 1) {
|
|
|
152
152
|
i > g && (g = i, C = Q);
|
|
153
153
|
}
|
|
154
154
|
if (g > A) {
|
|
155
|
-
const Q =
|
|
155
|
+
const Q = u(I.slice(0, C + 1), A), i = u(I.slice(C), A);
|
|
156
156
|
return Q.slice(0, -1).concat(i);
|
|
157
157
|
} else
|
|
158
158
|
return [E, B];
|
|
@@ -166,12 +166,12 @@ function gA(I, A, g) {
|
|
|
166
166
|
const Q = ((I.x - A.x) * C + (I.y - A.y) * E) / B;
|
|
167
167
|
let i, s;
|
|
168
168
|
Q < 0 ? (i = A.x, s = A.y) : Q > 1 ? (i = g.x, s = g.y) : (i = A.x + Q * C, s = A.y + Q * E);
|
|
169
|
-
const
|
|
170
|
-
return Math.sqrt(
|
|
169
|
+
const o = I.x - i, t = I.y - s;
|
|
170
|
+
return Math.sqrt(o * o + t * t);
|
|
171
171
|
}
|
|
172
172
|
function BA(I, A = 0.02) {
|
|
173
173
|
const g = QA(I), C = A * g;
|
|
174
|
-
return
|
|
174
|
+
return u(I, C);
|
|
175
175
|
}
|
|
176
176
|
function QA(I) {
|
|
177
177
|
let A = 0;
|
|
@@ -197,14 +197,14 @@ function EA(I, A = {}) {
|
|
|
197
197
|
return console.warn("Contour does not have enough points for corner detection"), null;
|
|
198
198
|
const g = A.epsilon || 0.02, C = BA(I, g);
|
|
199
199
|
let E;
|
|
200
|
-
return C && C.length === 4 ? E =
|
|
200
|
+
return C && C.length === 4 ? E = oA(C) : E = iA(I.points), !E || !E.topLeft || !E.topRight || !E.bottomRight || !E.bottomLeft ? (console.warn("Failed to find all four corners.", E), null) : (console.log("Corner points:", E), E);
|
|
201
201
|
}
|
|
202
202
|
function iA(I) {
|
|
203
203
|
if (!I || I.length === 0) return null;
|
|
204
204
|
let A = I[0], g = I[0], C = I[0], E = I[0], B = A.x + A.y, Q = g.x - g.y, i = C.x + C.y, s = E.x - E.y;
|
|
205
|
-
for (let
|
|
206
|
-
const
|
|
207
|
-
|
|
205
|
+
for (let o = 1; o < I.length; o++) {
|
|
206
|
+
const t = I[o], e = t.x + t.y, a = t.x - t.y;
|
|
207
|
+
e < B && (B = e, A = t), e > i && (i = e, C = t), a > Q && (Q = a, g = t), a < s && (s = a, E = t);
|
|
208
208
|
}
|
|
209
209
|
return {
|
|
210
210
|
topLeft: A,
|
|
@@ -213,12 +213,12 @@ function iA(I) {
|
|
|
213
213
|
bottomLeft: E
|
|
214
214
|
};
|
|
215
215
|
}
|
|
216
|
-
function
|
|
216
|
+
function oA(I) {
|
|
217
217
|
if (I.length !== 4)
|
|
218
218
|
return console.warn(`Expected 4 points, got ${I.length}`), null;
|
|
219
219
|
const A = CA(I), g = [...I].sort((Q, i) => {
|
|
220
|
-
const s = Math.atan2(Q.y - A.y, Q.x - A.x),
|
|
221
|
-
return s -
|
|
220
|
+
const s = Math.atan2(Q.y - A.y, Q.x - A.x), o = Math.atan2(i.y - A.y, i.x - A.x);
|
|
221
|
+
return s - o;
|
|
222
222
|
});
|
|
223
223
|
let C = 1 / 0, E = 0;
|
|
224
224
|
for (let Q = 0; Q < 4; Q++) {
|
|
@@ -238,58 +238,58 @@ function tA(I) {
|
|
|
238
238
|
bottomLeft: B[3]
|
|
239
239
|
};
|
|
240
240
|
}
|
|
241
|
-
let
|
|
242
|
-
function
|
|
243
|
-
return (
|
|
241
|
+
let r, L = null;
|
|
242
|
+
function T() {
|
|
243
|
+
return (L === null || L.byteLength === 0) && (L = new Uint8Array(r.memory.buffer)), L;
|
|
244
244
|
}
|
|
245
|
-
let
|
|
246
|
-
function
|
|
245
|
+
let M = 0;
|
|
246
|
+
function Z(I, A) {
|
|
247
247
|
const g = A(I.length * 1, 1) >>> 0;
|
|
248
|
-
return
|
|
248
|
+
return T().set(I, g / 1), M = I.length, g;
|
|
249
249
|
}
|
|
250
250
|
function b(I, A) {
|
|
251
|
-
return I = I >>> 0,
|
|
251
|
+
return I = I >>> 0, T().subarray(I / 1, I / 1 + A);
|
|
252
252
|
}
|
|
253
253
|
function sA(I, A, g, C) {
|
|
254
|
-
const E =
|
|
254
|
+
const E = Z(I, r.__wbindgen_malloc), B = M, Q = r.dilate(E, B, A, g, C);
|
|
255
255
|
var i = b(Q[0], Q[1]).slice();
|
|
256
|
-
return
|
|
256
|
+
return r.__wbindgen_free(Q[0], Q[1] * 1, 1), i;
|
|
257
257
|
}
|
|
258
|
-
let
|
|
259
|
-
function
|
|
260
|
-
return (
|
|
258
|
+
let Y = null;
|
|
259
|
+
function X() {
|
|
260
|
+
return (Y === null || Y.byteLength === 0) && (Y = new Float32Array(r.memory.buffer)), Y;
|
|
261
261
|
}
|
|
262
|
-
function
|
|
262
|
+
function tA(I, A) {
|
|
263
263
|
const g = A(I.length * 4, 4) >>> 0;
|
|
264
|
-
return
|
|
264
|
+
return X().set(I, g / 4), M = I.length, g;
|
|
265
265
|
}
|
|
266
|
-
function
|
|
267
|
-
const B =
|
|
266
|
+
function aA(I, A, g, C, E) {
|
|
267
|
+
const B = tA(I, r.__wbindgen_malloc), Q = M, i = r.hysteresis_thresholding(B, Q, A, g, C, E);
|
|
268
268
|
var s = b(i[0], i[1]).slice();
|
|
269
|
-
return
|
|
269
|
+
return r.__wbindgen_free(i[0], i[1] * 1, 1), s;
|
|
270
270
|
}
|
|
271
|
-
function
|
|
272
|
-
const B =
|
|
271
|
+
function DA(I, A, g, C, E) {
|
|
272
|
+
const B = Z(I, r.__wbindgen_malloc), Q = M, i = r.blur(B, Q, A, g, C, E);
|
|
273
273
|
var s = b(i[0], i[1]).slice();
|
|
274
|
-
return
|
|
274
|
+
return r.__wbindgen_free(i[0], i[1] * 1, 1), s;
|
|
275
275
|
}
|
|
276
|
-
let
|
|
277
|
-
function
|
|
278
|
-
return (
|
|
276
|
+
let d = null;
|
|
277
|
+
function eA() {
|
|
278
|
+
return (d === null || d.byteLength === 0) && (d = new Uint16Array(r.memory.buffer)), d;
|
|
279
279
|
}
|
|
280
280
|
function p(I, A) {
|
|
281
281
|
const g = A(I.length * 2, 2) >>> 0;
|
|
282
|
-
return
|
|
282
|
+
return eA().set(I, g / 2), M = I.length, g;
|
|
283
283
|
}
|
|
284
|
-
function
|
|
285
|
-
return I = I >>> 0,
|
|
284
|
+
function cA(I, A) {
|
|
285
|
+
return I = I >>> 0, X().subarray(I / 4, I / 4 + A);
|
|
286
286
|
}
|
|
287
|
-
function
|
|
288
|
-
const B = p(I,
|
|
289
|
-
var
|
|
290
|
-
return
|
|
287
|
+
function nA(I, A, g, C, E) {
|
|
288
|
+
const B = p(I, r.__wbindgen_malloc), Q = M, i = p(A, r.__wbindgen_malloc), s = M, o = r.non_maximum_suppression(B, Q, i, s, g, C, E);
|
|
289
|
+
var t = cA(o[0], o[1]).slice();
|
|
290
|
+
return r.__wbindgen_free(o[0], o[1] * 4, 4), t;
|
|
291
291
|
}
|
|
292
|
-
async function
|
|
292
|
+
async function yA(I, A) {
|
|
293
293
|
if (typeof Response == "function" && I instanceof Response) {
|
|
294
294
|
if (typeof WebAssembly.instantiateStreaming == "function")
|
|
295
295
|
try {
|
|
@@ -307,53 +307,53 @@ async function hA(I, A) {
|
|
|
307
307
|
return g instanceof WebAssembly.Instance ? { instance: g, module: I } : g;
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
|
-
function
|
|
310
|
+
function wA() {
|
|
311
311
|
const I = {};
|
|
312
312
|
return I.wbg = {}, I.wbg.__wbindgen_init_externref_table = function() {
|
|
313
|
-
const A =
|
|
313
|
+
const A = r.__wbindgen_export_0, g = A.grow(4);
|
|
314
314
|
A.set(0, void 0), A.set(g + 0, void 0), A.set(g + 1, null), A.set(g + 2, !0), A.set(g + 3, !1);
|
|
315
315
|
}, I;
|
|
316
316
|
}
|
|
317
|
-
function
|
|
318
|
-
return
|
|
317
|
+
function hA(I, A) {
|
|
318
|
+
return r = I.exports, P.__wbindgen_wasm_module = A, Y = null, d = null, L = null, r.__wbindgen_start(), r;
|
|
319
319
|
}
|
|
320
320
|
async function P(I) {
|
|
321
|
-
if (
|
|
321
|
+
if (r !== void 0) return r;
|
|
322
322
|
typeof I < "u" && (Object.getPrototypeOf(I) === Object.prototype ? { module_or_path: I } = I : console.warn("using deprecated parameters for the initialization function; pass a single object instead")), typeof I > "u" && (I = new URL("data:application/wasm;base64,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QQhqIAIQKQALaAIBfwF+IwBBMGsiAyQAIAMgADYCACADIAE2AgQgA0ECNgIMIANBuJbAADYCCCADQgI3AhQgA0KAgICAICIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQKQALaAIBfwF+IwBBMGsiAyQAIAMgADYCACADIAE2AgQgA0ECNgIMIANB7JbAADYCCCADQgI3AhQgA0KAgICAICIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQKQALZQAjAEEwayIAJABBxJfAAC0AAARAIABBAjYCDCAAQbCSwAA2AgggAEIBNwIUIAAgATYCLCAAIABBLGqtQoCAgIAghDcDICAAIABBIGo2AhAgAEEIakHQksAAECkACyAAQTBqJAALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhAPIAAoAgghAwsgACgCBCADaiABIAIQCxogACACIANqNgIIQQALTQECf0HFl8AALQAAGiABKAIEIQIgASgCACEDQQhBBBAzIgFFBEBBBEEIED0ACyABIAI2AgQgASADNgIAIABB8JLAADYCBCAAIAE2AgALQQEBfyMAQSBrIgMkACADQQA2AhAgA0EBNgIEIANCBDcCCCADIAE2AhwgAyAANgIYIAMgA0EYajYCACADIAIQKQALrhIBEn8jAEEQayIXJAAgCCEMIwBB0ABrIgskACALQQhqIAAiCCABIhkgAiIRIAMgBiAHEAQgC0EUaiALKAIMIhwgCygCECACIAMQByACIANsIgBBAXQhBgJAAkACQCAAQQBIIAZB/v///wdLckUEQCAGRQ0BQcWXwAAtAAAaQQIhDSAGQQIQMyIBDQILIA0gBhAvAAtBACEGIAtBADYCKCALQoCAgIAgNwIgIAtBADYCNCALQoCAgIAgNwIsQQIhAUEBIRhBAiECDAELIAtBADYCKCALIAE2AiQgCyAANgIgQcWXwAAtAAAaAkACQAJAIAZBAhAzIgIEQEEAIQYgC0EANgI0IAsgAjYCMCALIAA2AiwgAEUEQEEBIRhBACENDAULIABFIRggCygCGCEBIAsoAhwhEiAAIQIDQCAGIBJPDQMgAS8BACENIAsoAigiECALKAIgRgRAIAtBIGoQEgsgCygCJCAQQQF0aiANOwEA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QQRqEBALIAYoAgggEEEDdGoiASACNgIEIAEgDDYCACAGIBBBAWo2AgwMAQsgBCAbX0UNACAMIBJqQQA6AAALIABBBGohACAMQQFqIQEgCyAMSw0ACyAJIBFqIREgByASaiESIgIgGUcNAAsMAQsgA0ECayEAIAdBAWohAiAHQQF0QQFrIQFBACEDA0AgASADaiIPIAIgA2pJDQYgDyATSw0EIAggD0kNAiADIAdqIQMgAEEBayIADQALCyAGKAIMIgJFDQcgB0EBaiEMQQEgB2shESAHQX9zIQ8gB0UNBgNAIAYgAkEBayICNgIMAkAgBigCCCACQQN0aiIAKAIEIAdsIAAoAgBqIgkgD2oiASAITw0AIAEgCmoiAC0AAA0AIABBAjoAACABIAEgB24iAiAHbGshASAGKAIMIgMgBigCBEYEQCAGQQRqEBALIAYoAgggA0EDdGoiACACNgIEIAAgATYCACAGIANBAWoiAjYCDAsCQCAJIAdrIgEgCE8NACABIApqIgAtAAANACAAQQI6AAAgASABIAduIgIgB2xrIQEgBigCDCIDIAYoAgRGBEAgBkEEahAQCyAGKAIIIANBA3RqIgAgAjYCBCAAIAE2AgAgBiADQQFqIgI2AgwLAkAgCSARaiIBIAhPDQAgASAKaiIALQAADQAgAEECOgAAIAEgASAHbiICIAdsayEBIAYoAgwiAyAGKAIERgRAIAZBBGoQEAsgBigCCCADQQN0aiIAIAI2AgQgACABNgIAIAYgA0EBaiICNgIMCwJAIAlBAWsiASAITw0AIAEgCmoiAC0AAA0AIABBAjoAACABIAEgB24iAiAHbGshASAGKAIMIgMgBigCBEYEQCAGQQRqEBALIAYoAgggA0EDdGoiACACNgIEIAAgATYCACAGIANBAWoiAjYCDAsCQCAJQQFqIgEgCE8NACABIApqIgAtAAANACAAQQI6AAAgASABIAduIgIgB2xrIQEgBigCDCIDIAYoAgRGBEAgBkEEahAQCyAGKAIIIANBA3RqIgAgAjYCBCAAIAE2AgAgBiADQQFqIgI2AgwLAkAgCSAWaiIBIAhPDQAgASAKaiIALQAADQAgAEECOgAAIAEgASAHbiICIAdsayEBIAYoAgwiAyAGKAIERgRAIAZBBGoQEAsgBigCCCADQQN0aiIAIAI2AgQgACAB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AAAPAAAAEwAAAExhenkgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZAAAhAcQACoAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9vbmNlX2NlbGwtMS4yMS4zL3NyYy9saWIucnMAALgHEABaAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAJAgQAA4AAAC4BxAAWgAAAHoCAAANAAAABAAAAAwAAAAEAAAABQAAAAYAAAAHAAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuNi9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAGQIEAApAAAAqAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAABkCBAAKQAAAK4EAAANAAAAbWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAAADAkQABUAAAAhCRAADQAAAHN0ZC9zcmMvYWxsb2MucnNACRAAEAAAAGMBAAAJAAAABAAAAAwAAAAEAAAACAAAAAAAAAAIAAAABAAAAAkAAAAAAAAACAAAAAQAAAAKAAAACwAAAAwAAAANAAAADgAAABAAAAAEAAAADwAAABAAAAARAAAAEgAAAGNhcGFjaXR5IG92ZXJmbG93AAAAuAkQABEAAABhbGxvYy9zcmMvcmF3X3ZlYy5yc9QJEAAUAAAAGAAAAAUAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAA+AkQACAAAAAYChAAEgAAADAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5IG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIHJhbmdlIGVuZCBpbmRleCAAACYLEAAQAAAABAsQACIAAABzbGljZSBpbmRleCBzdGFydHMgYXQgIGJ1dCBlbmRzIGF0IABICxAAFgAAAF4LEAANAAAAYXR0ZW1wdCB0byBkaXZpZGUgYnkgemVybwAAAHwLEAAZAAAAAAAAPwAAAL8AQcCXwAALAQEAfAlwcm9kdWNlcnMCCGxhbmd1YWdlAQRSdXN0AAxwcm9jZXNzZWQtYnkDBXJ1c3RjHTEuODMuMCAoOTBiMzVhNjIzIDIwMjQtMTEtMjYpBndhbHJ1cwYwLjIzLjMMd2FzbS1iaW5kZ2VuEzAuMi4xMDAgKDI0MDVlYzJiNCkAUg90YXJnZXRfZmVhdHVyZXMFKw9tdXRhYmxlLWdsb2JhbHMrB3NpbWQxMjgrCHNpZ24tZXh0Kw9yZWZlcmVuY2UtdHlwZXMrCm11bHRpdmFsdWU=", import.meta.url));
|
|
323
|
-
const A =
|
|
323
|
+
const A = wA();
|
|
324
324
|
(typeof I == "string" || typeof Request == "function" && I instanceof Request || typeof URL == "function" && I instanceof URL) && (I = fetch(I));
|
|
325
|
-
const { instance: g, module: C } = await
|
|
326
|
-
return
|
|
325
|
+
const { instance: g, module: C } = await yA(await I, A);
|
|
326
|
+
return hA(g, C);
|
|
327
327
|
}
|
|
328
|
-
const
|
|
329
|
-
function
|
|
328
|
+
const H = P();
|
|
329
|
+
function NA(I) {
|
|
330
330
|
const { width: A, height: g, data: C } = I, E = new Uint8ClampedArray(A * g);
|
|
331
331
|
for (let B = 0, Q = 0; B < C.length; B += 4, Q++)
|
|
332
332
|
E[Q] = C[B] * 54 + C[B + 1] * 183 + C[B + 2] * 19 >> 8;
|
|
333
333
|
return E;
|
|
334
334
|
}
|
|
335
|
-
function
|
|
335
|
+
function rA(I, A, g, C = 5, E = 0) {
|
|
336
336
|
E === 0 && (E = 0.3 * ((C - 1) * 0.5 - 1) + 0.8);
|
|
337
337
|
const B = Math.floor(C / 2), Q = FA(C, E), i = new Uint8ClampedArray(A * g), s = new Uint8ClampedArray(A * g);
|
|
338
|
-
for (let
|
|
339
|
-
const
|
|
340
|
-
for (let
|
|
341
|
-
let
|
|
342
|
-
for (let
|
|
343
|
-
const
|
|
344
|
-
|
|
338
|
+
for (let o = 0; o < g; o++) {
|
|
339
|
+
const t = o * A;
|
|
340
|
+
for (let e = 0; e < A; e++) {
|
|
341
|
+
let a = 0;
|
|
342
|
+
for (let D = -B; D <= B; D++) {
|
|
343
|
+
const c = Math.min(A - 1, Math.max(0, e + D));
|
|
344
|
+
a += I[t + c] * Q[B + D];
|
|
345
345
|
}
|
|
346
|
-
i[
|
|
346
|
+
i[t + e] = a;
|
|
347
347
|
}
|
|
348
348
|
}
|
|
349
|
-
for (let
|
|
350
|
-
for (let
|
|
351
|
-
let
|
|
352
|
-
for (let
|
|
353
|
-
const
|
|
354
|
-
|
|
349
|
+
for (let o = 0; o < A; o++)
|
|
350
|
+
for (let t = 0; t < g; t++) {
|
|
351
|
+
let e = 0;
|
|
352
|
+
for (let a = -B; a <= B; a++) {
|
|
353
|
+
const D = Math.min(g - 1, Math.max(0, t + a));
|
|
354
|
+
e += i[D * A + o] * Q[B + a];
|
|
355
355
|
}
|
|
356
|
-
s[
|
|
356
|
+
s[t * A + o] = Math.round(e);
|
|
357
357
|
}
|
|
358
358
|
return s;
|
|
359
359
|
}
|
|
@@ -368,366 +368,161 @@ function FA(I, A) {
|
|
|
368
368
|
g[B] /= E;
|
|
369
369
|
return g;
|
|
370
370
|
}
|
|
371
|
-
function
|
|
371
|
+
function GA(I, A, g) {
|
|
372
372
|
const C = new Int16Array(A * g), E = new Int16Array(A * g);
|
|
373
373
|
for (let B = 1; B < g - 1; B++) {
|
|
374
374
|
const Q = B * A, i = (B - 1) * A, s = (B + 1) * A;
|
|
375
|
-
for (let
|
|
376
|
-
const
|
|
377
|
-
C[
|
|
375
|
+
for (let o = 1; o < A - 1; o++) {
|
|
376
|
+
const t = Q + o, e = I[i + o - 1], a = I[i + o], D = I[i + o + 1], c = I[Q + o - 1], y = I[Q + o + 1], w = I[s + o - 1], n = I[s + o], h = I[s + o + 1], N = D - e + 2 * (y - c) + (h - w), F = w + 2 * n + h - (e + 2 * a + D);
|
|
377
|
+
C[t] = N, E[t] = F;
|
|
378
378
|
}
|
|
379
379
|
}
|
|
380
380
|
return { dx: C, dy: E };
|
|
381
381
|
}
|
|
382
|
-
function
|
|
382
|
+
function RA(I, A, g, C, E) {
|
|
383
383
|
const B = new Float32Array(g * C), Q = new Float32Array(g * C);
|
|
384
384
|
for (let i = 0; i < I.length; i++) {
|
|
385
|
-
const s = I[i],
|
|
386
|
-
E ? B[i] = Math.sqrt(s * s +
|
|
385
|
+
const s = I[i], o = A[i];
|
|
386
|
+
E ? B[i] = Math.sqrt(s * s + o * o) : B[i] = Math.abs(s) + Math.abs(o);
|
|
387
387
|
}
|
|
388
388
|
for (let i = 1; i < C - 1; i++)
|
|
389
389
|
for (let s = 1; s < g - 1; s++) {
|
|
390
|
-
const
|
|
391
|
-
if (
|
|
392
|
-
Q[
|
|
390
|
+
const o = i * g + s, t = B[o];
|
|
391
|
+
if (t === 0) {
|
|
392
|
+
Q[o] = 0;
|
|
393
393
|
continue;
|
|
394
394
|
}
|
|
395
|
-
const
|
|
396
|
-
let
|
|
397
|
-
const
|
|
398
|
-
if (
|
|
399
|
-
|
|
400
|
-
else if (
|
|
401
|
-
|
|
395
|
+
const e = I[o], a = A[o];
|
|
396
|
+
let D = 0, c = 0;
|
|
397
|
+
const y = Math.abs(e), w = Math.abs(a);
|
|
398
|
+
if (w > y * 2.4142)
|
|
399
|
+
D = B[o - g], c = B[o + g];
|
|
400
|
+
else if (y > w * 2.4142)
|
|
401
|
+
D = B[o - 1], c = B[o + 1];
|
|
402
402
|
else {
|
|
403
|
-
const
|
|
404
|
-
|
|
403
|
+
const n = (e ^ a) < 0 ? -1 : 1;
|
|
404
|
+
a > 0 ? (D = B[(i - 1) * g + (s - n)], c = B[(i + 1) * g + (s + n)]) : (D = B[(i + 1) * g + (s - n)], c = B[(i - 1) * g + (s + n)]), e > 0 && a > 0 || e < 0 && a < 0 ? (D = B[(i - 1) * g + (s + 1)], c = B[(i + 1) * g + (s - 1)]) : (D = B[(i - 1) * g + (s - 1)], c = B[(i + 1) * g + (s + 1)]);
|
|
405
405
|
}
|
|
406
|
-
|
|
406
|
+
t >= D && t >= c ? Q[o] = t : Q[o] = 0;
|
|
407
407
|
}
|
|
408
408
|
return Q;
|
|
409
409
|
}
|
|
410
|
-
function
|
|
410
|
+
function W(I, A, g, C, E) {
|
|
411
411
|
const B = new Uint8Array(A * g), Q = [];
|
|
412
|
-
for (let
|
|
413
|
-
for (let
|
|
414
|
-
const
|
|
415
|
-
|
|
412
|
+
for (let o = 1; o < g - 1; o++)
|
|
413
|
+
for (let t = 1; t < A - 1; t++) {
|
|
414
|
+
const e = o * A + t, a = I[e];
|
|
415
|
+
a >= E ? (B[e] = 2, Q.push({ x: t, y: o })) : a >= C ? B[e] = 0 : B[e] = 1;
|
|
416
416
|
}
|
|
417
|
-
for (let
|
|
418
|
-
B[
|
|
419
|
-
for (let
|
|
420
|
-
B[
|
|
417
|
+
for (let o = 0; o < A; o++)
|
|
418
|
+
B[o] = 1, B[(g - 1) * A + o] = 1;
|
|
419
|
+
for (let o = 1; o < g - 1; o++)
|
|
420
|
+
B[o * A] = 1, B[o * A + A - 1] = 1;
|
|
421
421
|
const i = [-1, 0, 1, -1, 1, -1, 0, 1], s = [-1, -1, -1, 0, 0, 1, 1, 1];
|
|
422
422
|
for (; Q.length > 0; ) {
|
|
423
|
-
const { x:
|
|
424
|
-
for (let
|
|
425
|
-
const
|
|
426
|
-
B[
|
|
423
|
+
const { x: o, y: t } = Q.pop();
|
|
424
|
+
for (let e = 0; e < 8; e++) {
|
|
425
|
+
const a = o + i[e], D = t + s[e], c = D * A + a;
|
|
426
|
+
B[c] === 0 && (B[c] = 2, Q.push({ x: a, y: D }));
|
|
427
427
|
}
|
|
428
428
|
}
|
|
429
429
|
return B;
|
|
430
430
|
}
|
|
431
|
-
function
|
|
431
|
+
function kA(I, A, g, C = 5) {
|
|
432
432
|
const E = Math.floor(C / 2), B = new Uint8ClampedArray(A * g), Q = new Uint8ClampedArray(A * g);
|
|
433
433
|
for (let i = 0; i < g; i++) {
|
|
434
434
|
const s = i * A;
|
|
435
|
-
for (let
|
|
436
|
-
let
|
|
437
|
-
for (let
|
|
438
|
-
const
|
|
439
|
-
if (
|
|
440
|
-
const
|
|
441
|
-
|
|
435
|
+
for (let o = 0; o < A; o++) {
|
|
436
|
+
let t = 0;
|
|
437
|
+
for (let e = -E; e <= E; e++) {
|
|
438
|
+
const a = o + e;
|
|
439
|
+
if (a >= 0 && a < A) {
|
|
440
|
+
const D = I[s + a];
|
|
441
|
+
D > t && (t = D);
|
|
442
442
|
}
|
|
443
443
|
}
|
|
444
|
-
B[s +
|
|
444
|
+
B[s + o] = t;
|
|
445
445
|
}
|
|
446
446
|
}
|
|
447
447
|
for (let i = 0; i < A; i++)
|
|
448
448
|
for (let s = 0; s < g; s++) {
|
|
449
|
-
let
|
|
450
|
-
for (let
|
|
451
|
-
const
|
|
452
|
-
if (
|
|
453
|
-
const
|
|
454
|
-
|
|
449
|
+
let o = 0;
|
|
450
|
+
for (let t = -E; t <= E; t++) {
|
|
451
|
+
const e = s + t;
|
|
452
|
+
if (e >= 0 && e < g) {
|
|
453
|
+
const a = B[e * A + i];
|
|
454
|
+
a > o && (o = a);
|
|
455
455
|
}
|
|
456
456
|
}
|
|
457
|
-
Q[s * A + i] =
|
|
457
|
+
Q[s * A + i] = o;
|
|
458
458
|
}
|
|
459
459
|
return Q;
|
|
460
460
|
}
|
|
461
|
-
async function
|
|
461
|
+
async function JA(I, A = {}) {
|
|
462
462
|
const g = [], C = performance.now(), { width: E, height: B } = I;
|
|
463
463
|
let Q = A.lowThreshold !== void 0 ? A.lowThreshold : 75, i = A.highThreshold !== void 0 ? A.highThreshold : 200;
|
|
464
|
-
const s = A.kernelSize || 5,
|
|
464
|
+
const s = A.kernelSize || 5, o = A.sigma || 0, t = A.L2gradient === void 0 ? !1 : A.L2gradient, e = A.applyDilation !== void 0 ? A.applyDilation : !0, a = A.dilationKernelSize || 5, D = A.useWasmHysteresis !== void 0 ? A.useWasmHysteresis : !1;
|
|
465
465
|
Q >= i && (console.warn(`Canny Edge Detector: lowThreshold (${Q}) should be lower than highThreshold (${i}). Swapping them.`), [Q, i] = [i, Q]);
|
|
466
|
-
let
|
|
467
|
-
const
|
|
468
|
-
let
|
|
469
|
-
g.push({ step: "Grayscale", ms: (
|
|
470
|
-
let
|
|
471
|
-
|
|
466
|
+
let c = performance.now();
|
|
467
|
+
const y = NA(I);
|
|
468
|
+
let w = performance.now();
|
|
469
|
+
g.push({ step: "Grayscale", ms: (w - c).toFixed(2) }), A.debug && (A.debug.grayscale = y);
|
|
470
|
+
let n;
|
|
471
|
+
c = performance.now();
|
|
472
472
|
try {
|
|
473
|
-
await
|
|
473
|
+
await H, n = DA(y, E, B, s, o);
|
|
474
474
|
} catch {
|
|
475
|
-
|
|
475
|
+
n = rA(y, E, B, s, o);
|
|
476
476
|
}
|
|
477
|
-
|
|
478
|
-
let
|
|
477
|
+
w = performance.now(), g.push({ step: "Gaussian Blur", ms: (w - c).toFixed(2) }), A.debug && (A.debug.blurred = n), c = performance.now();
|
|
478
|
+
let h, N;
|
|
479
479
|
{
|
|
480
|
-
const
|
|
481
|
-
|
|
480
|
+
const R = GA(n, E, B);
|
|
481
|
+
h = R.dx, N = R.dy;
|
|
482
482
|
}
|
|
483
|
-
|
|
483
|
+
w = performance.now(), g.push({ step: "Gradients", ms: (w - c).toFixed(2) }), c = performance.now();
|
|
484
484
|
let F;
|
|
485
485
|
try {
|
|
486
|
-
await
|
|
486
|
+
await H, F = await nA(h, N, E, B, t);
|
|
487
487
|
} catch {
|
|
488
|
-
F =
|
|
488
|
+
F = RA(h, N, E, B, t);
|
|
489
489
|
}
|
|
490
|
-
|
|
491
|
-
const
|
|
492
|
-
let
|
|
493
|
-
if (
|
|
490
|
+
w = performance.now(), g.push({ step: "Non-Max Suppression", ms: (w - c).toFixed(2) }), c = performance.now();
|
|
491
|
+
const G = t ? Q * Q : Q, S = t ? i * i : i;
|
|
492
|
+
let J;
|
|
493
|
+
if (D)
|
|
494
494
|
try {
|
|
495
|
-
await
|
|
496
|
-
} catch (
|
|
497
|
-
console.warn("WASM hysteresis failed, falling back to JS:",
|
|
495
|
+
await H, J = aA(F, E, B, G, S);
|
|
496
|
+
} catch (R) {
|
|
497
|
+
console.warn("WASM hysteresis failed, falling back to JS:", R), J = W(F, E, B, G, S);
|
|
498
498
|
}
|
|
499
499
|
else
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
const
|
|
503
|
-
for (let
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
let f =
|
|
507
|
-
if (
|
|
500
|
+
J = W(F, E, B, G, S);
|
|
501
|
+
w = performance.now(), g.push({ step: "Hysteresis", ms: (w - c).toFixed(2) }), c = performance.now();
|
|
502
|
+
const k = new Uint8ClampedArray(E * B);
|
|
503
|
+
for (let R = 0; R < J.length; R++)
|
|
504
|
+
k[R] = J[R] === 2 ? 255 : 0;
|
|
505
|
+
w = performance.now(), g.push({ step: "Binary Image", ms: (w - c).toFixed(2) }), c = performance.now();
|
|
506
|
+
let f = k;
|
|
507
|
+
if (e)
|
|
508
508
|
try {
|
|
509
|
-
await
|
|
509
|
+
await H, f = sA(k, E, B, a);
|
|
510
510
|
} catch {
|
|
511
|
-
f =
|
|
512
|
-
}
|
|
513
|
-
if (y = performance.now(), g.push({ step: "Dilation", ms: (y - D).toFixed(2) }), A.debug) {
|
|
514
|
-
A.debug.dx = r, A.debug.dy = w;
|
|
515
|
-
const l = new Float32Array(E * B);
|
|
516
|
-
for (let J = 0; J < r.length; J++) {
|
|
517
|
-
const U = r[J], H = w[J];
|
|
518
|
-
l[J] = o ? Math.sqrt(U * U + H * H) : Math.abs(U) + Math.abs(H);
|
|
519
|
-
}
|
|
520
|
-
A.debug.magnitude = l, A.debug.suppressed = F, A.debug.edgeMap = S, A.debug.cannyEdges = G, A.debug.finalEdges = f, A.debug.timings = g;
|
|
521
|
-
}
|
|
522
|
-
const j = performance.now();
|
|
523
|
-
return g.unshift({ step: "Total", ms: (j - C).toFixed(2) }), console.table(g), f;
|
|
524
|
-
}
|
|
525
|
-
class dA {
|
|
526
|
-
constructor(A = {}) {
|
|
527
|
-
this.options = {
|
|
528
|
-
targetFPS: A.targetFPS || 10,
|
|
529
|
-
// Limit FPS for performance
|
|
530
|
-
detectionInterval: A.detectionInterval || 150,
|
|
531
|
-
// ms between detections
|
|
532
|
-
confidenceThreshold: A.confidenceThreshold || 0.7,
|
|
533
|
-
stabilizationFrames: A.stabilizationFrames || 3,
|
|
534
|
-
maxProcessingDimension: A.maxProcessingDimension || 500,
|
|
535
|
-
// Lower for live processing
|
|
536
|
-
...A
|
|
537
|
-
}, this.isRunning = !1, this.stream = null, this.video = null, this.canvas = null, this.ctx = null, this.outputCanvas = null, this.outputCtx = null, this.lastDetectionTime = 0, this.frameCount = 0, this.detectionCount = 0, this.lastFPSUpdate = 0, this.currentFPS = 0, this.lastResult = null, this.stableResults = [], this.currentCorners = null, this.onDetection = null, this.onFPSUpdate = null, this.onError = null;
|
|
538
|
-
}
|
|
539
|
-
/**
|
|
540
|
-
* Initialize webcam access and start live scanning
|
|
541
|
-
* @param {HTMLElement} outputElement - Canvas element to render results to
|
|
542
|
-
* @param {Object} constraints - MediaStream constraints
|
|
543
|
-
*/
|
|
544
|
-
async init(A, g = {}) {
|
|
545
|
-
try {
|
|
546
|
-
this.outputCanvas = A, this.outputCtx = this.outputCanvas.getContext("2d"), this.video = document.createElement("video"), this.video.style.display = "none", this.video.autoplay = !0, this.video.muted = !0, this.video.playsInline = !0, document.body.appendChild(this.video), this.canvas = document.createElement("canvas"), this.ctx = this.canvas.getContext("2d");
|
|
547
|
-
const E = { ...{
|
|
548
|
-
video: {
|
|
549
|
-
width: { ideal: 1280, max: 1920 },
|
|
550
|
-
height: { ideal: 720, max: 1080 },
|
|
551
|
-
facingMode: "environment"
|
|
552
|
-
// Use back camera on mobile
|
|
553
|
-
},
|
|
554
|
-
audio: !1
|
|
555
|
-
}, ...g };
|
|
556
|
-
this.stream = await navigator.mediaDevices.getUserMedia(E), this.video.srcObject = this.stream, await new Promise((B) => {
|
|
557
|
-
this.video.addEventListener("loadedmetadata", B, { once: !0 });
|
|
558
|
-
}), this.canvas.width = this.video.videoWidth, this.canvas.height = this.video.videoHeight, this.outputCanvas.width = this.video.videoWidth, this.outputCanvas.height = this.video.videoHeight, console.log(`Live scanner initialized: ${this.video.videoWidth}x${this.video.videoHeight}`);
|
|
559
|
-
} catch (C) {
|
|
560
|
-
throw console.error("Failed to initialize live scanner:", C), this.onError && this.onError(C), C;
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
/**
|
|
564
|
-
* Start the live scanning loop
|
|
565
|
-
*/
|
|
566
|
-
start() {
|
|
567
|
-
if (this.isRunning || !this.video) {
|
|
568
|
-
console.warn("Scanner already running or not initialized");
|
|
569
|
-
return;
|
|
511
|
+
f = kA(k, E, B, a);
|
|
570
512
|
}
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
this.isRunning = !1, this.stream && (this.stream.getTracks().forEach((A) => A.stop()), this.stream = null), this.video && (this.video.remove(), this.video = null), console.log("Live scanner stopped");
|
|
578
|
-
}
|
|
579
|
-
/**
|
|
580
|
-
* Main processing loop - optimized for performance
|
|
581
|
-
*/
|
|
582
|
-
async processFrame() {
|
|
583
|
-
if (!this.isRunning) return;
|
|
584
|
-
const A = Date.now();
|
|
585
|
-
this.frameCount++;
|
|
586
|
-
try {
|
|
587
|
-
this.outputCtx.drawImage(this.video, 0, 0, this.outputCanvas.width, this.outputCanvas.height);
|
|
588
|
-
const g = A - this.lastDetectionTime;
|
|
589
|
-
if (g >= this.options.detectionInterval) {
|
|
590
|
-
this.lastDetectionTime = A, this.detectionCount++, this.ctx.drawImage(this.video, 0, 0, this.canvas.width, this.canvas.height);
|
|
591
|
-
const C = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
|
|
592
|
-
this.detectDocumentAsync(C).catch((E) => {
|
|
593
|
-
console.error("Detection error:", E), this.onError && this.onError(E);
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
|
-
this.currentCorners && this.drawDocumentOverlay(this.currentCorners), A - this.lastFPSUpdate >= 1e3 && (this.currentFPS = Math.round(this.frameCount * 1e3 / (A - this.lastFPSUpdate)), this.frameCount = 0, this.lastFPSUpdate = A, this.onFPSUpdate && this.onFPSUpdate({
|
|
597
|
-
renderFPS: this.currentFPS,
|
|
598
|
-
detectionFPS: Math.round(this.detectionCount * 1e3 / 1e3),
|
|
599
|
-
lastDetectionTime: g
|
|
600
|
-
}), this.detectionCount = 0);
|
|
601
|
-
} catch (g) {
|
|
602
|
-
console.error("Frame processing error:", g), this.onError && this.onError(g);
|
|
603
|
-
}
|
|
604
|
-
requestAnimationFrame(() => this.processFrame());
|
|
605
|
-
}
|
|
606
|
-
/**
|
|
607
|
-
* Run document detection asynchronously
|
|
608
|
-
*/
|
|
609
|
-
async detectDocumentAsync(A) {
|
|
610
|
-
try {
|
|
611
|
-
const g = await X(A, {
|
|
612
|
-
...this.options,
|
|
613
|
-
mode: "detect",
|
|
614
|
-
// Only detect, no image processing
|
|
615
|
-
debug: !1
|
|
616
|
-
// Disable debug for performance
|
|
617
|
-
});
|
|
618
|
-
g.success && g.corners ? (this.updateStableCorners(g.corners), this.onDetection && this.onDetection({
|
|
619
|
-
corners: g.corners,
|
|
620
|
-
confidence: this.calculateConfidence(g),
|
|
621
|
-
isStable: this.stableResults.length >= this.options.stabilizationFrames
|
|
622
|
-
})) : this.stableResults.length > 0 && (this.stableResults.pop(), this.stableResults.length === 0 && (this.currentCorners = null));
|
|
623
|
-
} catch (g) {
|
|
624
|
-
throw console.error("Document detection failed:", g), g;
|
|
513
|
+
if (w = performance.now(), g.push({ step: "Dilation", ms: (w - c).toFixed(2) }), A.debug) {
|
|
514
|
+
A.debug.dx = h, A.debug.dy = N;
|
|
515
|
+
const R = new Float32Array(E * B);
|
|
516
|
+
for (let l = 0; l < h.length; l++) {
|
|
517
|
+
const m = h[l], q = N[l];
|
|
518
|
+
R[l] = t ? Math.sqrt(m * m + q * q) : Math.abs(m) + Math.abs(q);
|
|
625
519
|
}
|
|
520
|
+
A.debug.magnitude = R, A.debug.suppressed = F, A.debug.edgeMap = J, A.debug.cannyEdges = k, A.debug.finalEdges = f, A.debug.timings = g;
|
|
626
521
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
*/
|
|
630
|
-
updateStableCorners(A) {
|
|
631
|
-
this.stableResults.push(A), this.stableResults.length > this.options.stabilizationFrames && this.stableResults.shift(), this.stableResults.length >= this.options.stabilizationFrames && (this.currentCorners = this.averageCorners(this.stableResults));
|
|
632
|
-
}
|
|
633
|
-
/**
|
|
634
|
-
* Calculate average corners from multiple detections for smoothing
|
|
635
|
-
*/
|
|
636
|
-
averageCorners(A) {
|
|
637
|
-
const g = {
|
|
638
|
-
topLeft: { x: 0, y: 0 },
|
|
639
|
-
topRight: { x: 0, y: 0 },
|
|
640
|
-
bottomRight: { x: 0, y: 0 },
|
|
641
|
-
bottomLeft: { x: 0, y: 0 }
|
|
642
|
-
};
|
|
643
|
-
A.forEach((E) => {
|
|
644
|
-
Object.keys(g).forEach((B) => {
|
|
645
|
-
g[B].x += E[B].x, g[B].y += E[B].y;
|
|
646
|
-
});
|
|
647
|
-
});
|
|
648
|
-
const C = A.length;
|
|
649
|
-
return Object.keys(g).forEach((E) => {
|
|
650
|
-
g[E].x = Math.round(g[E].x / C), g[E].y = Math.round(g[E].y / C);
|
|
651
|
-
}), g;
|
|
652
|
-
}
|
|
653
|
-
/**
|
|
654
|
-
* Draw document overlay on output canvas
|
|
655
|
-
*/
|
|
656
|
-
drawDocumentOverlay(A, g = null, C = 1, E = 1) {
|
|
657
|
-
const B = g || this.outputCtx;
|
|
658
|
-
B.save();
|
|
659
|
-
const Q = {
|
|
660
|
-
topLeft: { x: A.topLeft.x * C, y: A.topLeft.y * E },
|
|
661
|
-
topRight: { x: A.topRight.x * C, y: A.topRight.y * E },
|
|
662
|
-
bottomRight: { x: A.bottomRight.x * C, y: A.bottomRight.y * E },
|
|
663
|
-
bottomLeft: { x: A.bottomLeft.x * C, y: A.bottomLeft.y * E }
|
|
664
|
-
};
|
|
665
|
-
B.strokeStyle = "#00FF00", B.lineWidth = 3, B.setLineDash([5, 5]), B.beginPath(), B.moveTo(Q.topLeft.x, Q.topLeft.y), B.lineTo(Q.topRight.x, Q.topRight.y), B.lineTo(Q.bottomRight.x, Q.bottomRight.y), B.lineTo(Q.bottomLeft.x, Q.bottomLeft.y), B.closePath(), B.stroke(), B.fillStyle = "#00FF00", B.setLineDash([]);
|
|
666
|
-
const i = 8 * Math.max(C, E);
|
|
667
|
-
Object.values(Q).forEach((s) => {
|
|
668
|
-
B.beginPath(), B.arc(s.x, s.y, i, 0, 2 * Math.PI), B.fill();
|
|
669
|
-
}), B.restore();
|
|
670
|
-
}
|
|
671
|
-
/**
|
|
672
|
-
* Calculate detection confidence (placeholder - can be enhanced)
|
|
673
|
-
*/
|
|
674
|
-
calculateConfidence(A) {
|
|
675
|
-
return 0.8;
|
|
676
|
-
}
|
|
677
|
-
/**
|
|
678
|
-
* Capture current frame as document with perspective transform
|
|
679
|
-
*/
|
|
680
|
-
async captureDocument() {
|
|
681
|
-
if (!this.currentCorners || !this.video)
|
|
682
|
-
throw new Error("No stable document detected");
|
|
683
|
-
const { extractDocument: A } = await Promise.resolve().then(() => uA), g = document.createElement("canvas");
|
|
684
|
-
g.width = this.video.videoWidth, g.height = this.video.videoHeight, g.getContext("2d").drawImage(this.video, 0, 0);
|
|
685
|
-
const E = this.video.videoWidth / this.outputCanvas.width, B = this.video.videoHeight / this.outputCanvas.height, Q = {
|
|
686
|
-
topLeft: {
|
|
687
|
-
x: this.currentCorners.topLeft.x * E,
|
|
688
|
-
y: this.currentCorners.topLeft.y * B
|
|
689
|
-
},
|
|
690
|
-
topRight: {
|
|
691
|
-
x: this.currentCorners.topRight.x * E,
|
|
692
|
-
y: this.currentCorners.topRight.y * B
|
|
693
|
-
},
|
|
694
|
-
bottomRight: {
|
|
695
|
-
x: this.currentCorners.bottomRight.x * E,
|
|
696
|
-
y: this.currentCorners.bottomRight.y * B
|
|
697
|
-
},
|
|
698
|
-
bottomLeft: {
|
|
699
|
-
x: this.currentCorners.bottomLeft.x * E,
|
|
700
|
-
y: this.currentCorners.bottomLeft.y * B
|
|
701
|
-
}
|
|
702
|
-
};
|
|
703
|
-
return A(g, Q);
|
|
704
|
-
}
|
|
705
|
-
/**
|
|
706
|
-
* Get current scanner statistics
|
|
707
|
-
*/
|
|
708
|
-
getStats() {
|
|
709
|
-
return {
|
|
710
|
-
isRunning: this.isRunning,
|
|
711
|
-
currentFPS: this.currentFPS,
|
|
712
|
-
videoResolution: this.video ? `${this.video.videoWidth}x${this.video.videoHeight}` : null,
|
|
713
|
-
hasStableDetection: this.currentCorners !== null,
|
|
714
|
-
stabilizationProgress: `${this.stableResults.length}/${this.options.stabilizationFrames}`
|
|
715
|
-
};
|
|
716
|
-
}
|
|
522
|
+
const v = performance.now();
|
|
523
|
+
return g.unshift({ step: "Total", ms: (v - C).toFixed(2) }), console.table(g), f;
|
|
717
524
|
}
|
|
718
|
-
|
|
719
|
-
try {
|
|
720
|
-
const A = (await navigator.mediaDevices.enumerateDevices()).filter((g) => g.kind === "videoinput");
|
|
721
|
-
return {
|
|
722
|
-
available: A.length > 0,
|
|
723
|
-
deviceCount: A.length,
|
|
724
|
-
devices: A
|
|
725
|
-
};
|
|
726
|
-
} catch (I) {
|
|
727
|
-
return console.error("Error checking webcam availability:", I), { available: !1, error: I.message };
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
function fA(I, A = 800) {
|
|
525
|
+
function SA(I, A = 800) {
|
|
731
526
|
const { width: g, height: C } = I, E = Math.max(g, C);
|
|
732
527
|
if (E <= A)
|
|
733
528
|
return {
|
|
@@ -738,26 +533,26 @@ function fA(I, A = 800) {
|
|
|
738
533
|
};
|
|
739
534
|
const B = A / E, Q = Math.round(g * B), i = Math.round(C * B), s = document.createElement("canvas");
|
|
740
535
|
s.width = g, s.height = C, s.getContext("2d").putImageData(I, 0, 0);
|
|
741
|
-
const
|
|
742
|
-
|
|
743
|
-
const
|
|
744
|
-
return
|
|
745
|
-
scaledImageData:
|
|
536
|
+
const t = document.createElement("canvas");
|
|
537
|
+
t.width = Q, t.height = i;
|
|
538
|
+
const e = t.getContext("2d");
|
|
539
|
+
return e.imageSmoothingEnabled = !0, e.imageSmoothingQuality = "high", e.drawImage(s, 0, 0, g, C, 0, 0, Q, i), {
|
|
540
|
+
scaledImageData: e.getImageData(0, 0, Q, i),
|
|
746
541
|
scaleFactor: 1 / B,
|
|
747
542
|
// Return inverse for compatibility with existing code
|
|
748
543
|
originalDimensions: { width: g, height: C },
|
|
749
544
|
scaledDimensions: { width: Q, height: i }
|
|
750
545
|
};
|
|
751
546
|
}
|
|
752
|
-
async function
|
|
753
|
-
const g = A.debug ? {} : null, C = A.maxProcessingDimension || 800, { scaledImageData: E, scaleFactor: B, originalDimensions: Q, scaledDimensions: i } =
|
|
547
|
+
async function MA(I, A = {}) {
|
|
548
|
+
const g = A.debug ? {} : null, C = A.maxProcessingDimension || 800, { scaledImageData: E, scaleFactor: B, originalDimensions: Q, scaledDimensions: i } = SA(I, C);
|
|
754
549
|
g && (g.preprocessing = {
|
|
755
550
|
originalDimensions: Q,
|
|
756
551
|
scaledDimensions: i,
|
|
757
552
|
scaleFactor: B,
|
|
758
553
|
maxProcessingDimension: C
|
|
759
554
|
});
|
|
760
|
-
const { width: s, height:
|
|
555
|
+
const { width: s, height: o } = E, t = await JA(E, {
|
|
761
556
|
lowThreshold: A.lowThreshold || 75,
|
|
762
557
|
// Match OpenCV values
|
|
763
558
|
highThreshold: A.highThreshold || 200,
|
|
@@ -766,44 +561,44 @@ async function JA(I, A = {}) {
|
|
|
766
561
|
// Match OpenCV value
|
|
767
562
|
dilationIterations: A.dilationIterations || 1,
|
|
768
563
|
debug: g
|
|
769
|
-
}),
|
|
564
|
+
}), e = V(t, {
|
|
770
565
|
minArea: (A.minArea || 1e3) / (B * B),
|
|
771
566
|
// Adjust minArea for scaled image
|
|
772
567
|
debug: g,
|
|
773
568
|
width: s,
|
|
774
|
-
height:
|
|
569
|
+
height: o
|
|
775
570
|
});
|
|
776
|
-
if (!
|
|
571
|
+
if (!e || e.length === 0)
|
|
777
572
|
return console.log("No document detected"), {
|
|
778
573
|
success: !1,
|
|
779
574
|
message: "No document detected",
|
|
780
575
|
debug: g
|
|
781
576
|
};
|
|
782
|
-
const
|
|
577
|
+
const a = e[0], D = EA(a, {
|
|
783
578
|
epsilon: A.epsilon
|
|
784
579
|
// Pass epsilon for approximation
|
|
785
580
|
});
|
|
786
|
-
let
|
|
787
|
-
return B !== 1 && (
|
|
788
|
-
topLeft: { x:
|
|
789
|
-
topRight: { x:
|
|
790
|
-
bottomRight: { x:
|
|
791
|
-
bottomLeft: { x:
|
|
581
|
+
let c = D;
|
|
582
|
+
return B !== 1 && (c = {
|
|
583
|
+
topLeft: { x: D.topLeft.x * B, y: D.topLeft.y * B },
|
|
584
|
+
topRight: { x: D.topRight.x * B, y: D.topRight.y * B },
|
|
585
|
+
bottomRight: { x: D.bottomRight.x * B, y: D.bottomRight.y * B },
|
|
586
|
+
bottomLeft: { x: D.bottomLeft.x * B, y: D.bottomLeft.y * B }
|
|
792
587
|
}), {
|
|
793
588
|
success: !0,
|
|
794
|
-
contour:
|
|
795
|
-
corners:
|
|
589
|
+
contour: a,
|
|
590
|
+
corners: c,
|
|
796
591
|
debug: g
|
|
797
592
|
};
|
|
798
593
|
}
|
|
799
|
-
function
|
|
594
|
+
function fA(I, A) {
|
|
800
595
|
function g(s) {
|
|
801
|
-
const
|
|
802
|
-
for (let
|
|
803
|
-
const [
|
|
804
|
-
|
|
596
|
+
const o = [];
|
|
597
|
+
for (let t = 0; t < 4; t++) {
|
|
598
|
+
const [e, a] = s[t];
|
|
599
|
+
o.push([e, a, 1, 0, 0, 0, -e * A[t][0], -a * A[t][0]]), o.push([0, 0, 0, e, a, 1, -e * A[t][1], -a * A[t][1]]);
|
|
805
600
|
}
|
|
806
|
-
return
|
|
601
|
+
return o;
|
|
807
602
|
}
|
|
808
603
|
const C = g(I), E = [
|
|
809
604
|
A[0][0],
|
|
@@ -815,28 +610,28 @@ function MA(I, A) {
|
|
|
815
610
|
A[3][0],
|
|
816
611
|
A[3][1]
|
|
817
612
|
];
|
|
818
|
-
function B(s,
|
|
819
|
-
const
|
|
820
|
-
for (let
|
|
821
|
-
let
|
|
822
|
-
for (let
|
|
823
|
-
Math.abs(
|
|
824
|
-
[
|
|
825
|
-
for (let
|
|
826
|
-
const
|
|
827
|
-
for (let
|
|
828
|
-
|
|
829
|
-
|
|
613
|
+
function B(s, o) {
|
|
614
|
+
const t = s.length, e = s[0].length, a = s.map((y) => y.slice()), D = o.slice();
|
|
615
|
+
for (let y = 0; y < e; y++) {
|
|
616
|
+
let w = y;
|
|
617
|
+
for (let n = y + 1; n < t; n++)
|
|
618
|
+
Math.abs(a[n][y]) > Math.abs(a[w][y]) && (w = n);
|
|
619
|
+
[a[y], a[w]] = [a[w], a[y]], [D[y], D[w]] = [D[w], D[y]];
|
|
620
|
+
for (let n = y + 1; n < t; n++) {
|
|
621
|
+
const h = a[n][y] / a[y][y];
|
|
622
|
+
for (let N = y; N < e; N++)
|
|
623
|
+
a[n][N] -= h * a[y][N];
|
|
624
|
+
D[n] -= h * D[y];
|
|
830
625
|
}
|
|
831
626
|
}
|
|
832
|
-
const
|
|
833
|
-
for (let
|
|
834
|
-
let
|
|
835
|
-
for (let
|
|
836
|
-
|
|
837
|
-
|
|
627
|
+
const c = new Array(e);
|
|
628
|
+
for (let y = e - 1; y >= 0; y--) {
|
|
629
|
+
let w = D[y];
|
|
630
|
+
for (let n = y + 1; n < e; n++)
|
|
631
|
+
w -= a[y][n] * c[n];
|
|
632
|
+
c[y] = w / a[y][y];
|
|
838
633
|
}
|
|
839
|
-
return
|
|
634
|
+
return c;
|
|
840
635
|
}
|
|
841
636
|
const Q = B(C, E);
|
|
842
637
|
return [
|
|
@@ -845,48 +640,76 @@ function MA(I, A) {
|
|
|
845
640
|
[Q[6], Q[7], 1]
|
|
846
641
|
];
|
|
847
642
|
}
|
|
848
|
-
function
|
|
849
|
-
const { topLeft: C, topRight: E, bottomRight: B, bottomLeft: Q } = g, i = Math.hypot(B.x - Q.x, B.y - Q.y), s = Math.hypot(E.x - C.x, E.y - C.y),
|
|
850
|
-
I.canvas.width =
|
|
851
|
-
const
|
|
643
|
+
function j(I, A, g) {
|
|
644
|
+
const { topLeft: C, topRight: E, bottomRight: B, bottomLeft: Q } = g, i = Math.hypot(B.x - Q.x, B.y - Q.y), s = Math.hypot(E.x - C.x, E.y - C.y), o = Math.round(Math.max(i, s)), t = Math.hypot(E.x - B.x, E.y - B.y), e = Math.hypot(C.x - Q.x, C.y - Q.y), a = Math.round(Math.max(t, e));
|
|
645
|
+
I.canvas.width = o, I.canvas.height = a;
|
|
646
|
+
const D = [
|
|
852
647
|
[C.x, C.y],
|
|
853
648
|
[E.x, E.y],
|
|
854
649
|
[B.x, B.y],
|
|
855
650
|
[Q.x, Q.y]
|
|
856
|
-
],
|
|
651
|
+
], c = [
|
|
857
652
|
[0, 0],
|
|
858
|
-
[
|
|
859
|
-
[
|
|
860
|
-
[0,
|
|
861
|
-
],
|
|
862
|
-
|
|
863
|
-
}
|
|
864
|
-
function
|
|
865
|
-
const A = I[0][0], g = I[0][1], C = I[0][2], E = I[1][0], B = I[1][1], Q = I[1][2], i = I[2][0], s = I[2][1],
|
|
866
|
-
if (
|
|
653
|
+
[o - 1, 0],
|
|
654
|
+
[o - 1, a - 1],
|
|
655
|
+
[0, a - 1]
|
|
656
|
+
], y = fA(D, c);
|
|
657
|
+
LA(I, A, y, o, a);
|
|
658
|
+
}
|
|
659
|
+
function lA(I) {
|
|
660
|
+
const A = I[0][0], g = I[0][1], C = I[0][2], E = I[1][0], B = I[1][1], Q = I[1][2], i = I[2][0], s = I[2][1], o = I[2][2], t = B * o - Q * s, e = -(E * o - Q * i), a = E * s - B * i, D = -(g * o - C * s), c = A * o - C * i, y = -(A * s - g * i), w = g * Q - C * B, n = -(A * Q - C * E), h = A * B - g * E, N = A * t + g * e + C * a;
|
|
661
|
+
if (N === 0) throw new Error("Singular matrix");
|
|
867
662
|
return [
|
|
868
|
-
[
|
|
869
|
-
[
|
|
870
|
-
[
|
|
663
|
+
[t / N, D / N, w / N],
|
|
664
|
+
[e / N, c / N, n / N],
|
|
665
|
+
[a / N, y / N, h / N]
|
|
871
666
|
];
|
|
872
667
|
}
|
|
873
|
-
function
|
|
874
|
-
const B =
|
|
668
|
+
function LA(I, A, g, C, E) {
|
|
669
|
+
const B = lA(g), Q = document.createElement("canvas");
|
|
875
670
|
Q.width = A.width || A.naturalWidth, Q.height = A.height || A.naturalHeight;
|
|
876
671
|
const i = Q.getContext("2d");
|
|
877
672
|
i.drawImage(A, 0, 0, Q.width, Q.height);
|
|
878
|
-
const s = i.getImageData(0, 0, Q.width, Q.height),
|
|
879
|
-
for (let
|
|
880
|
-
for (let
|
|
881
|
-
const
|
|
882
|
-
for (let
|
|
883
|
-
const
|
|
884
|
-
|
|
673
|
+
const s = i.getImageData(0, 0, Q.width, Q.height), o = I.createImageData(C, E);
|
|
674
|
+
for (let t = 0; t < E; t++)
|
|
675
|
+
for (let e = 0; e < C; e++) {
|
|
676
|
+
const a = B[2][0] * e + B[2][1] * t + B[2][2], D = (B[0][0] * e + B[0][1] * t + B[0][2]) / a, c = (B[1][0] * e + B[1][1] * t + B[1][2]) / a, y = Math.max(0, Math.min(Q.width - 2, D)), w = Math.max(0, Math.min(Q.height - 2, c)), n = Math.floor(y), h = Math.floor(w), N = y - n, F = w - h;
|
|
677
|
+
for (let G = 0; G < 4; G++) {
|
|
678
|
+
const S = s.data[(h * Q.width + n) * 4 + G], J = s.data[(h * Q.width + (n + 1)) * 4 + G], k = s.data[((h + 1) * Q.width + n) * 4 + G], f = s.data[((h + 1) * Q.width + (n + 1)) * 4 + G];
|
|
679
|
+
o.data[(t * C + e) * 4 + G] = (1 - N) * (1 - F) * S + N * (1 - F) * J + (1 - N) * F * k + N * F * f;
|
|
885
680
|
}
|
|
886
681
|
}
|
|
887
|
-
I.putImageData(
|
|
682
|
+
I.putImageData(o, 0, 0);
|
|
683
|
+
}
|
|
684
|
+
async function YA(I, A, g = {}) {
|
|
685
|
+
const C = g.output || "canvas";
|
|
686
|
+
if (!A || !A.topLeft || !A.topRight || !A.bottomRight || !A.bottomLeft)
|
|
687
|
+
return {
|
|
688
|
+
output: null,
|
|
689
|
+
corners: null,
|
|
690
|
+
success: !1,
|
|
691
|
+
message: "Invalid corner points provided"
|
|
692
|
+
};
|
|
693
|
+
try {
|
|
694
|
+
const E = document.createElement("canvas"), B = E.getContext("2d");
|
|
695
|
+
j(B, I, A);
|
|
696
|
+
let Q;
|
|
697
|
+
return C === "canvas" ? Q = E : C === "imagedata" ? Q = E.getContext("2d").getImageData(0, 0, E.width, E.height) : C === "dataurl" ? Q = E.toDataURL() : Q = E, {
|
|
698
|
+
output: Q,
|
|
699
|
+
corners: A,
|
|
700
|
+
success: !0,
|
|
701
|
+
message: "Document extracted successfully"
|
|
702
|
+
};
|
|
703
|
+
} catch (E) {
|
|
704
|
+
return {
|
|
705
|
+
output: null,
|
|
706
|
+
corners: A,
|
|
707
|
+
success: !1,
|
|
708
|
+
message: `Extraction failed: ${E.message}`
|
|
709
|
+
};
|
|
710
|
+
}
|
|
888
711
|
}
|
|
889
|
-
async function
|
|
712
|
+
async function dA(I, A = {}) {
|
|
890
713
|
const g = A.mode || "detect", C = A.output || "canvas";
|
|
891
714
|
A.debug;
|
|
892
715
|
let E;
|
|
@@ -895,10 +718,10 @@ async function X(I, A = {}) {
|
|
|
895
718
|
else {
|
|
896
719
|
const s = document.createElement("canvas");
|
|
897
720
|
s.width = I.width || I.naturalWidth, s.height = I.height || I.naturalHeight;
|
|
898
|
-
const
|
|
899
|
-
|
|
721
|
+
const o = s.getContext("2d");
|
|
722
|
+
o.drawImage(I, 0, 0, s.width, s.height), E = o.getImageData(0, 0, s.width, s.height), s.width, s.height;
|
|
900
723
|
}
|
|
901
|
-
const B = await
|
|
724
|
+
const B = await MA(E, A);
|
|
902
725
|
if (!B.success)
|
|
903
726
|
return {
|
|
904
727
|
output: null,
|
|
@@ -914,7 +737,7 @@ async function X(I, A = {}) {
|
|
|
914
737
|
else if (g === "extract") {
|
|
915
738
|
Q = document.createElement("canvas");
|
|
916
739
|
const s = Q.getContext("2d");
|
|
917
|
-
|
|
740
|
+
j(s, I, B.corners);
|
|
918
741
|
}
|
|
919
742
|
return g !== "detect" && Q && (C === "canvas" ? i = Q : C === "imagedata" ? i = Q.getContext("2d").getImageData(0, 0, Q.width, Q.height) : C === "dataurl" ? i = Q.toDataURL() : i = Q), {
|
|
920
743
|
output: i,
|
|
@@ -925,15 +748,8 @@ async function X(I, A = {}) {
|
|
|
925
748
|
message: "Document detected"
|
|
926
749
|
};
|
|
927
750
|
}
|
|
928
|
-
const uA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
929
|
-
__proto__: null,
|
|
930
|
-
LiveScanner: dA,
|
|
931
|
-
checkWebcamAvailability: kA,
|
|
932
|
-
scanDocument: X
|
|
933
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
934
751
|
export {
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
X as scanDocument
|
|
752
|
+
YA as extractDocument,
|
|
753
|
+
dA as scanDocument
|
|
938
754
|
};
|
|
939
755
|
//# sourceMappingURL=scanic.js.map
|