@mikashboks/capture-intelligence-core 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/dist/cjs/address-proof.d.ts.map +1 -1
- package/dist/cjs/address-proof.js +4 -3
- package/dist/cjs/address-proof.js.map +1 -1
- package/dist/cjs/document-classifier.d.ts.map +1 -1
- package/dist/cjs/document-classifier.js +73 -21
- package/dist/cjs/document-classifier.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +21 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/kyc-mobile-contract.d.ts +20 -0
- package/dist/cjs/kyc-mobile-contract.d.ts.map +1 -0
- package/dist/cjs/kyc-mobile-contract.js +175 -0
- package/dist/cjs/kyc-mobile-contract.js.map +1 -0
- package/dist/cjs/mrz-band-detector.d.ts +82 -0
- package/dist/cjs/mrz-band-detector.d.ts.map +1 -0
- package/dist/cjs/mrz-band-detector.js +245 -0
- package/dist/cjs/mrz-band-detector.js.map +1 -0
- package/dist/cjs/quality-checks.d.ts +7 -0
- package/dist/cjs/quality-checks.d.ts.map +1 -1
- package/dist/cjs/quality-checks.js +37 -4
- package/dist/cjs/quality-checks.js.map +1 -1
- package/dist/esm/address-proof.d.ts.map +1 -1
- package/dist/esm/address-proof.js +4 -3
- package/dist/esm/address-proof.js.map +1 -1
- package/dist/esm/document-classifier.d.ts.map +1 -1
- package/dist/esm/document-classifier.js +73 -21
- package/dist/esm/document-classifier.js.map +1 -1
- package/dist/esm/index.d.ts +5 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/kyc-mobile-contract.d.ts +20 -0
- package/dist/esm/kyc-mobile-contract.d.ts.map +1 -0
- package/dist/esm/kyc-mobile-contract.js +171 -0
- package/dist/esm/kyc-mobile-contract.js.map +1 -0
- package/dist/esm/mrz-band-detector.d.ts +82 -0
- package/dist/esm/mrz-band-detector.d.ts.map +1 -0
- package/dist/esm/mrz-band-detector.js +241 -0
- package/dist/esm/mrz-band-detector.js.map +1 -0
- package/dist/esm/quality-checks.d.ts +7 -0
- package/dist/esm/quality-checks.d.ts.map +1 -1
- package/dist/esm/quality-checks.js +37 -5
- package/dist/esm/quality-checks.js.map +1 -1
- package/package.json +4 -1
|
@@ -33,12 +33,12 @@ function normalizeDocType(docType) {
|
|
|
33
33
|
/* -- Per-document-type aspect ratio profiles ------------------------------ */
|
|
34
34
|
export function getDocumentReviewProfile(documentType) {
|
|
35
35
|
const normalizedType = normalizeDocType(documentType);
|
|
36
|
-
// Passports -- biodata page is
|
|
36
|
+
// Passports -- biodata/photo page is landscape (~1.42:1).
|
|
37
37
|
if (normalizedType === 'passport') {
|
|
38
38
|
return {
|
|
39
39
|
aspectTargets: [1.42],
|
|
40
40
|
threshold: 58,
|
|
41
|
-
expectedOrientation: '
|
|
41
|
+
expectedOrientation: 'landscape',
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
// ID card, voter ID, driver's licence -- standard card-shaped documents
|
|
@@ -85,6 +85,8 @@ export function getDocumentReviewProfile(documentType) {
|
|
|
85
85
|
* @param documentType - Optional document type hint for aspect-ratio matching
|
|
86
86
|
*/
|
|
87
87
|
export function checkDocumentLikelihood(grey, imgData, w, h, documentType) {
|
|
88
|
+
const normalizedType = normalizeDocType(documentType);
|
|
89
|
+
const isPassport = normalizedType === 'passport';
|
|
88
90
|
const reviewProfile = getDocumentReviewProfile(documentType);
|
|
89
91
|
let score = 0;
|
|
90
92
|
// Single-pass Sobel: build edge map AND track gradient direction for
|
|
@@ -119,13 +121,25 @@ export function checkDocumentLikelihood(grey, imgData, w, h, documentType) {
|
|
|
119
121
|
}
|
|
120
122
|
// 1. Edge density (widened for worn/faded Sierra Leone national IDs)
|
|
121
123
|
const edgeDensity = totalPixels > 0 ? edgePixels / totalPixels : 0;
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
124
|
+
if (isPassport) {
|
|
125
|
+
// Passport biodata pages often contain watermarks, MRZ bands, and rotated
|
|
126
|
+
// note text. Treat dense-but-structured edges as valid evidence.
|
|
127
|
+
if (edgeDensity >= 0.05 && edgeDensity <= 0.36)
|
|
128
|
+
score += 25;
|
|
129
|
+
else if (edgeDensity >= 0.03 && edgeDensity <= 0.48)
|
|
130
|
+
score += 10;
|
|
131
|
+
else if (edgeDensity > 0.55)
|
|
132
|
+
score -= 10;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
if (edgeDensity >= 0.05 && edgeDensity <= 0.22)
|
|
136
|
+
score += 25;
|
|
137
|
+
else if (edgeDensity >= 0.03 && edgeDensity <= 0.28)
|
|
138
|
+
score += 10;
|
|
139
|
+
// E10: Widened penalty threshold -- textured SL surfaces inflate edge density
|
|
140
|
+
else if (edgeDensity > 0.3)
|
|
141
|
+
score -= 10;
|
|
142
|
+
}
|
|
129
143
|
// 2. Aspect ratio -- match against the nearest supported document profile
|
|
130
144
|
const aspect = w > h ? w / h : h / w;
|
|
131
145
|
let bestAspectDiff = Number.POSITIVE_INFINITY;
|
|
@@ -182,22 +196,52 @@ export function checkDocumentLikelihood(grey, imgData, w, h, documentType) {
|
|
|
182
196
|
}
|
|
183
197
|
const centerDensity = centerTotal > 0 ? centerEdges / centerTotal : 0;
|
|
184
198
|
const hasGlare = maxBrightness > 245;
|
|
185
|
-
if (
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
199
|
+
if (isPassport) {
|
|
200
|
+
if (centerDensity >= 0.06 && centerDensity <= 0.34)
|
|
201
|
+
score += 15;
|
|
202
|
+
else if (centerDensity >= 0.03 && centerDensity <= 0.44)
|
|
203
|
+
score += 5;
|
|
204
|
+
else if (centerDensity > 0.5)
|
|
205
|
+
score -= 10;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
if (centerDensity >= 0.06 && centerDensity <= 0.2)
|
|
209
|
+
score += 15;
|
|
210
|
+
else if (centerDensity >= 0.03 && centerDensity <= 0.18)
|
|
211
|
+
score += 5;
|
|
212
|
+
else if (centerDensity > 0.2)
|
|
213
|
+
score -= 10;
|
|
214
|
+
}
|
|
191
215
|
// 5. Horizontal-edge dominance (text signature)
|
|
192
216
|
const edgeTotal = hEdgeSum + vEdgeSum;
|
|
217
|
+
let hasTextSignature = false;
|
|
193
218
|
if (edgeTotal > 0) {
|
|
194
219
|
const hRatio = hEdgeSum / edgeTotal;
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
220
|
+
const vRatio = vEdgeSum / edgeTotal;
|
|
221
|
+
if (isPassport) {
|
|
222
|
+
// Passport pages can be captured with note text or page header rotated
|
|
223
|
+
// relative to the phone, so either dominant text direction is useful.
|
|
224
|
+
if (hRatio >= 0.56 || vRatio >= 0.56) {
|
|
225
|
+
score += 15;
|
|
226
|
+
hasTextSignature = true;
|
|
227
|
+
}
|
|
228
|
+
else if (hRatio >= 0.52 || vRatio >= 0.52) {
|
|
229
|
+
score += 5;
|
|
230
|
+
hasTextSignature = true;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
if (hRatio >= 0.56) {
|
|
235
|
+
score += 15;
|
|
236
|
+
hasTextSignature = true;
|
|
237
|
+
}
|
|
238
|
+
else if (hRatio >= 0.52) {
|
|
239
|
+
score += 5;
|
|
240
|
+
hasTextSignature = true;
|
|
241
|
+
}
|
|
242
|
+
else if (hRatio < 0.46)
|
|
243
|
+
score -= 10;
|
|
244
|
+
}
|
|
201
245
|
}
|
|
202
246
|
// Rescue path: if aspect ratio matches strongly and some edges exist,
|
|
203
247
|
// set a minimum score -- handles clearly card-shaped objects that are too
|
|
@@ -205,6 +249,14 @@ export function checkDocumentLikelihood(grey, imgData, w, h, documentType) {
|
|
|
205
249
|
if (bestAspectDiff < 0.1 && edgeDensity > 0.03 && score < 15) {
|
|
206
250
|
score = 15;
|
|
207
251
|
}
|
|
252
|
+
if (isPassport &&
|
|
253
|
+
bestAspectDiff < 0.16 &&
|
|
254
|
+
edgeDensity >= 0.03 &&
|
|
255
|
+
edgeDensity <= 0.52 &&
|
|
256
|
+
centerDensity >= 0.03 &&
|
|
257
|
+
(hasTextSignature || centerDensity >= 0.12)) {
|
|
258
|
+
score = Math.max(score, reviewProfile.threshold + 2);
|
|
259
|
+
}
|
|
208
260
|
return {
|
|
209
261
|
isLikelyDoc: score >= reviewProfile.threshold,
|
|
210
262
|
confidence: score,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-classifier.js","sourceRoot":"","sources":["../../src/document-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,+EAA+E;AAE/E,SAAS,gBAAgB,CAAC,OAAkC;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACzE,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,aAAa,CAAC;QACnB,KAAK,yBAAyB;YAC5B,OAAO,SAAS,CAAC;QACnB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,OAAO;YACV,OAAO,UAAU,CAAC;QACpB,KAAK,gBAAgB,CAAC;QACtB,KAAK,gBAAgB,CAAC;QACtB,KAAK,iBAAiB,CAAC;QACvB,KAAK,4BAA4B,CAAC;QAClC,KAAK,6BAA6B;YAChC,OAAO,iBAAiB,CAAC;QAC3B,KAAK,sBAAsB;YACzB,OAAO,UAAU,CAAC;QACpB,KAAK,eAAe;YAClB,OAAO,eAAe,CAAC;QACzB;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,wBAAwB,CACtC,YAAuC;IAEvC,MAAM,cAAc,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAEtD,
|
|
1
|
+
{"version":3,"file":"document-classifier.js","sourceRoot":"","sources":["../../src/document-classifier.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export type { CamStateValue, FrameMetrics, DocumentReviewProfile, DocumentLikeli
|
|
|
11
11
|
export { CamState, CAM_ANALYSIS_W, CAM_ANALYSIS_H, CAM_BRIGHTNESS_MIN, CAM_BRIGHTNESS_MAX, CAM_BLUR_THRESHOLD, CAM_EDGE_THRESHOLD, CAM_STABLE_FRAMES_NEEDED, CAM_FRAME_DIFF_THRESHOLD, CAM_EDGE_PIXEL_THRESHOLD, CAM_EDGE_COVERAGE_THRESHOLD, CAM_DOC_CENTER_OFFSET_MAX, DOC_GALLERY_FAILURE_THRESHOLD, DOC_SUBMIT_ANYWAY_FAILURE_THRESHOLD, SELFIE_SUBMIT_ANYWAY_FAILURE_THRESHOLD, ADDRESS_SUBMIT_ANYWAY_FAILURE_THRESHOLD, PICO_ANALYSIS_W, PICO_ANALYSIS_H, } from './types.js';
|
|
12
12
|
export type { AddressMethod, AddressProofMode, AddressCoordinatesLike, AddressStepState, AddressMethodStartBehavior, } from './address-proof.js';
|
|
13
13
|
export { ADDRESS_METHOD_ORDER, isAddressMethod, sanitizeAllowedAddressMethods, getRecommendedAddressMethod, getAddressMethodStartBehavior, getEffectiveAddressMethod, hasAddressProofCoordinates, hasStructuredAddress, isAddressStepComplete, } from './address-proof.js';
|
|
14
|
+
export type { KycMobileContractIssue, KycMobileContractIssueCode, KycMobileWorkflowConfigContract, } from './kyc-mobile-contract.js';
|
|
15
|
+
export { KYC_MOBILE_ADDRESS_STEP_IDS, KYC_MOBILE_KNOWN_STEP_IDS, KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS, KYC_MOBILE_SIERRA_LEONE_STEP_ORDER, KYC_MOBILE_VALID_ADDRESS_METHODS, validateKycMobileWorkflowConfigContract, } from './kyc-mobile-contract.js';
|
|
14
16
|
export type { FlowStepDefinition } from './flow-routing.js';
|
|
15
17
|
export { getNextFlowStepId, getPreviousFlowStepId } from './flow-routing.js';
|
|
16
18
|
export { getDocumentReviewProfile, checkDocumentLikelihood, } from './document-classifier.js';
|
|
@@ -22,6 +24,8 @@ export type { EdgeEnergyProfile } from './sobel.js';
|
|
|
22
24
|
export { rgbaToGreyscale, rgbaToGreyscalePico, computeEdgeEnergyProfile, detectDocumentCropFromGrey, } from './sobel.js';
|
|
23
25
|
export type { EdgeAnalysisResult } from './metrics.js';
|
|
24
26
|
export { rgbaToGreyInPlace, computeBrightness, computeLaplacianVariance, computeLaplacianVarianceFloat, computeEdgeEnergy, detectDocumentRect, computeFrameDiff, analyzeFrame, looksLikeDocument, } from './metrics.js';
|
|
27
|
+
export type { MrzBandDetectionInput, MrzBandDetectionResult, MrzBandBoundingBox, } from './mrz-band-detector.js';
|
|
28
|
+
export { detectPassportMrzBand, MRZ_HORIZONTAL_GRADIENT_THRESHOLD, MRZ_ROW_DENSITY_RATIO_THRESHOLD, MRZ_MIN_BAND_HEIGHT, MRZ_MAX_BAND_HEIGHT, MRZ_MIN_BAND_WIDTH_FRAC, MRZ_MIN_BAND_ASPECT, MRZ_MAX_BAND_ASPECT, MRZ_SEARCH_TOP_FRAC, MRZ_DENSITY_SCORE_SATURATION, } from './mrz-band-detector.js';
|
|
25
29
|
export type { QualityFailureState, DocumentQualityInput, DocumentQualityResult, SelfieQualityInput, } from './quality-checks.js';
|
|
26
|
-
export { getQualityBucket, getSubmitAnywayThreshold, createQualityFailureState, countFailedReview, shouldShowSubmitAnyway, getReviewModeFromDocumentType, runDocumentQualityChecks, runSelfieQualityChecks, checkFaceInImage, isFaceCentered, evaluateDocumentFailure, evaluateSelfieFailure, evaluateReviewFailure, getNextButtonDisabledReason, getOverrideButtonText, getOverrideBannerMessage, } from './quality-checks.js';
|
|
30
|
+
export { getQualityBucket, getSubmitAnywayThreshold, createQualityFailureState, countFailedReview, shouldShowSubmitAnyway, hasHardBlockingQualityFailure, getReviewModeFromDocumentType, runDocumentQualityChecks, runSelfieQualityChecks, checkFaceInImage, isFaceCentered, evaluateDocumentFailure, evaluateSelfieFailure, evaluateReviewFailure, getNextButtonDisabledReason, getOverrideButtonText, getOverrideBannerMessage, } from './quality-checks.js';
|
|
27
31
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,YAAY,EACV,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,EACxB,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,mCAAmC,EACnC,sCAAsC,EACtC,uCAAuC,EACvC,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAC7B,yBAAyB,EACzB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,EAChB,2BAA2B,EAC3B,wBAAwB,EACxB,6BAA6B,EAC7B,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,4BAA4B,CAAC;AAGpC,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EACjB,sBAAsB,EACtB,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export { CamState, CAM_ANALYSIS_W, CAM_ANALYSIS_H, CAM_BRIGHTNESS_MIN, CAM_BRIGHTNESS_MAX, CAM_BLUR_THRESHOLD, CAM_EDGE_THRESHOLD, CAM_STABLE_FRAMES_NEEDED, CAM_FRAME_DIFF_THRESHOLD, CAM_EDGE_PIXEL_THRESHOLD, CAM_EDGE_COVERAGE_THRESHOLD, CAM_DOC_CENTER_OFFSET_MAX, DOC_GALLERY_FAILURE_THRESHOLD, DOC_SUBMIT_ANYWAY_FAILURE_THRESHOLD, SELFIE_SUBMIT_ANYWAY_FAILURE_THRESHOLD, ADDRESS_SUBMIT_ANYWAY_FAILURE_THRESHOLD, PICO_ANALYSIS_W, PICO_ANALYSIS_H, } from './types.js';
|
|
11
11
|
export { ADDRESS_METHOD_ORDER, isAddressMethod, sanitizeAllowedAddressMethods, getRecommendedAddressMethod, getAddressMethodStartBehavior, getEffectiveAddressMethod, hasAddressProofCoordinates, hasStructuredAddress, isAddressStepComplete, } from './address-proof.js';
|
|
12
|
+
export { KYC_MOBILE_ADDRESS_STEP_IDS, KYC_MOBILE_KNOWN_STEP_IDS, KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS, KYC_MOBILE_SIERRA_LEONE_STEP_ORDER, KYC_MOBILE_VALID_ADDRESS_METHODS, validateKycMobileWorkflowConfigContract, } from './kyc-mobile-contract.js';
|
|
12
13
|
export { getNextFlowStepId, getPreviousFlowStepId } from './flow-routing.js';
|
|
13
14
|
/* -- Document classifier -------------------------------------------------- */
|
|
14
15
|
export { getDocumentReviewProfile, checkDocumentLikelihood, } from './document-classifier.js';
|
|
@@ -16,5 +17,6 @@ export { analyzeImageMetadata } from './metadata-review.js';
|
|
|
16
17
|
export { mapPreviewRectToImageCrop, getRotationToExpectedOrientation, buildCaptureNormalizationPlan, getDocumentCaptureFrameAspectRatio, } from './capture-normalization.js';
|
|
17
18
|
export { rgbaToGreyscale, rgbaToGreyscalePico, computeEdgeEnergyProfile, detectDocumentCropFromGrey, } from './sobel.js';
|
|
18
19
|
export { rgbaToGreyInPlace, computeBrightness, computeLaplacianVariance, computeLaplacianVarianceFloat, computeEdgeEnergy, detectDocumentRect, computeFrameDiff, analyzeFrame, looksLikeDocument, } from './metrics.js';
|
|
19
|
-
export {
|
|
20
|
+
export { detectPassportMrzBand, MRZ_HORIZONTAL_GRADIENT_THRESHOLD, MRZ_ROW_DENSITY_RATIO_THRESHOLD, MRZ_MIN_BAND_HEIGHT, MRZ_MAX_BAND_HEIGHT, MRZ_MIN_BAND_WIDTH_FRAC, MRZ_MIN_BAND_ASPECT, MRZ_MAX_BAND_ASPECT, MRZ_SEARCH_TOP_FRAC, MRZ_DENSITY_SCORE_SATURATION, } from './mrz-band-detector.js';
|
|
21
|
+
export { getQualityBucket, getSubmitAnywayThreshold, createQualityFailureState, countFailedReview, shouldShowSubmitAnyway, hasHardBlockingQualityFailure, getReviewModeFromDocumentType, runDocumentQualityChecks, runSelfieQualityChecks, checkFaceInImage, isFaceCentered, evaluateDocumentFailure, evaluateSelfieFailure, evaluateReviewFailure, getNextButtonDisabledReason, getOverrideButtonText, getOverrideBannerMessage, } from './quality-checks.js';
|
|
20
22
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuBH,OAAO,EACL,QAAQ,EACR,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,mCAAmC,EACnC,sCAAsC,EACtC,uCAAuC,EACvC,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AAUpB,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAC7B,yBAAyB,EACzB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuBH,OAAO,EACL,QAAQ,EACR,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,mCAAmC,EACnC,sCAAsC,EACtC,uCAAuC,EACvC,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AAUpB,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAC7B,yBAAyB,EACzB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,qCAAqC,EACrC,kCAAkC,EAClC,gCAAgC,EAChC,uCAAuC,GACxC,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE7E,+EAA+E;AAC/E,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAgB5D,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAQtB,OAAO,EACL,qBAAqB,EACrB,iCAAiC,EACjC,+BAA+B,EAC/B,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAShC,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EACjB,sBAAsB,EACtB,6BAA6B,EAC7B,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const KYC_MOBILE_VALID_ADDRESS_METHODS: readonly ["address_document", "front_door_photo", "typed_address"];
|
|
2
|
+
export declare const KYC_MOBILE_ADDRESS_STEP_IDS: readonly ["address-proof-start", "address-input", "address-proof-photo", "check-address-proof"];
|
|
3
|
+
export declare const KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS: readonly ["loading", "resubmission", "decline", "manual-review", "error", "final"];
|
|
4
|
+
export declare const KYC_MOBILE_SIERRA_LEONE_STEP_ORDER: readonly ["welcome", "document-selection", "document-start", "document-photo", "check-document", "document-photo-back-start", "document-photo-back", "check-document-photo-back", "selfie-start", "selfie", "check-selfie", "address-proof-start", "address-input", "address-proof-photo", "check-address-proof", "loading", "resubmission", "decline", "manual-review", "error", "final"];
|
|
5
|
+
export declare const KYC_MOBILE_KNOWN_STEP_IDS: readonly ["welcome", "customer-info", "document-selection", "document-start", "document-photo", "check-document", "document-photo-back-start", "document-photo-back", "check-document-photo-back", "selfie-start", "selfie", "check-selfie", "address-proof-start", "address-input", "address-proof-photo", "check-address-proof", "loading", "resubmission", "decline", "manual-review", "error", "final"];
|
|
6
|
+
export type KycMobileContractIssueCode = 'missing_config_array' | 'missing_required_step' | 'duplicate_step' | 'unknown_step' | 'unstable_step_id' | 'unsupported_address_method' | 'invalid_step_order';
|
|
7
|
+
export interface KycMobileContractIssue {
|
|
8
|
+
code: KycMobileContractIssueCode;
|
|
9
|
+
path: string;
|
|
10
|
+
message: string;
|
|
11
|
+
}
|
|
12
|
+
export interface KycMobileWorkflowConfigContract {
|
|
13
|
+
kycSdkSteps?: unknown;
|
|
14
|
+
kycSdkDocumentOptions?: unknown;
|
|
15
|
+
kycSdkUi?: {
|
|
16
|
+
allowedAddressMethods?: unknown;
|
|
17
|
+
} | null;
|
|
18
|
+
}
|
|
19
|
+
export declare function validateKycMobileWorkflowConfigContract(config: KycMobileWorkflowConfigContract | null | undefined): KycMobileContractIssue[];
|
|
20
|
+
//# sourceMappingURL=kyc-mobile-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kyc-mobile-contract.d.ts","sourceRoot":"","sources":["../../src/kyc-mobile-contract.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gCAAgC,oEAAqC,CAAC;AAEnF,eAAO,MAAM,2BAA2B,iGAK9B,CAAC;AAEX,eAAO,MAAM,qCAAqC,oFAOxC,CAAC;AAEX,eAAO,MAAM,kCAAkC,4XAiBrC,CAAC;AAEX,eAAO,MAAM,yBAAyB,6YAe5B,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAClC,sBAAsB,GACtB,uBAAuB,GACvB,gBAAgB,GAChB,cAAc,GACd,kBAAkB,GAClB,4BAA4B,GAC5B,oBAAoB,CAAC;AAEzB,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,0BAA0B,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,+BAA+B;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,EAAE;QACT,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,GAAG,IAAI,CAAC;CACV;AA4CD,wBAAgB,uCAAuC,CACrD,MAAM,EAAE,+BAA+B,GAAG,IAAI,GAAG,SAAS,GACzD,sBAAsB,EAAE,CAwG1B"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { ADDRESS_METHOD_ORDER, isAddressMethod } from './address-proof.js';
|
|
2
|
+
export const KYC_MOBILE_VALID_ADDRESS_METHODS = [...ADDRESS_METHOD_ORDER];
|
|
3
|
+
export const KYC_MOBILE_ADDRESS_STEP_IDS = [
|
|
4
|
+
'address-proof-start',
|
|
5
|
+
'address-input',
|
|
6
|
+
'address-proof-photo',
|
|
7
|
+
'check-address-proof',
|
|
8
|
+
];
|
|
9
|
+
export const KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS = [
|
|
10
|
+
'loading',
|
|
11
|
+
'resubmission',
|
|
12
|
+
'decline',
|
|
13
|
+
'manual-review',
|
|
14
|
+
'error',
|
|
15
|
+
'final',
|
|
16
|
+
];
|
|
17
|
+
export const KYC_MOBILE_SIERRA_LEONE_STEP_ORDER = [
|
|
18
|
+
'welcome',
|
|
19
|
+
'document-selection',
|
|
20
|
+
'document-start',
|
|
21
|
+
'document-photo',
|
|
22
|
+
'check-document',
|
|
23
|
+
'document-photo-back-start',
|
|
24
|
+
'document-photo-back',
|
|
25
|
+
'check-document-photo-back',
|
|
26
|
+
'selfie-start',
|
|
27
|
+
'selfie',
|
|
28
|
+
'check-selfie',
|
|
29
|
+
'address-proof-start',
|
|
30
|
+
'address-input',
|
|
31
|
+
'address-proof-photo',
|
|
32
|
+
'check-address-proof',
|
|
33
|
+
...KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS,
|
|
34
|
+
];
|
|
35
|
+
export const KYC_MOBILE_KNOWN_STEP_IDS = [
|
|
36
|
+
'welcome',
|
|
37
|
+
'customer-info',
|
|
38
|
+
'document-selection',
|
|
39
|
+
'document-start',
|
|
40
|
+
'document-photo',
|
|
41
|
+
'check-document',
|
|
42
|
+
'document-photo-back-start',
|
|
43
|
+
'document-photo-back',
|
|
44
|
+
'check-document-photo-back',
|
|
45
|
+
'selfie-start',
|
|
46
|
+
'selfie',
|
|
47
|
+
'check-selfie',
|
|
48
|
+
...KYC_MOBILE_ADDRESS_STEP_IDS,
|
|
49
|
+
...KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS,
|
|
50
|
+
];
|
|
51
|
+
const knownStepIds = new Set(KYC_MOBILE_KNOWN_STEP_IDS);
|
|
52
|
+
const stableUnsuffixedStepIds = new Set([
|
|
53
|
+
'address-proof-start',
|
|
54
|
+
'address-input',
|
|
55
|
+
...KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS,
|
|
56
|
+
]);
|
|
57
|
+
const pushMissingArrayIssue = (issues, path, label) => {
|
|
58
|
+
issues.push({
|
|
59
|
+
code: 'missing_config_array',
|
|
60
|
+
path,
|
|
61
|
+
message: `KYC mobile config is missing ${label}`,
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
const pushInvalidStepOrderIssue = (issues, beforeStepId, afterStepId) => {
|
|
65
|
+
issues.push({
|
|
66
|
+
code: 'invalid_step_order',
|
|
67
|
+
path: 'kycSdkSteps',
|
|
68
|
+
message: `KYC mobile config must order ${beforeStepId} before ${afterStepId}`,
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
const pushOrderIssueIfInvalid = (issues, stepIndexById, beforeStepId, afterStepId) => {
|
|
72
|
+
const beforeIndex = stepIndexById.get(beforeStepId);
|
|
73
|
+
const afterIndex = stepIndexById.get(afterStepId);
|
|
74
|
+
if (typeof beforeIndex !== 'number' || typeof afterIndex !== 'number')
|
|
75
|
+
return;
|
|
76
|
+
if (beforeIndex < afterIndex)
|
|
77
|
+
return;
|
|
78
|
+
pushInvalidStepOrderIssue(issues, beforeStepId, afterStepId);
|
|
79
|
+
};
|
|
80
|
+
export function validateKycMobileWorkflowConfigContract(config) {
|
|
81
|
+
const issues = [];
|
|
82
|
+
const steps = Array.isArray(config?.kycSdkSteps)
|
|
83
|
+
? config.kycSdkSteps.filter((step) => typeof step === 'string')
|
|
84
|
+
: [];
|
|
85
|
+
if (!steps.length) {
|
|
86
|
+
pushMissingArrayIssue(issues, 'kycSdkSteps', 'mobile step configuration');
|
|
87
|
+
}
|
|
88
|
+
if (!Array.isArray(config?.kycSdkDocumentOptions) || config.kycSdkDocumentOptions.length === 0) {
|
|
89
|
+
pushMissingArrayIssue(issues, 'kycSdkDocumentOptions', 'mobile document configuration');
|
|
90
|
+
}
|
|
91
|
+
const seenSteps = new Set();
|
|
92
|
+
const stepIndexById = new Map();
|
|
93
|
+
for (const step of steps) {
|
|
94
|
+
if (seenSteps.has(step)) {
|
|
95
|
+
issues.push({
|
|
96
|
+
code: 'duplicate_step',
|
|
97
|
+
path: 'kycSdkSteps',
|
|
98
|
+
message: `KYC mobile config has duplicate step: ${step}`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
stepIndexById.set(step, stepIndexById.size);
|
|
103
|
+
}
|
|
104
|
+
seenSteps.add(step);
|
|
105
|
+
if (!knownStepIds.has(step)) {
|
|
106
|
+
issues.push({
|
|
107
|
+
code: 'unknown_step',
|
|
108
|
+
path: 'kycSdkSteps',
|
|
109
|
+
message: `KYC mobile config has unknown step: ${step}`,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
for (const stableStepId of stableUnsuffixedStepIds) {
|
|
113
|
+
if (step.startsWith(`${stableStepId}-`)) {
|
|
114
|
+
issues.push({
|
|
115
|
+
code: 'unstable_step_id',
|
|
116
|
+
path: 'kycSdkSteps',
|
|
117
|
+
message: `KYC mobile config must keep ${stableStepId} unsuffixed`,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const allowedAddressMethods = Array.isArray(config?.kycSdkUi?.allowedAddressMethods)
|
|
123
|
+
? config.kycSdkUi.allowedAddressMethods
|
|
124
|
+
: [];
|
|
125
|
+
const validAddressMethods = allowedAddressMethods.filter(isAddressMethod);
|
|
126
|
+
const shouldCollectProofMedia = validAddressMethods.some(method => method !== 'typed_address');
|
|
127
|
+
const requiredAddressStepIds = [
|
|
128
|
+
'address-proof-start',
|
|
129
|
+
'address-input',
|
|
130
|
+
...(shouldCollectProofMedia ? ['address-proof-photo', 'check-address-proof'] : []),
|
|
131
|
+
];
|
|
132
|
+
for (const step of [...requiredAddressStepIds, ...KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS]) {
|
|
133
|
+
if (!seenSteps.has(step)) {
|
|
134
|
+
issues.push({
|
|
135
|
+
code: 'missing_required_step',
|
|
136
|
+
path: 'kycSdkSteps',
|
|
137
|
+
message: `KYC mobile config is missing required step: ${step}`,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (!allowedAddressMethods.length) {
|
|
142
|
+
pushMissingArrayIssue(issues, 'kycSdkUi.allowedAddressMethods', 'mobile address method configuration');
|
|
143
|
+
}
|
|
144
|
+
for (const method of allowedAddressMethods) {
|
|
145
|
+
if (!isAddressMethod(method)) {
|
|
146
|
+
issues.push({
|
|
147
|
+
code: 'unsupported_address_method',
|
|
148
|
+
path: 'kycSdkUi.allowedAddressMethods',
|
|
149
|
+
message: `KYC mobile config has unsupported address method: ${String(method)}`,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
pushOrderIssueIfInvalid(issues, stepIndexById, 'address-proof-start', 'address-input');
|
|
154
|
+
if (shouldCollectProofMedia) {
|
|
155
|
+
pushOrderIssueIfInvalid(issues, stepIndexById, 'address-input', 'address-proof-photo');
|
|
156
|
+
pushOrderIssueIfInvalid(issues, stepIndexById, 'address-proof-photo', 'check-address-proof');
|
|
157
|
+
pushOrderIssueIfInvalid(issues, stepIndexById, 'check-address-proof', 'loading');
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
pushOrderIssueIfInvalid(issues, stepIndexById, 'address-input', 'loading');
|
|
161
|
+
}
|
|
162
|
+
let previousTerminalStepId;
|
|
163
|
+
for (const terminalStepId of KYC_MOBILE_REQUIRED_TERMINAL_STEP_IDS) {
|
|
164
|
+
if (previousTerminalStepId) {
|
|
165
|
+
pushOrderIssueIfInvalid(issues, stepIndexById, previousTerminalStepId, terminalStepId);
|
|
166
|
+
}
|
|
167
|
+
previousTerminalStepId = terminalStepId;
|
|
168
|
+
}
|
|
169
|
+
return issues;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=kyc-mobile-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kyc-mobile-contract.js","sourceRoot":"","sources":["../../src/kyc-mobile-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passport MRZ-band detector — pure JS, no OpenCV.
|
|
3
|
+
*
|
|
4
|
+
* The Machine Readable Zone of a passport is a uniquely identifiable signature
|
|
5
|
+
* that no other document type carries: 2 (TD3) or 3 (TD2/TD1) lines of
|
|
6
|
+
* fixed-width OCR-B characters at the bottom of the photo page. Each character
|
|
7
|
+
* has multiple vertical strokes, so the MRZ band shows up in any frame as a
|
|
8
|
+
* very dense cluster of horizontal-gradient pixels in a wide, thin
|
|
9
|
+
* horizontal slab in the lower portion of the document.
|
|
10
|
+
*
|
|
11
|
+
* This detector is the Phase 2 positive signal: if it fires, the passport
|
|
12
|
+
* photo page is unambiguously present in the frame, regardless of whether
|
|
13
|
+
* the contour detector found a clean quad.
|
|
14
|
+
*
|
|
15
|
+
* Algorithm (cheap enough for 15 fps on 320×240 mid-range Android):
|
|
16
|
+
* 1. Restrict search to the bottom ~40% of the overlay region.
|
|
17
|
+
* 2. For each row in that slice, count pixels where the absolute
|
|
18
|
+
* horizontal gradient |I(x+1) − I(x−1)| exceeds a fixed threshold,
|
|
19
|
+
* and record the leftmost / rightmost strong-gradient column.
|
|
20
|
+
* 3. Find the longest run of consecutive rows whose density exceeds
|
|
21
|
+
* a fraction of the slice's max row density.
|
|
22
|
+
* 4. If the run is in the expected band-height range AND the union of
|
|
23
|
+
* its strong-gradient columns covers a wide-enough horizontal span
|
|
24
|
+
* AND the band's aspect ratio (width / height) is in MRZ range
|
|
25
|
+
* (typically 4:1 – 25:1), report it as found.
|
|
26
|
+
*
|
|
27
|
+
* Inspired by Adrian Rosebrock, "Detecting machine-readable zones in passport
|
|
28
|
+
* images" (PyImageSearch, 2015) — adapted to a per-row density profile to
|
|
29
|
+
* avoid the expensive bottom-hat morphology while keeping the same intuition.
|
|
30
|
+
*/
|
|
31
|
+
export declare const MRZ_HORIZONTAL_GRADIENT_THRESHOLD = 30;
|
|
32
|
+
export declare const MRZ_ROW_DENSITY_RATIO_THRESHOLD = 0.55;
|
|
33
|
+
export declare const MRZ_MIN_BAND_HEIGHT = 6;
|
|
34
|
+
export declare const MRZ_MAX_BAND_HEIGHT = 50;
|
|
35
|
+
export declare const MRZ_MIN_LINE_HEIGHT = 3;
|
|
36
|
+
export declare const MRZ_MAX_LINE_GAP = 8;
|
|
37
|
+
export declare const MRZ_MIN_BAND_WIDTH_FRAC = 0.4;
|
|
38
|
+
export declare const MRZ_MIN_BAND_ASPECT = 4;
|
|
39
|
+
export declare const MRZ_MAX_BAND_ASPECT = 30;
|
|
40
|
+
/** MRZ search window: bottom 0.55 → 1.0 of the overlay region (excludes the photo half). */
|
|
41
|
+
export declare const MRZ_SEARCH_TOP_FRAC = 0.55;
|
|
42
|
+
/** Density at which the row-density score saturates (1.0). */
|
|
43
|
+
export declare const MRZ_DENSITY_SCORE_SATURATION = 0.45;
|
|
44
|
+
export interface MrzBandDetectionInput {
|
|
45
|
+
/** Greyscale buffer, row-major, length = greyW × greyH. */
|
|
46
|
+
grey: Uint8Array | Uint8ClampedArray;
|
|
47
|
+
/** Width of the greyscale buffer. */
|
|
48
|
+
greyW: number;
|
|
49
|
+
/** Height of the greyscale buffer. */
|
|
50
|
+
greyH: number;
|
|
51
|
+
/**
|
|
52
|
+
* Region of interest in greyW×greyH pixel coords. The MRZ is searched in
|
|
53
|
+
* the bottom `MRZ_SEARCH_TOP_FRAC..1.0` of this region.
|
|
54
|
+
*/
|
|
55
|
+
region: {
|
|
56
|
+
x1: number;
|
|
57
|
+
y1: number;
|
|
58
|
+
x2: number;
|
|
59
|
+
y2: number;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export interface MrzBandBoundingBox {
|
|
63
|
+
x: number;
|
|
64
|
+
y: number;
|
|
65
|
+
w: number;
|
|
66
|
+
h: number;
|
|
67
|
+
}
|
|
68
|
+
export interface MrzBandDetectionResult {
|
|
69
|
+
found: boolean;
|
|
70
|
+
/** 0–1 confidence; 0 when not found. */
|
|
71
|
+
confidence: number;
|
|
72
|
+
/** Bounding box in greyW×greyH pixel coords; null when not found. */
|
|
73
|
+
bbox: MrzBandBoundingBox | null;
|
|
74
|
+
/** Maximum row-density observed in the search slice (0–1). Useful for tracing. */
|
|
75
|
+
peakRowDensity: number;
|
|
76
|
+
/** Width of the detected band as a fraction of region width (0–1). 0 when not found. */
|
|
77
|
+
bandWidthFraction: number;
|
|
78
|
+
/** Width / height of the detected band; 0 when not found. */
|
|
79
|
+
bandAspectRatio: number;
|
|
80
|
+
}
|
|
81
|
+
export declare function detectPassportMrzBand(input: MrzBandDetectionInput): MrzBandDetectionResult;
|
|
82
|
+
//# sourceMappingURL=mrz-band-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mrz-band-detector.d.ts","sourceRoot":"","sources":["../../src/mrz-band-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,+BAA+B,OAAO,CAAC;AACpD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,IAAI,EAAE,UAAU,GAAG,iBAAiB,CAAC;IACrC,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,kFAAkF;IAClF,cAAc,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;CACzB;AAWD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,sBAAsB,CAmN1F"}
|