scanic 0.1.4
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/LICENSE +21 -0
- package/README.md +334 -0
- package/dist/favicon.ico +0 -0
- package/dist/index.html +17 -0
- package/dist/scanic-logo-bg.png +0 -0
- package/dist/scanic.js +940 -0
- package/dist/scanic.js.map +1 -0
- package/dist/scanic.umd.cjs +2 -0
- package/dist/scanic.umd.cjs.map +1 -0
- package/package.json +37 -0
package/dist/scanic.js
ADDED
|
@@ -0,0 +1,940 @@
|
|
|
1
|
+
const K = {
|
|
2
|
+
// Contour detection params
|
|
3
|
+
MIN_CONTOUR_AREA: 1e3,
|
|
4
|
+
MIN_CONTOUR_POINTS: 10
|
|
5
|
+
}, O = 0, z = 1, x = 2, Y = [
|
|
6
|
+
{ dx: 0, dy: -1 },
|
|
7
|
+
// 0: Top
|
|
8
|
+
{ dx: 1, dy: -1 },
|
|
9
|
+
// 1: Top-right
|
|
10
|
+
{ dx: 1, dy: 0 },
|
|
11
|
+
// 2: Right
|
|
12
|
+
{ dx: 1, dy: 1 },
|
|
13
|
+
// 3: Bottom-right
|
|
14
|
+
{ dx: 0, dy: 1 },
|
|
15
|
+
// 4: Bottom
|
|
16
|
+
{ dx: -1, dy: 1 },
|
|
17
|
+
// 5: Bottom-left
|
|
18
|
+
{ dx: -1, dy: 0 },
|
|
19
|
+
// 6: Left
|
|
20
|
+
{ dx: -1, dy: -1 }
|
|
21
|
+
// 7: Top-left
|
|
22
|
+
];
|
|
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, t = new Int32Array(i * s);
|
|
25
|
+
for (let n = 0; n < C; n++)
|
|
26
|
+
for (let D = 0; D < g; D++)
|
|
27
|
+
I[n * g + D] > 0 && (t[(n + 1) * i + (D + 1)] = 1);
|
|
28
|
+
const e = [];
|
|
29
|
+
let o = 2;
|
|
30
|
+
for (let n = 1; n <= C; n++)
|
|
31
|
+
for (let D = 1; D <= g; D++) {
|
|
32
|
+
const h = t[n * i + D], y = t[n * i + (D - 1)];
|
|
33
|
+
let c = null, r = !1, w = -1;
|
|
34
|
+
if (h === 1 && y === 0 ? (r = !0, c = { x: D, y: n }, w = 2) : h === 0 && y >= 1 && y !== -1 && y === 1 && (r = !1, c = { x: D - 1, y: n }, w = 6), c) {
|
|
35
|
+
if (E === O && !r) {
|
|
36
|
+
t[c.y * i + c.x] = -1;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const F = o++, R = _(t, i, s, c, w, F);
|
|
40
|
+
if (R && R.length > 0) {
|
|
41
|
+
let S = R;
|
|
42
|
+
B === x && (S = $(R));
|
|
43
|
+
const d = S.map((G) => ({ x: G.x - 1, y: G.y - 1 }));
|
|
44
|
+
if (d.length >= (B === x ? 4 : K.MIN_CONTOUR_POINTS)) {
|
|
45
|
+
const G = {
|
|
46
|
+
id: F,
|
|
47
|
+
points: d,
|
|
48
|
+
isOuter: r
|
|
49
|
+
// Calculate area and bounding box later if needed for filtering/sorting
|
|
50
|
+
};
|
|
51
|
+
e.push(G);
|
|
52
|
+
}
|
|
53
|
+
} else
|
|
54
|
+
t[c.y * i + c.x] === 1 && (t[c.y * i + c.x] = F);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
e.forEach((n) => {
|
|
58
|
+
n.area = AA(n.points), n.boundingBox = IA(n.points);
|
|
59
|
+
});
|
|
60
|
+
const a = e.filter((n) => n.area >= Q);
|
|
61
|
+
return a.sort((n, D) => D.area - n.area), A.debug && (A.debug.labels = t, A.debug.rawContours = e, A.debug.finalContours = a), a;
|
|
62
|
+
}
|
|
63
|
+
function _(I, A, g, C, E, B) {
|
|
64
|
+
const Q = [], i = /* @__PURE__ */ new Set();
|
|
65
|
+
let s = { ...C }, t = -1;
|
|
66
|
+
I[C.y * A + C.x] = B;
|
|
67
|
+
let e = 0;
|
|
68
|
+
const o = A * g;
|
|
69
|
+
for (; e++ < o; ) {
|
|
70
|
+
let a;
|
|
71
|
+
if (t === -1) {
|
|
72
|
+
let h = !1;
|
|
73
|
+
for (let y = 0; y < 8; y++) {
|
|
74
|
+
a = (E + y) % 8;
|
|
75
|
+
const c = s.x + Y[a].dx, r = s.y + Y[a].dy;
|
|
76
|
+
if (c >= 0 && c < A && r >= 0 && r < g && I[r * A + c] > 0) {
|
|
77
|
+
h = !0;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (!h) return null;
|
|
82
|
+
} else
|
|
83
|
+
a = (t + 2) % 8;
|
|
84
|
+
let n = null;
|
|
85
|
+
for (let h = 0; h < 8; h++) {
|
|
86
|
+
const y = (a + h) % 8, c = s.x + Y[y].dx, r = s.y + Y[y].dy;
|
|
87
|
+
if (c >= 0 && c < A && r >= 0 && r < g && I[r * A + c] > 0) {
|
|
88
|
+
n = { x: c, y: r }, t = (y + 4) % 8;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (!n) {
|
|
93
|
+
Q.length === 0 && Q.push({ ...s }), console.warn(`Contour tracing stopped unexpectedly at (${s.x - 1}, ${s.y - 1}) for contour ${B}`);
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
const D = `${s.x},${s.y}`;
|
|
97
|
+
if (i.has(D))
|
|
98
|
+
return Q;
|
|
99
|
+
if (Q.push({ ...s }), i.add(D), I[n.y * A + n.x] === 1 && (I[n.y * A + n.x] = B), s = n, s.x === C.x && s.y === C.y)
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
return e >= o ? (console.warn(`Contour tracing exceeded max steps for contour ${B}`), null) : Q;
|
|
103
|
+
}
|
|
104
|
+
function $(I) {
|
|
105
|
+
if (I.length <= 2)
|
|
106
|
+
return I;
|
|
107
|
+
const A = [], g = I.length;
|
|
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, t = Q.x - B.x, e = Q.y - B.y;
|
|
110
|
+
i * e !== s * t && A.push(B);
|
|
111
|
+
}
|
|
112
|
+
if (A.length === 0 && g > 0) {
|
|
113
|
+
if (g === 1) return [I[0]];
|
|
114
|
+
if (g === 2) return I;
|
|
115
|
+
let C = 0, E = 1;
|
|
116
|
+
const B = I[0];
|
|
117
|
+
for (let Q = 1; Q < g; Q++) {
|
|
118
|
+
const i = I[Q], s = (i.x - B.x) ** 2 + (i.y - B.y) ** 2;
|
|
119
|
+
s > C && (C = s, E = Q);
|
|
120
|
+
}
|
|
121
|
+
return [I[0], I[E]];
|
|
122
|
+
}
|
|
123
|
+
return A;
|
|
124
|
+
}
|
|
125
|
+
function AA(I) {
|
|
126
|
+
let A = 0;
|
|
127
|
+
const g = I.length;
|
|
128
|
+
if (g < 3) return 0;
|
|
129
|
+
for (let C = 0; C < g; C++) {
|
|
130
|
+
const E = (C + 1) % g;
|
|
131
|
+
A += I[C].x * I[E].y, A -= I[E].x * I[C].y;
|
|
132
|
+
}
|
|
133
|
+
return Math.abs(A) / 2;
|
|
134
|
+
}
|
|
135
|
+
function IA(I) {
|
|
136
|
+
if (I.length === 0)
|
|
137
|
+
return { minX: 0, minY: 0, maxX: 0, maxY: 0 };
|
|
138
|
+
let A = I[0].x, g = I[0].y, C = I[0].x, E = I[0].y;
|
|
139
|
+
for (let B = 1; B < I.length; B++) {
|
|
140
|
+
const Q = I[B];
|
|
141
|
+
A = Math.min(A, Q.x), g = Math.min(g, Q.y), C = Math.max(C, Q.x), E = Math.max(E, Q.y);
|
|
142
|
+
}
|
|
143
|
+
return { minX: A, minY: g, maxX: C, maxY: E };
|
|
144
|
+
}
|
|
145
|
+
function q(I, A = 1) {
|
|
146
|
+
if (I.length <= 2)
|
|
147
|
+
return I;
|
|
148
|
+
let g = 0, C = 0;
|
|
149
|
+
const E = I[0], B = I[I.length - 1];
|
|
150
|
+
for (let Q = 1; Q < I.length - 1; Q++) {
|
|
151
|
+
const i = gA(I[Q], E, B);
|
|
152
|
+
i > g && (g = i, C = Q);
|
|
153
|
+
}
|
|
154
|
+
if (g > A) {
|
|
155
|
+
const Q = q(I.slice(0, C + 1), A), i = q(I.slice(C), A);
|
|
156
|
+
return Q.slice(0, -1).concat(i);
|
|
157
|
+
} else
|
|
158
|
+
return [E, B];
|
|
159
|
+
}
|
|
160
|
+
function gA(I, A, g) {
|
|
161
|
+
const C = g.x - A.x, E = g.y - A.y, B = C * C + E * E;
|
|
162
|
+
if (B === 0)
|
|
163
|
+
return Math.sqrt(
|
|
164
|
+
Math.pow(I.x - A.x, 2) + Math.pow(I.y - A.y, 2)
|
|
165
|
+
);
|
|
166
|
+
const Q = ((I.x - A.x) * C + (I.y - A.y) * E) / B;
|
|
167
|
+
let i, s;
|
|
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 t = I.x - i, e = I.y - s;
|
|
170
|
+
return Math.sqrt(t * t + e * e);
|
|
171
|
+
}
|
|
172
|
+
function BA(I, A = 0.02) {
|
|
173
|
+
const g = QA(I), C = A * g;
|
|
174
|
+
return q(I, C);
|
|
175
|
+
}
|
|
176
|
+
function QA(I) {
|
|
177
|
+
let A = 0;
|
|
178
|
+
const g = I.length;
|
|
179
|
+
if (g < 2) return 0;
|
|
180
|
+
for (let C = 0; C < g; C++) {
|
|
181
|
+
const E = (C + 1) % g, B = I[C].x - I[E].x, Q = I[C].y - I[E].y;
|
|
182
|
+
A += Math.sqrt(B * B + Q * Q);
|
|
183
|
+
}
|
|
184
|
+
return A;
|
|
185
|
+
}
|
|
186
|
+
function CA(I) {
|
|
187
|
+
let A = 0, g = 0;
|
|
188
|
+
for (const C of I)
|
|
189
|
+
A += C.x, g += C.y;
|
|
190
|
+
return {
|
|
191
|
+
x: A / I.length,
|
|
192
|
+
y: g / I.length
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function EA(I, A = {}) {
|
|
196
|
+
if (!I || !I.points || I.points.length < 4)
|
|
197
|
+
return console.warn("Contour does not have enough points for corner detection"), null;
|
|
198
|
+
const g = A.epsilon || 0.02, C = BA(I, g);
|
|
199
|
+
let E;
|
|
200
|
+
return C && C.length === 4 ? E = tA(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
|
+
}
|
|
202
|
+
function iA(I) {
|
|
203
|
+
if (!I || I.length === 0) return null;
|
|
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 t = 1; t < I.length; t++) {
|
|
206
|
+
const e = I[t], o = e.x + e.y, a = e.x - e.y;
|
|
207
|
+
o < B && (B = o, A = e), o > i && (i = o, C = e), a > Q && (Q = a, g = e), a < s && (s = a, E = e);
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
topLeft: A,
|
|
211
|
+
topRight: g,
|
|
212
|
+
bottomRight: C,
|
|
213
|
+
bottomLeft: E
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function tA(I) {
|
|
217
|
+
if (I.length !== 4)
|
|
218
|
+
return console.warn(`Expected 4 points, got ${I.length}`), null;
|
|
219
|
+
const A = CA(I), g = [...I].sort((Q, i) => {
|
|
220
|
+
const s = Math.atan2(Q.y - A.y, Q.x - A.x), t = Math.atan2(i.y - A.y, i.x - A.x);
|
|
221
|
+
return s - t;
|
|
222
|
+
});
|
|
223
|
+
let C = 1 / 0, E = 0;
|
|
224
|
+
for (let Q = 0; Q < 4; Q++) {
|
|
225
|
+
const i = g[Q].x + g[Q].y;
|
|
226
|
+
i < C && (C = i, E = Q);
|
|
227
|
+
}
|
|
228
|
+
const B = [
|
|
229
|
+
g[E],
|
|
230
|
+
g[(E + 1) % 4],
|
|
231
|
+
g[(E + 2) % 4],
|
|
232
|
+
g[(E + 3) % 4]
|
|
233
|
+
];
|
|
234
|
+
return {
|
|
235
|
+
topLeft: B[0],
|
|
236
|
+
topRight: B[1],
|
|
237
|
+
bottomRight: B[2],
|
|
238
|
+
bottomLeft: B[3]
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
let N, M = null;
|
|
242
|
+
function W() {
|
|
243
|
+
return (M === null || M.byteLength === 0) && (M = new Uint8Array(N.memory.buffer)), M;
|
|
244
|
+
}
|
|
245
|
+
let k = 0;
|
|
246
|
+
function T(I, A) {
|
|
247
|
+
const g = A(I.length * 1, 1) >>> 0;
|
|
248
|
+
return W().set(I, g / 1), k = I.length, g;
|
|
249
|
+
}
|
|
250
|
+
function b(I, A) {
|
|
251
|
+
return I = I >>> 0, W().subarray(I / 1, I / 1 + A);
|
|
252
|
+
}
|
|
253
|
+
function sA(I, A, g, C) {
|
|
254
|
+
const E = T(I, N.__wbindgen_malloc), B = k, Q = N.dilate(E, B, A, g, C);
|
|
255
|
+
var i = b(Q[0], Q[1]).slice();
|
|
256
|
+
return N.__wbindgen_free(Q[0], Q[1] * 1, 1), i;
|
|
257
|
+
}
|
|
258
|
+
let L = null;
|
|
259
|
+
function Z() {
|
|
260
|
+
return (L === null || L.byteLength === 0) && (L = new Float32Array(N.memory.buffer)), L;
|
|
261
|
+
}
|
|
262
|
+
function eA(I, A) {
|
|
263
|
+
const g = A(I.length * 4, 4) >>> 0;
|
|
264
|
+
return Z().set(I, g / 4), k = I.length, g;
|
|
265
|
+
}
|
|
266
|
+
function oA(I, A, g, C, E) {
|
|
267
|
+
const B = eA(I, N.__wbindgen_malloc), Q = k, i = N.hysteresis_thresholding(B, Q, A, g, C, E);
|
|
268
|
+
var s = b(i[0], i[1]).slice();
|
|
269
|
+
return N.__wbindgen_free(i[0], i[1] * 1, 1), s;
|
|
270
|
+
}
|
|
271
|
+
function aA(I, A, g, C, E) {
|
|
272
|
+
const B = T(I, N.__wbindgen_malloc), Q = k, i = N.blur(B, Q, A, g, C, E);
|
|
273
|
+
var s = b(i[0], i[1]).slice();
|
|
274
|
+
return N.__wbindgen_free(i[0], i[1] * 1, 1), s;
|
|
275
|
+
}
|
|
276
|
+
let m = null;
|
|
277
|
+
function nA() {
|
|
278
|
+
return (m === null || m.byteLength === 0) && (m = new Uint16Array(N.memory.buffer)), m;
|
|
279
|
+
}
|
|
280
|
+
function p(I, A) {
|
|
281
|
+
const g = A(I.length * 2, 2) >>> 0;
|
|
282
|
+
return nA().set(I, g / 2), k = I.length, g;
|
|
283
|
+
}
|
|
284
|
+
function DA(I, A) {
|
|
285
|
+
return I = I >>> 0, Z().subarray(I / 4, I / 4 + A);
|
|
286
|
+
}
|
|
287
|
+
function cA(I, A, g, C, E) {
|
|
288
|
+
const B = p(I, N.__wbindgen_malloc), Q = k, i = p(A, N.__wbindgen_malloc), s = k, t = N.non_maximum_suppression(B, Q, i, s, g, C, E);
|
|
289
|
+
var e = DA(t[0], t[1]).slice();
|
|
290
|
+
return N.__wbindgen_free(t[0], t[1] * 4, 4), e;
|
|
291
|
+
}
|
|
292
|
+
async function hA(I, A) {
|
|
293
|
+
if (typeof Response == "function" && I instanceof Response) {
|
|
294
|
+
if (typeof WebAssembly.instantiateStreaming == "function")
|
|
295
|
+
try {
|
|
296
|
+
return await WebAssembly.instantiateStreaming(I, A);
|
|
297
|
+
} catch (C) {
|
|
298
|
+
if (I.headers.get("Content-Type") != "application/wasm")
|
|
299
|
+
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", C);
|
|
300
|
+
else
|
|
301
|
+
throw C;
|
|
302
|
+
}
|
|
303
|
+
const g = await I.arrayBuffer();
|
|
304
|
+
return await WebAssembly.instantiate(g, A);
|
|
305
|
+
} else {
|
|
306
|
+
const g = await WebAssembly.instantiate(I, A);
|
|
307
|
+
return g instanceof WebAssembly.Instance ? { instance: g, module: I } : g;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function yA() {
|
|
311
|
+
const I = {};
|
|
312
|
+
return I.wbg = {}, I.wbg.__wbindgen_init_externref_table = function() {
|
|
313
|
+
const A = N.__wbindgen_export_0, g = A.grow(4);
|
|
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
|
+
}, I;
|
|
316
|
+
}
|
|
317
|
+
function rA(I, A) {
|
|
318
|
+
return N = I.exports, P.__wbindgen_wasm_module = A, L = null, m = null, M = null, N.__wbindgen_start(), N;
|
|
319
|
+
}
|
|
320
|
+
async function P(I) {
|
|
321
|
+
if (N !== void 0) return N;
|
|
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///wdLckUEQCAGRQ0BQcWXwAAtAAAaQQIhDSAGQQIQMyIBDQILIA0gBhAvAAtBACEGIAtBADYCKCALQoCAgIAgNwIgIAtBADYCNCALQoCAgIAgNwIsQQIhAUEBIRhBAiECDAELIAtBADYCKCALIAE2AiQgCyAANgIgQcWXwAAtAAAaAkACQAJAIAZBAhAzIgIEQEEAIQYgC0EANgI0IAsgAjYCMCALIAA2AiwgAEUEQEEBIRhBACENDAULIABFIRggCygCGCEBIAsoAhwhEiAAIQIDQCAGIBJPDQMgAS8BACENIAsoAigiECALKAIgRgRAIAtBIGoQEgsgCygCJCAQQQF0aiANOwEAIAsgEEEBajYCKCAGQQFqIBJPDQIgAUECai8BACENIAsoAjQiECALKAIsRgRAIAtBLGoQEgsgCygCMCAQQQF0aiANOwEAIAsgEEEBaiINNgI0IAFBBGohASAGQQJqIQYgAkEBayICDQALDAMLQQIgBhAvAAsgBkEBaiASQeCCwAAQGQALIAYgEkHQgsAAEBkACyALKAIoIQYgCygCJCEBIAsoAjAhAgsgC0E4aiABIAYgAiANIBEgAyAMQQBHEAMgCygCQCETIAsoAjwhGgJAAkACfyAYBEBBASEOQQAMAQtBxZfAAC0AABogAEEBEDQiDkUNASAACyEbIAtBADYCTCALQoCAgIDAADcCRAJAAkACQAJAAkACQCADQQFrIhJBAkkNACARQQFrIhBBAkkNACAFIAWUIAUgDBshByAEIASUIAQgDBshBUEBIQIDQCACIBFsIQ0gAkEBakEBIQYDQCAGIA1qIgwgE08NBgJAIAcgGiAMQQJ0aioCACIEXwRAIAAgDE0NBiAMIA5qQQI6AAAgCygCTCIPIAsoAkRGBEAgC0HEAGoQEAsgCygCSCAPQQN0aiIMIAI2AgQgDCAGNgIAIAsgD0EBajYCTAwBCyAEIAVgRQ0AIAAgDE0NBiAMIA5qQQE6AAALIAZBAWoiBiAQRw0ACyICIBJHDQALIAsoAkwiBkUNAANAIAsgBkEBayIGNgJMIAsoAkggBkEDdGoiASgCACIURSARIBRNciENIBRBAWoiFUEARyARIBVLcSESIBRBAWsiFkEARyARIBZLcSEQAkAgASgCBCITQQFrIg8gA08gD0VyDQAgDyARbCEMAkAgEEUNACAMIBZqIgIgAE8NBCACIA5qIgEtAABBAUcNACABQQI6AAAgCygCTCICIAsoAkRGBEAgC0HEAGoQEAsgCygCSCACQQN0aiIBIA82AgQgASAWNgIAIAsgAkEBaiIGNgJMCwJAIA0NACAMIBRqIgIgAE8NBCACIA5qIgEtAABBAUcNACABQQI6AAAgCygCTCICIAsoAkRGBEAgC0HEAGoQEAsgCygCSCACQQN0aiIBIA82AgQgASAUNgIAIAsgAkEBaiIGNgJMCyASRQ0AIAwgFWoiAiAATw0DIAIgDmoiAS0AAEEBRw0AIAFBAjoAACALKAJMIgIgCygCREYEQCALQcQAahAQCyALKAJIIAJBA3RqIgEgDzYCBCABIBU2AgAgCyACQQFqIgY2AkwLAkAgE0UgAyATTXINACARIBNsIQwCQCAQRQ0AIAwgFmoiAiAATw0EIAIgDmoiAS0AAEEBRw0AIAFBAjoAACALKAJMIgIgCygCREYEQCALQcQAahAQCyALKAJIIAJBA3RqIgEgEzYCBCABIBY2AgAgCyACQQFqIgY2AkwLIBJFDQAgDCAVaiICIABPDQMgAiAOaiIBLQAAQQFHDQAgAUECOgAAIAsoAkwiAiALKAJERgRAIAtBxABqEBALIAsoAkggAkEDdGoiASATNgIEIAEgFTYCACALIAJBAWoiBjYCTAsCQCATQQFqIg8gA08gD0VyDQAgDyARbCEMAkAgEEUNACAMIBZqIgIgAE8NBCACIA5qIgEtAABBAUcNACABQQI6AAAgCygCTCICIAsoAkRGBEAgC0HEAGoQEAsgCygCSCACQQN0aiIBIA82AgQgASAWNgIAIAsgAkEBaiIGNgJMCwJAIA0NACAMIBRqIgIgAE8NBCACIA5qIgEtAABBAUcNACABQQI6AAAgCygCTCICIAsoAkRGBEAgC0HEAGoQEAsgCygCSCACQQN0aiIBIA82AgQgASAUNgIAIAsgAkEBaiIGNgJMCyASRQ0AIAwgFWoiAiAATw0DIAIgDmoiAS0AAEEBRw0AIAFBAjoAACALKAJMIgIgCygCREYEQCALQcQAahAQCyALKAJIIAJBA3RqIgEgDzYCBCABIBU2AgAgCyACQQFqIgY2AkwLIAYNAAsLIBgEQEEAIQFBASENDAULQQAhBkHFl8AALQAAGiAAQQEQNCINBEAgAEEBRwRAIABB/v///wdxIQIDQCAGIA5qIgEtAABBAkYEQCAGIA1qQf8BOgAACyABQQFqLQAAQQJGBEAgBiANakEBakH/AToAAAsgAiAGQQJqIgZHDQALCwJAIABBAXFFDQAgBiAOai0AAEECRw0AIAYgDWpB/wE6AAALIAAhAQwFCwwFCyACIABBkILAABAZAAsgDCAAQcCCwAAQGQALIAwgAEGwgsAAEBkACyAMIBNBoILAABAZAAsgCygCRCICBEAgCygCSCACQQN0EDkLIBsEQCAOIBsQOQsCQCAJBEBBASEGIBhFBEBBxZfAAC0AABogAEEBEDQiBkUNAgsgDSAAIBEgAyAKIAYgABACIAEEQCANIAEQOQsgBiENCyALKAI4IgEEQCAaIAFBAnQQOQsgCygCLCIBBEAgCygCMCABQQF0EDkLIAsoAiAiAQRAIAsoAiQgAUEBdBA5CyALKAIUIgEEQCALKAIYIAFBAXQQOQsgCygCCCIBBEAgHCABEDkLIBkEQCAIIBkQOQsgFyAANgIEIBcgDTYCACALQdAAaiQADAILC0EBIAAQLwALIBcoAgAgFygCBCAXQRBqJAALOAACQCACQYCAxABGDQAgACACIAEoAhARAgBFDQBBAQ8LIANFBEBBAA8LIAAgA0EAIAEoAgwRAwALOAACQCABaUEBRkGAgICAeCABayAAT3FFDQAgAARAQcWXwAAtAAAaIAAgARAzIgFFDQELIAEPCwALNgEBfyMAQSBrIgEkACABQQA2AhggAUEBNgIMIAFBmJfAADYCCCABQgQ3AhAgAUEIaiAAECkAC8gBAQJ/IwBBEGsiCCQAIwBBEGsiByQAIAdBBGogACABIAIgAyAEIAUgBkEARxADIAMEQCACIANBAXQQOQsgAQRAIAAgAUEBdBA5CwJAIAcoAgQiASAHKAIMIgBNBEAgBygCCCEBDAELIAFBAnQhAiAHKAIIIQMgAEUEQEEEIQEgAyACEDkMAQsgAyACQQQgAEECdCICEDAiAQ0AQQQgAhAvAAsgCCAANgIEIAggATYCACAHQRBqJAAgCCgCACAIKAIEIAhBEGokAAuNFgIVfwF9IwBBEGsiFCQAIAAhFSABIRNBACEAIwBBEGsiBiQAAkACQAJAAkACQAJAAkACQAJAAkACQCADIAIiB2wiCEEASA0AQQEhAiAIBEBBxZfAAC0AABpBASEAIAhBARAzIgJFDQELIAJBASAIEBMhCkHFl8AALQAAGkGAwABBBBAzIgAEQCAGQQA2AgwgBiAANgIIIAZBgAg2AgQgA0EBayIZQQJJDQsgB0EBayEWIAdBAmsiC0F8cSEXIAtBBEkNAkEBIAtBAnYiACAAQQFNGyERIAdBAnQiGCAAQQR0aiAVakEEaiEJIBdBAWohDyAHIApqIQEgFSAYaiEMQQEhEgNAIBIiECAHbCIAIBZqIgMgAEEBaiIASQ0KIAMgE0sNCCADIAhLDQYgEEEBaiESQQAhAyARIQIgDCEAAkACQAJAAkACQANAIAMgC08NAyADQQFqIRoCQCAAQQRqKgIAIhsgBWBFBEAgBCAbX0UNASABIANqQQFqQQA6AAAMAQsgASADakEBakECOgAAIAYoAgwiDSAGKAIERgRAIAZBBGoQEAsgBigCCCANQQN0aiIOIBA2AgQgDiAaNgIAIAYgDUEBajYCDAsCQAJAIAsgGksEQCAAQQhqKgIAIhsgBWBFDQEgASADakECakECOgAAIAYoAgwiDSAGKAIERgRAIAZBBGoQEAsgBigCCCANQQN0aiIOIBA2AgQgDiADQQJqNgIAIAYgDUEBajYCDAwCCyADQQFqIQMMBQsgBCAbX0UNACABIANqQQJqQQA6AAALIANBAmogC08NAQJAIAUgAEEMaioCACIbXwRAIAEgA2pBA2pBAjoAACAGKAIMIg0gBigCBEYEQCAGQQRqEBALIAYoAgggDUEDdGoiDiAQNgIEIA4gA0EDajYCACAGIA1BAWo2AgwMAQsgBCAbX0UNACABIANqQQNqQQA6AAALIANBA2ogC08NAgJAIAUgAEEQaiIAKgIAIhtfBEAgASADakEEakECOgAAIAYoAgwiDSAGKAIERgRAIAZBBGoQEAsgBigCCCANQQN0aiIOIBA2AgQgDiADQQRqNgIAIAYgDUEBajYCDAwBCyAEIBtfRQ0AIAEgA2pBBGpBADoAAAsgA0EEaiEDIAJBAWsiAg0ACyAJIQAgDyEDIAsgF0YNBAwDCyADQQJqIQMMAQsgA0EDaiEDCyADIAtBtIPAABAZAAsDQCADIQICQCAAKgIAIhsgBWBFBEAgBCAbX0UNASABIANqQQA6AAAMAQsgASACakECOgAAIAYoAgwiDiAGKAIERgRAIAZBBGoQEAsgBigCCCAOQQN0aiIDIBA2AgQgAyACNgIAIAYgDkEBajYCDAsgAEEEaiEAIAJBAWohAyACIAtJDQALCyAJIBhqIQkgASAHaiEBIAwgGGohDCASIBlHDQALDAMLQQRBgMAAEC8ACyAAIAgQLwALIAsgF0cEQCAHQQJ0IgkgC0ECdEFwcWogFWpBBGohESAXQQFqIQ8gByAKaiESQQEhAgNAIAIgB2wiACAWaiIDIABBAWoiAEkNCCADIBNLDQYgAyAISw0EIAJBAWogESEAIA8hAQNAIAEhDAJAIAUgACoCACIbXwRAIAEgEmpBAjoAACAGKAIMIhAgBigCBEYEQCAGQQRqEBALIAYoAgggEEEDdGoiASACNgIEIAEgDDYCACAGIBBBAWo2AgwMAQsgBCAbX0UNACAMIBJqQQA6AAALIABBBGohACAMQQFqIQEgCyAMSw0ACyAJIBFqIREgByASaiESIgIgGUcNAAsMAQsgA0ECayEAIAdBAWohAiAHQQF0QQFrIQFBACEDA0AgASADaiIPIAIgA2pJDQYgDyATSw0EIAggD0kNAiADIAdqIQMgAEEBayIADQALCyAGKAIMIgJFDQcgB0EBaiEMQQEgB2shESAHQX9zIQ8gB0UNBgNAIAYgAkEBayICNgIMAkAgBigCCCACQQN0aiIAKAIEIAdsIAAoAgBqIgkgD2oiASAITw0AIAEgCmoiAC0AAA0AIABBAjoAACABIAEgB24iAiAHbGshASAGKAIMIgMgBigCBEYEQCAGQQRqEBALIAYoAgggA0EDdGoiACACNgIEIAAgATYCACAGIANBAWoiAjYCDAsCQCAJIAdrIgEgCE8NACABIApqIgAtAAANACAAQQI6AAAgASABIAduIgIgB2xrIQEgBigCDCIDIAYoAgRGBEAgBkEEahAQCyAGKAIIIANBA3RqIgAgAjYCBCAAIAE2AgAgBiADQQFqIgI2AgwLAkAgCSARaiIBIAhPDQAgASAKaiIALQAADQAgAEECOgAAIAEgASAHbiICIAdsayEBIAYoAgwiAyAGKAIERgRAIAZBBGoQEAsgBigCCCADQQN0aiIAIAI2AgQgACABNgIAIAYgA0EBaiICNgIMCwJAIAlBAWsiASAITw0AIAEgCmoiAC0AAA0AIABBAjoAACABIAEgB24iAiAHbGshASAGKAIMIgMgBigCBEYEQCAGQQRqEBALIAYoAgggA0EDdGoiACACNgIEIAAgATYCACAGIANBAWoiAjYCDAsCQCAJQQFqIgEgCE8NACABIApqIgAtAAANACAAQQI6AAAgASABIAduIgIgB2xrIQEgBigCDCIDIAYoAgRGBEAgBkEEahAQCyAGKAIIIANBA3RqIgAgAjYCBCAAIAE2AgAgBiADQQFqIgI2AgwLAkAgCSAWaiIBIAhPDQAgASAKaiIALQAADQAgAEECOgAAIAEgASAHbiICIAdsayEBIAYoAgwiAyAGKAIERgRAIAZBBGoQEAsgBigCCCADQQN0aiIAIAI2AgQgACAB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AAAPAAAAEwAAAExhenkgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZAAAhAcQACoAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9vbmNlX2NlbGwtMS4yMS4zL3NyYy9saWIucnMAALgHEABaAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAJAgQAA4AAAC4BxAAWgAAAHoCAAANAAAABAAAAAwAAAAEAAAABQAAAAYAAAAHAAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuNi9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAGQIEAApAAAAqAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAABkCBAAKQAAAK4EAAANAAAAbWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAAADAkQABUAAAAhCRAADQAAAHN0ZC9zcmMvYWxsb2MucnNACRAAEAAAAGMBAAAJAAAABAAAAAwAAAAEAAAACAAAAAAAAAAIAAAABAAAAAkAAAAAAAAACAAAAAQAAAAKAAAACwAAAAwAAAANAAAADgAAABAAAAAEAAAADwAAABAAAAARAAAAEgAAAGNhcGFjaXR5IG92ZXJmbG93AAAAuAkQABEAAABhbGxvYy9zcmMvcmF3X3ZlYy5yc9QJEAAUAAAAGAAAAAUAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAA+AkQACAAAAAYChAAEgAAADAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5IG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIHJhbmdlIGVuZCBpbmRleCAAACYLEAAQAAAABAsQACIAAABzbGljZSBpbmRleCBzdGFydHMgYXQgIGJ1dCBlbmRzIGF0IABICxAAFgAAAF4LEAANAAAAYXR0ZW1wdCB0byBkaXZpZGUgYnkgemVybwAAAHwLEAAZAAAAAAAAPwAAAL8AQcCXwAALAQEAfAlwcm9kdWNlcnMCCGxhbmd1YWdlAQRSdXN0AAxwcm9jZXNzZWQtYnkDBXJ1c3RjHTEuODMuMCAoOTBiMzVhNjIzIDIwMjQtMTEtMjYpBndhbHJ1cwYwLjIzLjMMd2FzbS1iaW5kZ2VuEzAuMi4xMDAgKDI0MDVlYzJiNCkAUg90YXJnZXRfZmVhdHVyZXMFKw9tdXRhYmxlLWdsb2JhbHMrB3NpbWQxMjgrCHNpZ24tZXh0Kw9yZWZlcmVuY2UtdHlwZXMrCm11bHRpdmFsdWU=", import.meta.url));
|
|
323
|
+
const A = yA();
|
|
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 hA(await I, A);
|
|
326
|
+
return rA(g, C);
|
|
327
|
+
}
|
|
328
|
+
const u = P();
|
|
329
|
+
function wA(I) {
|
|
330
|
+
const { width: A, height: g, data: C } = I, E = new Uint8ClampedArray(A * g);
|
|
331
|
+
for (let B = 0, Q = 0; B < C.length; B += 4, Q++)
|
|
332
|
+
E[Q] = C[B] * 54 + C[B + 1] * 183 + C[B + 2] * 19 >> 8;
|
|
333
|
+
return E;
|
|
334
|
+
}
|
|
335
|
+
function NA(I, A, g, C = 5, E = 0) {
|
|
336
|
+
E === 0 && (E = 0.3 * ((C - 1) * 0.5 - 1) + 0.8);
|
|
337
|
+
const B = Math.floor(C / 2), Q = FA(C, E), i = new Uint8ClampedArray(A * g), s = new Uint8ClampedArray(A * g);
|
|
338
|
+
for (let t = 0; t < g; t++) {
|
|
339
|
+
const e = t * A;
|
|
340
|
+
for (let o = 0; o < A; o++) {
|
|
341
|
+
let a = 0;
|
|
342
|
+
for (let n = -B; n <= B; n++) {
|
|
343
|
+
const D = Math.min(A - 1, Math.max(0, o + n));
|
|
344
|
+
a += I[e + D] * Q[B + n];
|
|
345
|
+
}
|
|
346
|
+
i[e + o] = a;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
for (let t = 0; t < A; t++)
|
|
350
|
+
for (let e = 0; e < g; e++) {
|
|
351
|
+
let o = 0;
|
|
352
|
+
for (let a = -B; a <= B; a++) {
|
|
353
|
+
const n = Math.min(g - 1, Math.max(0, e + a));
|
|
354
|
+
o += i[n * A + t] * Q[B + a];
|
|
355
|
+
}
|
|
356
|
+
s[e * A + t] = Math.round(o);
|
|
357
|
+
}
|
|
358
|
+
return s;
|
|
359
|
+
}
|
|
360
|
+
function FA(I, A) {
|
|
361
|
+
const g = new Float32Array(I), C = Math.floor(I / 2);
|
|
362
|
+
let E = 0;
|
|
363
|
+
for (let B = 0; B < I; B++) {
|
|
364
|
+
const Q = B - C;
|
|
365
|
+
g[B] = Math.exp(-(Q * Q) / (2 * A * A)), E += g[B];
|
|
366
|
+
}
|
|
367
|
+
for (let B = 0; B < I; B++)
|
|
368
|
+
g[B] /= E;
|
|
369
|
+
return g;
|
|
370
|
+
}
|
|
371
|
+
function RA(I, A, g) {
|
|
372
|
+
const C = new Int16Array(A * g), E = new Int16Array(A * g);
|
|
373
|
+
for (let B = 1; B < g - 1; B++) {
|
|
374
|
+
const Q = B * A, i = (B - 1) * A, s = (B + 1) * A;
|
|
375
|
+
for (let t = 1; t < A - 1; t++) {
|
|
376
|
+
const e = Q + t, o = I[i + t - 1], a = I[i + t], n = I[i + t + 1], D = I[Q + t - 1], h = I[Q + t + 1], y = I[s + t - 1], c = I[s + t], r = I[s + t + 1], w = n - o + 2 * (h - D) + (r - y), F = y + 2 * c + r - (o + 2 * a + n);
|
|
377
|
+
C[e] = w, E[e] = F;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return { dx: C, dy: E };
|
|
381
|
+
}
|
|
382
|
+
function lA(I, A, g, C, E) {
|
|
383
|
+
const B = new Float32Array(g * C), Q = new Float32Array(g * C);
|
|
384
|
+
for (let i = 0; i < I.length; i++) {
|
|
385
|
+
const s = I[i], t = A[i];
|
|
386
|
+
E ? B[i] = Math.sqrt(s * s + t * t) : B[i] = Math.abs(s) + Math.abs(t);
|
|
387
|
+
}
|
|
388
|
+
for (let i = 1; i < C - 1; i++)
|
|
389
|
+
for (let s = 1; s < g - 1; s++) {
|
|
390
|
+
const t = i * g + s, e = B[t];
|
|
391
|
+
if (e === 0) {
|
|
392
|
+
Q[t] = 0;
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
const o = I[t], a = A[t];
|
|
396
|
+
let n = 0, D = 0;
|
|
397
|
+
const h = Math.abs(o), y = Math.abs(a);
|
|
398
|
+
if (y > h * 2.4142)
|
|
399
|
+
n = B[t - g], D = B[t + g];
|
|
400
|
+
else if (h > y * 2.4142)
|
|
401
|
+
n = B[t - 1], D = B[t + 1];
|
|
402
|
+
else {
|
|
403
|
+
const c = (o ^ a) < 0 ? -1 : 1;
|
|
404
|
+
a > 0 ? (n = B[(i - 1) * g + (s - c)], D = B[(i + 1) * g + (s + c)]) : (n = B[(i + 1) * g + (s - c)], D = B[(i - 1) * g + (s + c)]), o > 0 && a > 0 || o < 0 && a < 0 ? (n = B[(i - 1) * g + (s + 1)], D = B[(i + 1) * g + (s - 1)]) : (n = B[(i - 1) * g + (s - 1)], D = B[(i + 1) * g + (s + 1)]);
|
|
405
|
+
}
|
|
406
|
+
e >= n && e >= D ? Q[t] = e : Q[t] = 0;
|
|
407
|
+
}
|
|
408
|
+
return Q;
|
|
409
|
+
}
|
|
410
|
+
function v(I, A, g, C, E) {
|
|
411
|
+
const B = new Uint8Array(A * g), Q = [];
|
|
412
|
+
for (let t = 1; t < g - 1; t++)
|
|
413
|
+
for (let e = 1; e < A - 1; e++) {
|
|
414
|
+
const o = t * A + e, a = I[o];
|
|
415
|
+
a >= E ? (B[o] = 2, Q.push({ x: e, y: t })) : a >= C ? B[o] = 0 : B[o] = 1;
|
|
416
|
+
}
|
|
417
|
+
for (let t = 0; t < A; t++)
|
|
418
|
+
B[t] = 1, B[(g - 1) * A + t] = 1;
|
|
419
|
+
for (let t = 1; t < g - 1; t++)
|
|
420
|
+
B[t * A] = 1, B[t * A + A - 1] = 1;
|
|
421
|
+
const i = [-1, 0, 1, -1, 1, -1, 0, 1], s = [-1, -1, -1, 0, 0, 1, 1, 1];
|
|
422
|
+
for (; Q.length > 0; ) {
|
|
423
|
+
const { x: t, y: e } = Q.pop();
|
|
424
|
+
for (let o = 0; o < 8; o++) {
|
|
425
|
+
const a = t + i[o], n = e + s[o], D = n * A + a;
|
|
426
|
+
B[D] === 0 && (B[D] = 2, Q.push({ x: a, y: n }));
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return B;
|
|
430
|
+
}
|
|
431
|
+
function GA(I, A, g, C = 5) {
|
|
432
|
+
const E = Math.floor(C / 2), B = new Uint8ClampedArray(A * g), Q = new Uint8ClampedArray(A * g);
|
|
433
|
+
for (let i = 0; i < g; i++) {
|
|
434
|
+
const s = i * A;
|
|
435
|
+
for (let t = 0; t < A; t++) {
|
|
436
|
+
let e = 0;
|
|
437
|
+
for (let o = -E; o <= E; o++) {
|
|
438
|
+
const a = t + o;
|
|
439
|
+
if (a >= 0 && a < A) {
|
|
440
|
+
const n = I[s + a];
|
|
441
|
+
n > e && (e = n);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
B[s + t] = e;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
for (let i = 0; i < A; i++)
|
|
448
|
+
for (let s = 0; s < g; s++) {
|
|
449
|
+
let t = 0;
|
|
450
|
+
for (let e = -E; e <= E; e++) {
|
|
451
|
+
const o = s + e;
|
|
452
|
+
if (o >= 0 && o < g) {
|
|
453
|
+
const a = B[o * A + i];
|
|
454
|
+
a > t && (t = a);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
Q[s * A + i] = t;
|
|
458
|
+
}
|
|
459
|
+
return Q;
|
|
460
|
+
}
|
|
461
|
+
async function dA(I, A = {}) {
|
|
462
|
+
const g = [], C = performance.now(), { width: E, height: B } = I;
|
|
463
|
+
let Q = A.lowThreshold !== void 0 ? A.lowThreshold : 75, i = A.highThreshold !== void 0 ? A.highThreshold : 200;
|
|
464
|
+
const s = A.kernelSize || 5, t = A.sigma || 0, e = A.L2gradient === void 0 ? !1 : A.L2gradient, o = A.applyDilation !== void 0 ? A.applyDilation : !0, a = A.dilationKernelSize || 5, n = A.useWasmHysteresis !== void 0 ? A.useWasmHysteresis : !1;
|
|
465
|
+
Q >= i && (console.warn(`Canny Edge Detector: lowThreshold (${Q}) should be lower than highThreshold (${i}). Swapping them.`), [Q, i] = [i, Q]);
|
|
466
|
+
let D = performance.now();
|
|
467
|
+
const h = wA(I);
|
|
468
|
+
let y = performance.now();
|
|
469
|
+
g.push({ step: "Grayscale", ms: (y - D).toFixed(2) }), A.debug && (A.debug.grayscale = h);
|
|
470
|
+
let c;
|
|
471
|
+
D = performance.now();
|
|
472
|
+
try {
|
|
473
|
+
await u, c = aA(h, E, B, s, t);
|
|
474
|
+
} catch {
|
|
475
|
+
c = NA(h, E, B, s, t);
|
|
476
|
+
}
|
|
477
|
+
y = performance.now(), g.push({ step: "Gaussian Blur", ms: (y - D).toFixed(2) }), A.debug && (A.debug.blurred = c), D = performance.now();
|
|
478
|
+
let r, w;
|
|
479
|
+
{
|
|
480
|
+
const l = RA(c, E, B);
|
|
481
|
+
r = l.dx, w = l.dy;
|
|
482
|
+
}
|
|
483
|
+
y = performance.now(), g.push({ step: "Gradients", ms: (y - D).toFixed(2) }), D = performance.now();
|
|
484
|
+
let F;
|
|
485
|
+
try {
|
|
486
|
+
await u, F = await cA(r, w, E, B, e);
|
|
487
|
+
} catch {
|
|
488
|
+
F = lA(r, w, E, B, e);
|
|
489
|
+
}
|
|
490
|
+
y = performance.now(), g.push({ step: "Non-Max Suppression", ms: (y - D).toFixed(2) }), D = performance.now();
|
|
491
|
+
const R = e ? Q * Q : Q, S = e ? i * i : i;
|
|
492
|
+
let d;
|
|
493
|
+
if (n)
|
|
494
|
+
try {
|
|
495
|
+
await u, d = oA(F, E, B, R, S);
|
|
496
|
+
} catch (l) {
|
|
497
|
+
console.warn("WASM hysteresis failed, falling back to JS:", l), d = v(F, E, B, R, S);
|
|
498
|
+
}
|
|
499
|
+
else
|
|
500
|
+
d = v(F, E, B, R, S);
|
|
501
|
+
y = performance.now(), g.push({ step: "Hysteresis", ms: (y - D).toFixed(2) }), D = performance.now();
|
|
502
|
+
const G = new Uint8ClampedArray(E * B);
|
|
503
|
+
for (let l = 0; l < d.length; l++)
|
|
504
|
+
G[l] = d[l] === 2 ? 255 : 0;
|
|
505
|
+
y = performance.now(), g.push({ step: "Binary Image", ms: (y - D).toFixed(2) }), D = performance.now();
|
|
506
|
+
let f = G;
|
|
507
|
+
if (o)
|
|
508
|
+
try {
|
|
509
|
+
await u, f = sA(G, E, B, a);
|
|
510
|
+
} catch {
|
|
511
|
+
f = GA(G, E, B, a);
|
|
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] = e ? 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 = d, 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 SA {
|
|
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;
|
|
570
|
+
}
|
|
571
|
+
this.isRunning = !0, this.lastDetectionTime = Date.now(), this.lastFPSUpdate = Date.now(), this.frameCount = 0, this.detectionCount = 0, console.log("Live scanner started"), this.processFrame();
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Stop the live scanning
|
|
575
|
+
*/
|
|
576
|
+
stop() {
|
|
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;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Update stable corner detection with smoothing
|
|
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
|
+
}
|
|
717
|
+
}
|
|
718
|
+
async function kA() {
|
|
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) {
|
|
731
|
+
const { width: g, height: C } = I, E = Math.max(g, C);
|
|
732
|
+
if (E <= A)
|
|
733
|
+
return {
|
|
734
|
+
scaledImageData: I,
|
|
735
|
+
scaleFactor: 1,
|
|
736
|
+
originalDimensions: { width: g, height: C },
|
|
737
|
+
scaledDimensions: { width: g, height: C }
|
|
738
|
+
};
|
|
739
|
+
const B = A / E, Q = Math.round(g * B), i = Math.round(C * B), s = document.createElement("canvas");
|
|
740
|
+
s.width = g, s.height = C, s.getContext("2d").putImageData(I, 0, 0);
|
|
741
|
+
const e = document.createElement("canvas");
|
|
742
|
+
e.width = Q, e.height = i;
|
|
743
|
+
const o = e.getContext("2d");
|
|
744
|
+
return o.imageSmoothingEnabled = !0, o.imageSmoothingQuality = "high", o.drawImage(s, 0, 0, g, C, 0, 0, Q, i), {
|
|
745
|
+
scaledImageData: o.getImageData(0, 0, Q, i),
|
|
746
|
+
scaleFactor: 1 / B,
|
|
747
|
+
// Return inverse for compatibility with existing code
|
|
748
|
+
originalDimensions: { width: g, height: C },
|
|
749
|
+
scaledDimensions: { width: Q, height: i }
|
|
750
|
+
};
|
|
751
|
+
}
|
|
752
|
+
async function JA(I, A = {}) {
|
|
753
|
+
const g = A.debug ? {} : null, C = A.maxProcessingDimension || 800, { scaledImageData: E, scaleFactor: B, originalDimensions: Q, scaledDimensions: i } = fA(I, C);
|
|
754
|
+
g && (g.preprocessing = {
|
|
755
|
+
originalDimensions: Q,
|
|
756
|
+
scaledDimensions: i,
|
|
757
|
+
scaleFactor: B,
|
|
758
|
+
maxProcessingDimension: C
|
|
759
|
+
});
|
|
760
|
+
const { width: s, height: t } = E, e = await dA(E, {
|
|
761
|
+
lowThreshold: A.lowThreshold || 75,
|
|
762
|
+
// Match OpenCV values
|
|
763
|
+
highThreshold: A.highThreshold || 200,
|
|
764
|
+
// Match OpenCV values
|
|
765
|
+
dilationKernelSize: A.dilationKernelSize || 3,
|
|
766
|
+
// Match OpenCV value
|
|
767
|
+
dilationIterations: A.dilationIterations || 1,
|
|
768
|
+
debug: g
|
|
769
|
+
}), o = V(e, {
|
|
770
|
+
minArea: (A.minArea || 1e3) / (B * B),
|
|
771
|
+
// Adjust minArea for scaled image
|
|
772
|
+
debug: g,
|
|
773
|
+
width: s,
|
|
774
|
+
height: t
|
|
775
|
+
});
|
|
776
|
+
if (!o || o.length === 0)
|
|
777
|
+
return console.log("No document detected"), {
|
|
778
|
+
success: !1,
|
|
779
|
+
message: "No document detected",
|
|
780
|
+
debug: g
|
|
781
|
+
};
|
|
782
|
+
const a = o[0], n = EA(a, {
|
|
783
|
+
epsilon: A.epsilon
|
|
784
|
+
// Pass epsilon for approximation
|
|
785
|
+
});
|
|
786
|
+
let D = n;
|
|
787
|
+
return B !== 1 && (D = {
|
|
788
|
+
topLeft: { x: n.topLeft.x * B, y: n.topLeft.y * B },
|
|
789
|
+
topRight: { x: n.topRight.x * B, y: n.topRight.y * B },
|
|
790
|
+
bottomRight: { x: n.bottomRight.x * B, y: n.bottomRight.y * B },
|
|
791
|
+
bottomLeft: { x: n.bottomLeft.x * B, y: n.bottomLeft.y * B }
|
|
792
|
+
}), {
|
|
793
|
+
success: !0,
|
|
794
|
+
contour: a,
|
|
795
|
+
corners: D,
|
|
796
|
+
debug: g
|
|
797
|
+
};
|
|
798
|
+
}
|
|
799
|
+
function MA(I, A) {
|
|
800
|
+
function g(s) {
|
|
801
|
+
const t = [];
|
|
802
|
+
for (let e = 0; e < 4; e++) {
|
|
803
|
+
const [o, a] = s[e];
|
|
804
|
+
t.push([o, a, 1, 0, 0, 0, -o * A[e][0], -a * A[e][0]]), t.push([0, 0, 0, o, a, 1, -o * A[e][1], -a * A[e][1]]);
|
|
805
|
+
}
|
|
806
|
+
return t;
|
|
807
|
+
}
|
|
808
|
+
const C = g(I), E = [
|
|
809
|
+
A[0][0],
|
|
810
|
+
A[0][1],
|
|
811
|
+
A[1][0],
|
|
812
|
+
A[1][1],
|
|
813
|
+
A[2][0],
|
|
814
|
+
A[2][1],
|
|
815
|
+
A[3][0],
|
|
816
|
+
A[3][1]
|
|
817
|
+
];
|
|
818
|
+
function B(s, t) {
|
|
819
|
+
const e = s.length, o = s[0].length, a = s.map((h) => h.slice()), n = t.slice();
|
|
820
|
+
for (let h = 0; h < o; h++) {
|
|
821
|
+
let y = h;
|
|
822
|
+
for (let c = h + 1; c < e; c++)
|
|
823
|
+
Math.abs(a[c][h]) > Math.abs(a[y][h]) && (y = c);
|
|
824
|
+
[a[h], a[y]] = [a[y], a[h]], [n[h], n[y]] = [n[y], n[h]];
|
|
825
|
+
for (let c = h + 1; c < e; c++) {
|
|
826
|
+
const r = a[c][h] / a[h][h];
|
|
827
|
+
for (let w = h; w < o; w++)
|
|
828
|
+
a[c][w] -= r * a[h][w];
|
|
829
|
+
n[c] -= r * n[h];
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
const D = new Array(o);
|
|
833
|
+
for (let h = o - 1; h >= 0; h--) {
|
|
834
|
+
let y = n[h];
|
|
835
|
+
for (let c = h + 1; c < o; c++)
|
|
836
|
+
y -= a[h][c] * D[c];
|
|
837
|
+
D[h] = y / a[h][h];
|
|
838
|
+
}
|
|
839
|
+
return D;
|
|
840
|
+
}
|
|
841
|
+
const Q = B(C, E);
|
|
842
|
+
return [
|
|
843
|
+
[Q[0], Q[1], Q[2]],
|
|
844
|
+
[Q[3], Q[4], Q[5]],
|
|
845
|
+
[Q[6], Q[7], 1]
|
|
846
|
+
];
|
|
847
|
+
}
|
|
848
|
+
function LA(I, A, g) {
|
|
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), t = Math.round(Math.max(i, s)), e = Math.hypot(E.x - B.x, E.y - B.y), o = Math.hypot(C.x - Q.x, C.y - Q.y), a = Math.round(Math.max(e, o));
|
|
850
|
+
I.canvas.width = t, I.canvas.height = a;
|
|
851
|
+
const n = [
|
|
852
|
+
[C.x, C.y],
|
|
853
|
+
[E.x, E.y],
|
|
854
|
+
[B.x, B.y],
|
|
855
|
+
[Q.x, Q.y]
|
|
856
|
+
], D = [
|
|
857
|
+
[0, 0],
|
|
858
|
+
[t - 1, 0],
|
|
859
|
+
[t - 1, a - 1],
|
|
860
|
+
[0, a - 1]
|
|
861
|
+
], h = MA(n, D);
|
|
862
|
+
YA(I, A, h, t, a);
|
|
863
|
+
}
|
|
864
|
+
function mA(I) {
|
|
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], t = I[2][2], e = B * t - Q * s, o = -(E * t - Q * i), a = E * s - B * i, n = -(g * t - C * s), D = A * t - C * i, h = -(A * s - g * i), y = g * Q - C * B, c = -(A * Q - C * E), r = A * B - g * E, w = A * e + g * o + C * a;
|
|
866
|
+
if (w === 0) throw new Error("Singular matrix");
|
|
867
|
+
return [
|
|
868
|
+
[e / w, n / w, y / w],
|
|
869
|
+
[o / w, D / w, c / w],
|
|
870
|
+
[a / w, h / w, r / w]
|
|
871
|
+
];
|
|
872
|
+
}
|
|
873
|
+
function YA(I, A, g, C, E) {
|
|
874
|
+
const B = mA(g), Q = document.createElement("canvas");
|
|
875
|
+
Q.width = A.width || A.naturalWidth, Q.height = A.height || A.naturalHeight;
|
|
876
|
+
const i = Q.getContext("2d");
|
|
877
|
+
i.drawImage(A, 0, 0, Q.width, Q.height);
|
|
878
|
+
const s = i.getImageData(0, 0, Q.width, Q.height), t = I.createImageData(C, E);
|
|
879
|
+
for (let e = 0; e < E; e++)
|
|
880
|
+
for (let o = 0; o < C; o++) {
|
|
881
|
+
const a = B[2][0] * o + B[2][1] * e + B[2][2], n = (B[0][0] * o + B[0][1] * e + B[0][2]) / a, D = (B[1][0] * o + B[1][1] * e + B[1][2]) / a, h = Math.max(0, Math.min(Q.width - 2, n)), y = Math.max(0, Math.min(Q.height - 2, D)), c = Math.floor(h), r = Math.floor(y), w = h - c, F = y - r;
|
|
882
|
+
for (let R = 0; R < 4; R++) {
|
|
883
|
+
const S = s.data[(r * Q.width + c) * 4 + R], d = s.data[(r * Q.width + (c + 1)) * 4 + R], G = s.data[((r + 1) * Q.width + c) * 4 + R], f = s.data[((r + 1) * Q.width + (c + 1)) * 4 + R];
|
|
884
|
+
t.data[(e * C + o) * 4 + R] = (1 - w) * (1 - F) * S + w * (1 - F) * d + (1 - w) * F * G + w * F * f;
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
I.putImageData(t, 0, 0);
|
|
888
|
+
}
|
|
889
|
+
async function X(I, A = {}) {
|
|
890
|
+
const g = A.mode || "detect", C = A.output || "canvas";
|
|
891
|
+
A.debug;
|
|
892
|
+
let E, B, Q;
|
|
893
|
+
if (I instanceof ImageData)
|
|
894
|
+
E = I, B = I.width, Q = I.height;
|
|
895
|
+
else {
|
|
896
|
+
const e = document.createElement("canvas");
|
|
897
|
+
e.width = I.width || I.naturalWidth, e.height = I.height || I.naturalHeight;
|
|
898
|
+
const o = e.getContext("2d");
|
|
899
|
+
o.drawImage(I, 0, 0, e.width, e.height), E = o.getImageData(0, 0, e.width, e.height), B = e.width, Q = e.height;
|
|
900
|
+
}
|
|
901
|
+
const i = await JA(E, A);
|
|
902
|
+
if (!i.success)
|
|
903
|
+
return {
|
|
904
|
+
output: null,
|
|
905
|
+
corners: null,
|
|
906
|
+
contour: null,
|
|
907
|
+
debug: i.debug,
|
|
908
|
+
success: !1,
|
|
909
|
+
message: i.message || "No document detected"
|
|
910
|
+
};
|
|
911
|
+
let s, t;
|
|
912
|
+
if (g === "detect")
|
|
913
|
+
t = null;
|
|
914
|
+
else if (g === "extract") {
|
|
915
|
+
s = document.createElement("canvas");
|
|
916
|
+
const e = s.getContext("2d");
|
|
917
|
+
LA(e, I, i.corners);
|
|
918
|
+
} else
|
|
919
|
+
s = document.createElement("canvas"), s.width = B, s.height = Q, s.getContext("2d").drawImage(I, 0, 0, B, Q);
|
|
920
|
+
return g !== "detect" && s && (C === "canvas" ? t = s : C === "imagedata" ? t = s.getContext("2d").getImageData(0, 0, s.width, s.height) : C === "dataurl" ? t = s.toDataURL() : t = s), {
|
|
921
|
+
output: t,
|
|
922
|
+
corners: i.corners,
|
|
923
|
+
contour: i.contour,
|
|
924
|
+
debug: i.debug,
|
|
925
|
+
success: !0,
|
|
926
|
+
message: "Document detected"
|
|
927
|
+
};
|
|
928
|
+
}
|
|
929
|
+
const uA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
930
|
+
__proto__: null,
|
|
931
|
+
LiveScanner: SA,
|
|
932
|
+
checkWebcamAvailability: kA,
|
|
933
|
+
scanDocument: X
|
|
934
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
935
|
+
export {
|
|
936
|
+
SA as LiveScanner,
|
|
937
|
+
kA as checkWebcamAvailability,
|
|
938
|
+
X as scanDocument
|
|
939
|
+
};
|
|
940
|
+
//# sourceMappingURL=scanic.js.map
|