@mleonard9/vin-scanner 0.1.11 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/vinUtils.js +244 -9
- package/lib/commonjs/vinUtils.js.map +1 -1
- package/lib/module/vinUtils.js +244 -9
- package/lib/module/vinUtils.js.map +1 -1
- package/lib/typescript/src/vinUtils.d.ts +14 -0
- package/lib/typescript/src/vinUtils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/vinUtils.ts +258 -19
package/lib/commonjs/vinUtils.js
CHANGED
|
@@ -4,6 +4,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.resolveOptions = exports.pickBestCandidate = exports.isValidVin = exports.buildVinCandidates = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* VIN Scanner Utilities
|
|
9
|
+
*
|
|
10
|
+
* This module provides advanced VIN (Vehicle Identification Number) detection
|
|
11
|
+
* and validation capabilities with the following features:
|
|
12
|
+
*
|
|
13
|
+
* 1. OCR Error Correction: Automatically corrects common OCR misreads (O/0, I/1, etc.)
|
|
14
|
+
* 2. Context-Aware Detection: Looks for VIN prefixes like "VIN:", "Vehicle ID", etc.
|
|
15
|
+
* 3. Check Digit Validation: Validates VINs using ISO 3779 standard algorithm
|
|
16
|
+
* 4. Smart Confidence Scoring: Assigns reliability scores based on multiple factors
|
|
17
|
+
* 5. Multi-Level Processing: Extracts from element, line, and block level text
|
|
18
|
+
*
|
|
19
|
+
* @see https://en.wikipedia.org/wiki/Vehicle_identification_number
|
|
20
|
+
*/
|
|
21
|
+
|
|
7
22
|
const DEFAULT_RESOLVED_OPTIONS = {
|
|
8
23
|
barcode: {
|
|
9
24
|
enabled: true,
|
|
@@ -70,6 +85,116 @@ const transliteration = {
|
|
|
70
85
|
Z: 9
|
|
71
86
|
};
|
|
72
87
|
const weights = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
88
|
+
|
|
89
|
+
// Common OCR misreads that need correction
|
|
90
|
+
const OCR_SUBSTITUTIONS = {
|
|
91
|
+
'O': ['0'],
|
|
92
|
+
// O often misread as 0 (and vice versa)
|
|
93
|
+
'0': ['O'],
|
|
94
|
+
'I': ['1'],
|
|
95
|
+
// I often misread as 1 (and vice versa)
|
|
96
|
+
'1': ['I'],
|
|
97
|
+
'Q': ['0', 'O'],
|
|
98
|
+
// Q should not appear in VINs
|
|
99
|
+
'S': ['5'],
|
|
100
|
+
// S can be misread as 5
|
|
101
|
+
'5': ['S'],
|
|
102
|
+
'B': ['8'],
|
|
103
|
+
// B can be misread as 8
|
|
104
|
+
'8': ['B'],
|
|
105
|
+
'Z': ['2'],
|
|
106
|
+
// Z can be misread as 2
|
|
107
|
+
'2': ['Z'],
|
|
108
|
+
'G': ['6'],
|
|
109
|
+
// G can be misread as 6
|
|
110
|
+
'6': ['G'],
|
|
111
|
+
'D': ['0'],
|
|
112
|
+
// D can be misread as 0
|
|
113
|
+
'U': ['V'],
|
|
114
|
+
// U can be misread as V
|
|
115
|
+
'V': ['U']
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Generate character substitution candidates for OCR error correction
|
|
120
|
+
* This creates variations of the input by substituting commonly misread characters
|
|
121
|
+
*/
|
|
122
|
+
const generateSubstitutionCandidates = (value, maxSubstitutions = 3) => {
|
|
123
|
+
'worklet';
|
|
124
|
+
|
|
125
|
+
const candidates = new Set([value]);
|
|
126
|
+
|
|
127
|
+
// Find positions that might need substitution
|
|
128
|
+
const positions = [];
|
|
129
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
130
|
+
const char = value[i];
|
|
131
|
+
if (char && OCR_SUBSTITUTIONS[char]) {
|
|
132
|
+
positions.push(i);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Limit the number of positions to try (combinatorial explosion prevention)
|
|
137
|
+
const positionsToTry = positions.slice(0, maxSubstitutions);
|
|
138
|
+
|
|
139
|
+
// Generate candidates by substituting at different positions
|
|
140
|
+
const generate = (current, posIndex, substitutionCount) => {
|
|
141
|
+
if (posIndex >= positionsToTry.length || substitutionCount >= maxSubstitutions) {
|
|
142
|
+
candidates.add(current);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Don't substitute at this position
|
|
147
|
+
generate(current, posIndex + 1, substitutionCount);
|
|
148
|
+
|
|
149
|
+
// Try substituting at this position
|
|
150
|
+
const pos = positionsToTry[posIndex];
|
|
151
|
+
if (pos !== undefined) {
|
|
152
|
+
const char = current[pos];
|
|
153
|
+
const replacements = char ? OCR_SUBSTITUTIONS[char] : undefined;
|
|
154
|
+
if (replacements) {
|
|
155
|
+
replacements.forEach(replacement => {
|
|
156
|
+
const newValue = current.slice(0, pos) + replacement + current.slice(pos + 1);
|
|
157
|
+
generate(newValue, posIndex + 1, substitutionCount + 1);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
generate(value, 0, 0);
|
|
163
|
+
return Array.from(candidates);
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Extract VINs using context-aware patterns (looking for VIN: prefix, etc.)
|
|
168
|
+
* Note: Regex patterns must be defined inside worklet for proper serialization
|
|
169
|
+
*/
|
|
170
|
+
const extractWithContext = text => {
|
|
171
|
+
'worklet';
|
|
172
|
+
|
|
173
|
+
const matches = new Set();
|
|
174
|
+
const VIN_PATTERN = /^[A-HJ-NPR-Z0-9]{17}$/;
|
|
175
|
+
|
|
176
|
+
// Define patterns inside worklet to ensure they're available in the worklet context
|
|
177
|
+
const patterns = [/(?:^|[\s:])VIN[:\s]+([A-Z0-9]{17,})/i, /(?:^|[\s:])V\.?I\.?N\.?[:\s]+([A-Z0-9]{17,})/i, /Vehicle\s+(?:Identification\s+)?(?:Number|ID|Id)[:\s]+([A-Z0-9]{17,})/i, /(?:^|[\s:])Chassis\s+(?:Number|No\.?)[:\s]+([A-Z0-9]{17,})/i, /(?:^|[\s:])Serial\s+(?:Number|No\.?)[:\s]+([A-Z0-9]{17,})/i];
|
|
178
|
+
patterns.forEach(pattern => {
|
|
179
|
+
const match = pattern.exec(text);
|
|
180
|
+
if (match && match[1]) {
|
|
181
|
+
const captured = match[1].replace(/[^A-Z0-9]/gi, '');
|
|
182
|
+
// Extract exactly 17 characters
|
|
183
|
+
if (captured.length >= 17) {
|
|
184
|
+
const candidate = captured.slice(0, 17).toUpperCase();
|
|
185
|
+
if (VIN_PATTERN.test(candidate)) {
|
|
186
|
+
matches.add(candidate);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
return Array.from(matches);
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Tokenize and extract VIN candidates from raw text
|
|
196
|
+
* Includes OCR error correction and context-aware extraction
|
|
197
|
+
*/
|
|
73
198
|
const tokenizeCandidate = value => {
|
|
74
199
|
'worklet';
|
|
75
200
|
|
|
@@ -78,18 +203,39 @@ const tokenizeCandidate = value => {
|
|
|
78
203
|
return [];
|
|
79
204
|
}
|
|
80
205
|
const normalized = value.toUpperCase();
|
|
206
|
+
const matches = new Set();
|
|
207
|
+
|
|
208
|
+
// First, try context-aware extraction (VIN: prefix, etc.)
|
|
209
|
+
extractWithContext(normalized).forEach(vin => matches.add(vin));
|
|
210
|
+
|
|
211
|
+
// Then do regular tokenization
|
|
81
212
|
const cleaned = normalized.replace(/[^A-Z0-9]/g, ' ');
|
|
82
213
|
const tokens = cleaned.split(/\s+/).filter(token => token.length > 0);
|
|
83
|
-
const matches = new Set();
|
|
84
214
|
tokens.forEach(token => {
|
|
85
215
|
if (token.length < 17) {
|
|
86
216
|
return;
|
|
87
217
|
}
|
|
218
|
+
|
|
219
|
+
// Try every 17-character substring
|
|
88
220
|
for (let i = 0; i <= token.length - 17; i += 1) {
|
|
89
221
|
const candidate = token.slice(i, i + 17);
|
|
222
|
+
|
|
223
|
+
// Direct match
|
|
90
224
|
if (VIN_PATTERN.test(candidate)) {
|
|
91
225
|
matches.add(candidate);
|
|
92
226
|
}
|
|
227
|
+
|
|
228
|
+
// Try with OCR substitutions for candidates that are close
|
|
229
|
+
// Only if they contain substitutable characters and don't match directly
|
|
230
|
+
const hasSubstitutableChars = /[OISQBZGDUV]/.test(candidate);
|
|
231
|
+
if (hasSubstitutableChars) {
|
|
232
|
+
const substitutions = generateSubstitutionCandidates(candidate, 2);
|
|
233
|
+
substitutions.forEach(sub => {
|
|
234
|
+
if (VIN_PATTERN.test(sub)) {
|
|
235
|
+
matches.add(sub);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|
|
93
239
|
}
|
|
94
240
|
});
|
|
95
241
|
return Array.from(matches);
|
|
@@ -170,6 +316,25 @@ const toBoundingBox = (candidate, preferred) => {
|
|
|
170
316
|
}
|
|
171
317
|
return blockBox || lineBox || elementBox;
|
|
172
318
|
};
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Calculate confidence score for a barcode-based VIN candidate
|
|
322
|
+
* Barcodes are generally more reliable than text recognition
|
|
323
|
+
*/
|
|
324
|
+
const calculateBarcodeConfidence = (value, validateChecksum) => {
|
|
325
|
+
'worklet';
|
|
326
|
+
|
|
327
|
+
let confidence = 0.85; // Base confidence for barcode
|
|
328
|
+
|
|
329
|
+
// Check digit validation
|
|
330
|
+
const checksumValid = isValidVin(value);
|
|
331
|
+
if (checksumValid) {
|
|
332
|
+
confidence = 0.98; // Very high confidence
|
|
333
|
+
} else if (!validateChecksum) {
|
|
334
|
+
confidence = 0.9; // Still high if validation disabled
|
|
335
|
+
}
|
|
336
|
+
return confidence;
|
|
337
|
+
};
|
|
173
338
|
const candidateFromBarcode = (detection, validateChecksum) => {
|
|
174
339
|
'worklet';
|
|
175
340
|
|
|
@@ -178,31 +343,101 @@ const candidateFromBarcode = (detection, validateChecksum) => {
|
|
|
178
343
|
tokenizeCandidate(detection.displayValue ?? '').forEach(value => values.add(value));
|
|
179
344
|
const boundingBox = toBoundingBox(detection, 'barcode');
|
|
180
345
|
return Array.from(values).map(value => {
|
|
181
|
-
const
|
|
346
|
+
const confidence = calculateBarcodeConfidence(value, validateChecksum);
|
|
182
347
|
return {
|
|
183
348
|
value,
|
|
184
349
|
source: 'barcode',
|
|
185
|
-
confidence
|
|
350
|
+
confidence,
|
|
186
351
|
boundingBox,
|
|
187
352
|
origin: detection.displayValue ? 'displayValue' : 'rawValue',
|
|
188
353
|
rawPayload: detection
|
|
189
354
|
};
|
|
190
355
|
});
|
|
191
356
|
};
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Calculate confidence score for a text-based VIN candidate
|
|
360
|
+
* Higher confidence for:
|
|
361
|
+
* - Valid check digit
|
|
362
|
+
* - Found with VIN prefix context
|
|
363
|
+
* - Element/line level detection (vs block level)
|
|
364
|
+
*/
|
|
365
|
+
const calculateTextConfidence = (value, rawText, origin, validateChecksum) => {
|
|
366
|
+
'worklet';
|
|
367
|
+
|
|
368
|
+
let confidence = 0.5; // Base confidence for text recognition
|
|
369
|
+
|
|
370
|
+
// Check digit validation significantly increases confidence
|
|
371
|
+
const checksumValid = isValidVin(value);
|
|
372
|
+
if (checksumValid) {
|
|
373
|
+
confidence += 0.35; // Boost to 0.85
|
|
374
|
+
} else if (!validateChecksum) {
|
|
375
|
+
confidence += 0.2; // Still boost if validation is disabled
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Context-aware detection (VIN prefix found) increases confidence
|
|
379
|
+
const hasVinPrefix = /VIN|Vehicle\s+(?:Identification|ID|Id)|Chassis|Serial/i.test(rawText);
|
|
380
|
+
if (hasVinPrefix) {
|
|
381
|
+
confidence += 0.1; // Boost to 0.95 if checksum valid, 0.6 if not
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Element-level text is more accurate than block-level
|
|
385
|
+
if (origin === 'element') {
|
|
386
|
+
confidence += 0.05;
|
|
387
|
+
} else if (origin === 'line') {
|
|
388
|
+
confidence += 0.03;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// Cap at 0.98 (never 1.0 for text recognition)
|
|
392
|
+
return Math.min(confidence, 0.98);
|
|
393
|
+
};
|
|
192
394
|
const candidateFromText = (detection, validateChecksum) => {
|
|
193
395
|
'worklet';
|
|
194
396
|
|
|
195
|
-
const
|
|
196
|
-
|
|
397
|
+
const valueMap = new Map();
|
|
398
|
+
|
|
399
|
+
// Process each text level, with priority ordering
|
|
400
|
+
[{
|
|
401
|
+
text: detection.elementText,
|
|
402
|
+
order: 1
|
|
403
|
+
}, {
|
|
404
|
+
text: detection.lineText,
|
|
405
|
+
order: 2
|
|
406
|
+
}, {
|
|
407
|
+
text: detection.blockText,
|
|
408
|
+
order: 3
|
|
409
|
+
}, {
|
|
410
|
+
text: detection.resultText,
|
|
411
|
+
order: 4
|
|
412
|
+
}].forEach(({
|
|
413
|
+
text,
|
|
414
|
+
order
|
|
415
|
+
}) => {
|
|
416
|
+
if (text) {
|
|
417
|
+
tokenizeCandidate(text).forEach(v => {
|
|
418
|
+
var _valueMap$get;
|
|
419
|
+
if (!valueMap.has(v) || (((_valueMap$get = valueMap.get(v)) === null || _valueMap$get === void 0 ? void 0 : _valueMap$get.order) ?? 999) > order) {
|
|
420
|
+
valueMap.set(v, {
|
|
421
|
+
rawText: text,
|
|
422
|
+
order
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
});
|
|
197
428
|
const boundingBox = toBoundingBox(detection, 'line') ?? toBoundingBox(detection, 'element') ?? toBoundingBox(detection, 'block');
|
|
198
|
-
return Array.from(
|
|
199
|
-
|
|
429
|
+
return Array.from(valueMap.entries()).map(([value, {
|
|
430
|
+
rawText
|
|
431
|
+
}]) => {
|
|
432
|
+
var _detection$elementTex, _detection$lineText;
|
|
433
|
+
const origin = (_detection$elementTex = detection.elementText) !== null && _detection$elementTex !== void 0 && _detection$elementTex.includes(value) ? 'element' : (_detection$lineText = detection.lineText) !== null && _detection$lineText !== void 0 && _detection$lineText.includes(value) ? 'line' : 'block';
|
|
434
|
+
const confidence = calculateTextConfidence(value, rawText, origin, validateChecksum);
|
|
200
435
|
return {
|
|
201
436
|
value,
|
|
202
437
|
source: 'text',
|
|
203
|
-
confidence
|
|
438
|
+
confidence,
|
|
204
439
|
boundingBox,
|
|
205
|
-
origin
|
|
440
|
+
origin,
|
|
206
441
|
rawPayload: detection
|
|
207
442
|
};
|
|
208
443
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_RESOLVED_OPTIONS","barcode","enabled","formats","text","language","detection","resultMode","preferBarcode","validateChecksum","emitDuplicates","resolveOptions","options","_options$detection","_options$detection2","_options$barcode","_options$barcode2","_options$text","_options$text2","_options$detection3","_options$detection4","length","exports","transliteration","A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z","weights","tokenizeCandidate","value","VIN_PATTERN","normalized","toUpperCase","cleaned","replace","tokens","split","filter","token","matches","Set","forEach","i","candidate","slice","test","add","Array","from","isValidVin","chars","sum","char","numeric","Number","parseInt","undefined","weight","remainder","expected","toString","checkDigit","toBoundingBox","preferred","maybe","top","bottom","left","right","width","height","block","blockBox","blockFrameTop","blockFrameBottom","blockFrameLeft","blockFrameRight","lineBox","lineFrameTop","lineFrameBottom","lineFrameLeft","lineFrameRight","elementBox","elementFrameTop","elementFrameBottom","elementFrameLeft","elementFrameRight","candidateFromBarcode","values","rawValue","displayValue","boundingBox","map","checksumValid","source","confidence","origin","rawPayload","candidateFromText","lineText","elementText","blockText","resultText","v","dedupeCandidates","candidates","Map","_candidate$boundingBo","_candidate$boundingBo2","key","join","existing","get","set","buildVinCandidates","payload","list","barcodes","push","textBlocks","textBlock","pickBestCandidate","sorted","sort","a","b"],"sourceRoot":"../../src","sources":["vinUtils.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["DEFAULT_RESOLVED_OPTIONS","barcode","enabled","formats","text","language","detection","resultMode","preferBarcode","validateChecksum","emitDuplicates","resolveOptions","options","_options$detection","_options$detection2","_options$barcode","_options$barcode2","_options$text","_options$text2","_options$detection3","_options$detection4","length","exports","transliteration","A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z","weights","OCR_SUBSTITUTIONS","generateSubstitutionCandidates","value","maxSubstitutions","candidates","Set","positions","i","char","push","positionsToTry","slice","generate","current","posIndex","substitutionCount","add","pos","undefined","replacements","forEach","replacement","newValue","Array","from","extractWithContext","matches","VIN_PATTERN","patterns","pattern","match","exec","captured","replace","candidate","toUpperCase","test","tokenizeCandidate","normalized","vin","cleaned","tokens","split","filter","token","hasSubstitutableChars","substitutions","sub","isValidVin","chars","sum","numeric","Number","parseInt","weight","remainder","expected","toString","checkDigit","toBoundingBox","preferred","maybe","top","bottom","left","right","width","height","block","blockBox","blockFrameTop","blockFrameBottom","blockFrameLeft","blockFrameRight","lineBox","lineFrameTop","lineFrameBottom","lineFrameLeft","lineFrameRight","elementBox","elementFrameTop","elementFrameBottom","elementFrameLeft","elementFrameRight","calculateBarcodeConfidence","confidence","checksumValid","candidateFromBarcode","values","rawValue","displayValue","boundingBox","map","source","origin","rawPayload","calculateTextConfidence","rawText","hasVinPrefix","Math","min","candidateFromText","valueMap","Map","elementText","order","lineText","blockText","resultText","v","_valueMap$get","has","get","set","entries","_detection$elementTex","_detection$lineText","includes","dedupeCandidates","_candidate$boundingBo","_candidate$boundingBo2","key","join","existing","buildVinCandidates","payload","list","barcodes","textBlocks","textBlock","pickBestCandidate","sorted","sort","a","b"],"sourceRoot":"../../src","sources":["vinUtils.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/vinUtils.js
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VIN Scanner Utilities
|
|
3
|
+
*
|
|
4
|
+
* This module provides advanced VIN (Vehicle Identification Number) detection
|
|
5
|
+
* and validation capabilities with the following features:
|
|
6
|
+
*
|
|
7
|
+
* 1. OCR Error Correction: Automatically corrects common OCR misreads (O/0, I/1, etc.)
|
|
8
|
+
* 2. Context-Aware Detection: Looks for VIN prefixes like "VIN:", "Vehicle ID", etc.
|
|
9
|
+
* 3. Check Digit Validation: Validates VINs using ISO 3779 standard algorithm
|
|
10
|
+
* 4. Smart Confidence Scoring: Assigns reliability scores based on multiple factors
|
|
11
|
+
* 5. Multi-Level Processing: Extracts from element, line, and block level text
|
|
12
|
+
*
|
|
13
|
+
* @see https://en.wikipedia.org/wiki/Vehicle_identification_number
|
|
14
|
+
*/
|
|
15
|
+
|
|
1
16
|
const DEFAULT_RESOLVED_OPTIONS = {
|
|
2
17
|
barcode: {
|
|
3
18
|
enabled: true,
|
|
@@ -63,6 +78,116 @@ const transliteration = {
|
|
|
63
78
|
Z: 9
|
|
64
79
|
};
|
|
65
80
|
const weights = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
81
|
+
|
|
82
|
+
// Common OCR misreads that need correction
|
|
83
|
+
const OCR_SUBSTITUTIONS = {
|
|
84
|
+
'O': ['0'],
|
|
85
|
+
// O often misread as 0 (and vice versa)
|
|
86
|
+
'0': ['O'],
|
|
87
|
+
'I': ['1'],
|
|
88
|
+
// I often misread as 1 (and vice versa)
|
|
89
|
+
'1': ['I'],
|
|
90
|
+
'Q': ['0', 'O'],
|
|
91
|
+
// Q should not appear in VINs
|
|
92
|
+
'S': ['5'],
|
|
93
|
+
// S can be misread as 5
|
|
94
|
+
'5': ['S'],
|
|
95
|
+
'B': ['8'],
|
|
96
|
+
// B can be misread as 8
|
|
97
|
+
'8': ['B'],
|
|
98
|
+
'Z': ['2'],
|
|
99
|
+
// Z can be misread as 2
|
|
100
|
+
'2': ['Z'],
|
|
101
|
+
'G': ['6'],
|
|
102
|
+
// G can be misread as 6
|
|
103
|
+
'6': ['G'],
|
|
104
|
+
'D': ['0'],
|
|
105
|
+
// D can be misread as 0
|
|
106
|
+
'U': ['V'],
|
|
107
|
+
// U can be misread as V
|
|
108
|
+
'V': ['U']
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Generate character substitution candidates for OCR error correction
|
|
113
|
+
* This creates variations of the input by substituting commonly misread characters
|
|
114
|
+
*/
|
|
115
|
+
const generateSubstitutionCandidates = (value, maxSubstitutions = 3) => {
|
|
116
|
+
'worklet';
|
|
117
|
+
|
|
118
|
+
const candidates = new Set([value]);
|
|
119
|
+
|
|
120
|
+
// Find positions that might need substitution
|
|
121
|
+
const positions = [];
|
|
122
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
123
|
+
const char = value[i];
|
|
124
|
+
if (char && OCR_SUBSTITUTIONS[char]) {
|
|
125
|
+
positions.push(i);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Limit the number of positions to try (combinatorial explosion prevention)
|
|
130
|
+
const positionsToTry = positions.slice(0, maxSubstitutions);
|
|
131
|
+
|
|
132
|
+
// Generate candidates by substituting at different positions
|
|
133
|
+
const generate = (current, posIndex, substitutionCount) => {
|
|
134
|
+
if (posIndex >= positionsToTry.length || substitutionCount >= maxSubstitutions) {
|
|
135
|
+
candidates.add(current);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Don't substitute at this position
|
|
140
|
+
generate(current, posIndex + 1, substitutionCount);
|
|
141
|
+
|
|
142
|
+
// Try substituting at this position
|
|
143
|
+
const pos = positionsToTry[posIndex];
|
|
144
|
+
if (pos !== undefined) {
|
|
145
|
+
const char = current[pos];
|
|
146
|
+
const replacements = char ? OCR_SUBSTITUTIONS[char] : undefined;
|
|
147
|
+
if (replacements) {
|
|
148
|
+
replacements.forEach(replacement => {
|
|
149
|
+
const newValue = current.slice(0, pos) + replacement + current.slice(pos + 1);
|
|
150
|
+
generate(newValue, posIndex + 1, substitutionCount + 1);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
generate(value, 0, 0);
|
|
156
|
+
return Array.from(candidates);
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Extract VINs using context-aware patterns (looking for VIN: prefix, etc.)
|
|
161
|
+
* Note: Regex patterns must be defined inside worklet for proper serialization
|
|
162
|
+
*/
|
|
163
|
+
const extractWithContext = text => {
|
|
164
|
+
'worklet';
|
|
165
|
+
|
|
166
|
+
const matches = new Set();
|
|
167
|
+
const VIN_PATTERN = /^[A-HJ-NPR-Z0-9]{17}$/;
|
|
168
|
+
|
|
169
|
+
// Define patterns inside worklet to ensure they're available in the worklet context
|
|
170
|
+
const patterns = [/(?:^|[\s:])VIN[:\s]+([A-Z0-9]{17,})/i, /(?:^|[\s:])V\.?I\.?N\.?[:\s]+([A-Z0-9]{17,})/i, /Vehicle\s+(?:Identification\s+)?(?:Number|ID|Id)[:\s]+([A-Z0-9]{17,})/i, /(?:^|[\s:])Chassis\s+(?:Number|No\.?)[:\s]+([A-Z0-9]{17,})/i, /(?:^|[\s:])Serial\s+(?:Number|No\.?)[:\s]+([A-Z0-9]{17,})/i];
|
|
171
|
+
patterns.forEach(pattern => {
|
|
172
|
+
const match = pattern.exec(text);
|
|
173
|
+
if (match && match[1]) {
|
|
174
|
+
const captured = match[1].replace(/[^A-Z0-9]/gi, '');
|
|
175
|
+
// Extract exactly 17 characters
|
|
176
|
+
if (captured.length >= 17) {
|
|
177
|
+
const candidate = captured.slice(0, 17).toUpperCase();
|
|
178
|
+
if (VIN_PATTERN.test(candidate)) {
|
|
179
|
+
matches.add(candidate);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
return Array.from(matches);
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Tokenize and extract VIN candidates from raw text
|
|
189
|
+
* Includes OCR error correction and context-aware extraction
|
|
190
|
+
*/
|
|
66
191
|
const tokenizeCandidate = value => {
|
|
67
192
|
'worklet';
|
|
68
193
|
|
|
@@ -71,18 +196,39 @@ const tokenizeCandidate = value => {
|
|
|
71
196
|
return [];
|
|
72
197
|
}
|
|
73
198
|
const normalized = value.toUpperCase();
|
|
199
|
+
const matches = new Set();
|
|
200
|
+
|
|
201
|
+
// First, try context-aware extraction (VIN: prefix, etc.)
|
|
202
|
+
extractWithContext(normalized).forEach(vin => matches.add(vin));
|
|
203
|
+
|
|
204
|
+
// Then do regular tokenization
|
|
74
205
|
const cleaned = normalized.replace(/[^A-Z0-9]/g, ' ');
|
|
75
206
|
const tokens = cleaned.split(/\s+/).filter(token => token.length > 0);
|
|
76
|
-
const matches = new Set();
|
|
77
207
|
tokens.forEach(token => {
|
|
78
208
|
if (token.length < 17) {
|
|
79
209
|
return;
|
|
80
210
|
}
|
|
211
|
+
|
|
212
|
+
// Try every 17-character substring
|
|
81
213
|
for (let i = 0; i <= token.length - 17; i += 1) {
|
|
82
214
|
const candidate = token.slice(i, i + 17);
|
|
215
|
+
|
|
216
|
+
// Direct match
|
|
83
217
|
if (VIN_PATTERN.test(candidate)) {
|
|
84
218
|
matches.add(candidate);
|
|
85
219
|
}
|
|
220
|
+
|
|
221
|
+
// Try with OCR substitutions for candidates that are close
|
|
222
|
+
// Only if they contain substitutable characters and don't match directly
|
|
223
|
+
const hasSubstitutableChars = /[OISQBZGDUV]/.test(candidate);
|
|
224
|
+
if (hasSubstitutableChars) {
|
|
225
|
+
const substitutions = generateSubstitutionCandidates(candidate, 2);
|
|
226
|
+
substitutions.forEach(sub => {
|
|
227
|
+
if (VIN_PATTERN.test(sub)) {
|
|
228
|
+
matches.add(sub);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
86
232
|
}
|
|
87
233
|
});
|
|
88
234
|
return Array.from(matches);
|
|
@@ -162,6 +308,25 @@ const toBoundingBox = (candidate, preferred) => {
|
|
|
162
308
|
}
|
|
163
309
|
return blockBox || lineBox || elementBox;
|
|
164
310
|
};
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Calculate confidence score for a barcode-based VIN candidate
|
|
314
|
+
* Barcodes are generally more reliable than text recognition
|
|
315
|
+
*/
|
|
316
|
+
const calculateBarcodeConfidence = (value, validateChecksum) => {
|
|
317
|
+
'worklet';
|
|
318
|
+
|
|
319
|
+
let confidence = 0.85; // Base confidence for barcode
|
|
320
|
+
|
|
321
|
+
// Check digit validation
|
|
322
|
+
const checksumValid = isValidVin(value);
|
|
323
|
+
if (checksumValid) {
|
|
324
|
+
confidence = 0.98; // Very high confidence
|
|
325
|
+
} else if (!validateChecksum) {
|
|
326
|
+
confidence = 0.9; // Still high if validation disabled
|
|
327
|
+
}
|
|
328
|
+
return confidence;
|
|
329
|
+
};
|
|
165
330
|
const candidateFromBarcode = (detection, validateChecksum) => {
|
|
166
331
|
'worklet';
|
|
167
332
|
|
|
@@ -170,31 +335,101 @@ const candidateFromBarcode = (detection, validateChecksum) => {
|
|
|
170
335
|
tokenizeCandidate(detection.displayValue ?? '').forEach(value => values.add(value));
|
|
171
336
|
const boundingBox = toBoundingBox(detection, 'barcode');
|
|
172
337
|
return Array.from(values).map(value => {
|
|
173
|
-
const
|
|
338
|
+
const confidence = calculateBarcodeConfidence(value, validateChecksum);
|
|
174
339
|
return {
|
|
175
340
|
value,
|
|
176
341
|
source: 'barcode',
|
|
177
|
-
confidence
|
|
342
|
+
confidence,
|
|
178
343
|
boundingBox,
|
|
179
344
|
origin: detection.displayValue ? 'displayValue' : 'rawValue',
|
|
180
345
|
rawPayload: detection
|
|
181
346
|
};
|
|
182
347
|
});
|
|
183
348
|
};
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Calculate confidence score for a text-based VIN candidate
|
|
352
|
+
* Higher confidence for:
|
|
353
|
+
* - Valid check digit
|
|
354
|
+
* - Found with VIN prefix context
|
|
355
|
+
* - Element/line level detection (vs block level)
|
|
356
|
+
*/
|
|
357
|
+
const calculateTextConfidence = (value, rawText, origin, validateChecksum) => {
|
|
358
|
+
'worklet';
|
|
359
|
+
|
|
360
|
+
let confidence = 0.5; // Base confidence for text recognition
|
|
361
|
+
|
|
362
|
+
// Check digit validation significantly increases confidence
|
|
363
|
+
const checksumValid = isValidVin(value);
|
|
364
|
+
if (checksumValid) {
|
|
365
|
+
confidence += 0.35; // Boost to 0.85
|
|
366
|
+
} else if (!validateChecksum) {
|
|
367
|
+
confidence += 0.2; // Still boost if validation is disabled
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Context-aware detection (VIN prefix found) increases confidence
|
|
371
|
+
const hasVinPrefix = /VIN|Vehicle\s+(?:Identification|ID|Id)|Chassis|Serial/i.test(rawText);
|
|
372
|
+
if (hasVinPrefix) {
|
|
373
|
+
confidence += 0.1; // Boost to 0.95 if checksum valid, 0.6 if not
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Element-level text is more accurate than block-level
|
|
377
|
+
if (origin === 'element') {
|
|
378
|
+
confidence += 0.05;
|
|
379
|
+
} else if (origin === 'line') {
|
|
380
|
+
confidence += 0.03;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Cap at 0.98 (never 1.0 for text recognition)
|
|
384
|
+
return Math.min(confidence, 0.98);
|
|
385
|
+
};
|
|
184
386
|
const candidateFromText = (detection, validateChecksum) => {
|
|
185
387
|
'worklet';
|
|
186
388
|
|
|
187
|
-
const
|
|
188
|
-
|
|
389
|
+
const valueMap = new Map();
|
|
390
|
+
|
|
391
|
+
// Process each text level, with priority ordering
|
|
392
|
+
[{
|
|
393
|
+
text: detection.elementText,
|
|
394
|
+
order: 1
|
|
395
|
+
}, {
|
|
396
|
+
text: detection.lineText,
|
|
397
|
+
order: 2
|
|
398
|
+
}, {
|
|
399
|
+
text: detection.blockText,
|
|
400
|
+
order: 3
|
|
401
|
+
}, {
|
|
402
|
+
text: detection.resultText,
|
|
403
|
+
order: 4
|
|
404
|
+
}].forEach(({
|
|
405
|
+
text,
|
|
406
|
+
order
|
|
407
|
+
}) => {
|
|
408
|
+
if (text) {
|
|
409
|
+
tokenizeCandidate(text).forEach(v => {
|
|
410
|
+
var _valueMap$get;
|
|
411
|
+
if (!valueMap.has(v) || (((_valueMap$get = valueMap.get(v)) === null || _valueMap$get === void 0 ? void 0 : _valueMap$get.order) ?? 999) > order) {
|
|
412
|
+
valueMap.set(v, {
|
|
413
|
+
rawText: text,
|
|
414
|
+
order
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
});
|
|
189
420
|
const boundingBox = toBoundingBox(detection, 'line') ?? toBoundingBox(detection, 'element') ?? toBoundingBox(detection, 'block');
|
|
190
|
-
return Array.from(
|
|
191
|
-
|
|
421
|
+
return Array.from(valueMap.entries()).map(([value, {
|
|
422
|
+
rawText
|
|
423
|
+
}]) => {
|
|
424
|
+
var _detection$elementTex, _detection$lineText;
|
|
425
|
+
const origin = (_detection$elementTex = detection.elementText) !== null && _detection$elementTex !== void 0 && _detection$elementTex.includes(value) ? 'element' : (_detection$lineText = detection.lineText) !== null && _detection$lineText !== void 0 && _detection$lineText.includes(value) ? 'line' : 'block';
|
|
426
|
+
const confidence = calculateTextConfidence(value, rawText, origin, validateChecksum);
|
|
192
427
|
return {
|
|
193
428
|
value,
|
|
194
429
|
source: 'text',
|
|
195
|
-
confidence
|
|
430
|
+
confidence,
|
|
196
431
|
boundingBox,
|
|
197
|
-
origin
|
|
432
|
+
origin,
|
|
198
433
|
rawPayload: detection
|
|
199
434
|
};
|
|
200
435
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_RESOLVED_OPTIONS","barcode","enabled","formats","text","language","detection","resultMode","preferBarcode","validateChecksum","emitDuplicates","resolveOptions","options","_options$detection","_options$detection2","_options$barcode","_options$barcode2","_options$text","_options$text2","_options$detection3","_options$detection4","length","transliteration","A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z","weights","tokenizeCandidate","value","VIN_PATTERN","normalized","toUpperCase","cleaned","replace","tokens","split","filter","token","matches","Set","forEach","i","candidate","slice","test","add","Array","from","isValidVin","chars","sum","char","numeric","Number","parseInt","undefined","weight","remainder","expected","toString","checkDigit","toBoundingBox","preferred","maybe","top","bottom","left","right","width","height","block","blockBox","blockFrameTop","blockFrameBottom","blockFrameLeft","blockFrameRight","lineBox","lineFrameTop","lineFrameBottom","lineFrameLeft","lineFrameRight","elementBox","elementFrameTop","elementFrameBottom","elementFrameLeft","elementFrameRight","candidateFromBarcode","values","rawValue","displayValue","boundingBox","map","checksumValid","source","confidence","origin","rawPayload","candidateFromText","lineText","elementText","blockText","resultText","v","dedupeCandidates","candidates","Map","_candidate$boundingBo","_candidate$boundingBo2","key","join","existing","get","set","buildVinCandidates","payload","list","barcodes","push","textBlocks","textBlock","pickBestCandidate","sorted","sort","a","b"],"sourceRoot":"../../src","sources":["vinUtils.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["DEFAULT_RESOLVED_OPTIONS","barcode","enabled","formats","text","language","detection","resultMode","preferBarcode","validateChecksum","emitDuplicates","resolveOptions","options","_options$detection","_options$detection2","_options$barcode","_options$barcode2","_options$text","_options$text2","_options$detection3","_options$detection4","length","transliteration","A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z","weights","OCR_SUBSTITUTIONS","generateSubstitutionCandidates","value","maxSubstitutions","candidates","Set","positions","i","char","push","positionsToTry","slice","generate","current","posIndex","substitutionCount","add","pos","undefined","replacements","forEach","replacement","newValue","Array","from","extractWithContext","matches","VIN_PATTERN","patterns","pattern","match","exec","captured","replace","candidate","toUpperCase","test","tokenizeCandidate","normalized","vin","cleaned","tokens","split","filter","token","hasSubstitutableChars","substitutions","sub","isValidVin","chars","sum","numeric","Number","parseInt","weight","remainder","expected","toString","checkDigit","toBoundingBox","preferred","maybe","top","bottom","left","right","width","height","block","blockBox","blockFrameTop","blockFrameBottom","blockFrameLeft","blockFrameRight","lineBox","lineFrameTop","lineFrameBottom","lineFrameLeft","lineFrameRight","elementBox","elementFrameTop","elementFrameBottom","elementFrameLeft","elementFrameRight","calculateBarcodeConfidence","confidence","checksumValid","candidateFromBarcode","values","rawValue","displayValue","boundingBox","map","source","origin","rawPayload","calculateTextConfidence","rawText","hasVinPrefix","Math","min","candidateFromText","valueMap","Map","elementText","order","lineText","blockText","resultText","v","_valueMap$get","has","get","set","entries","_detection$elementTex","_detection$lineText","includes","dedupeCandidates","_candidate$boundingBo","_candidate$boundingBo2","key","join","existing","buildVinCandidates","payload","list","barcodes","textBlocks","textBlock","pickBestCandidate","sorted","sort","a","b"],"sourceRoot":"../../src","sources":["vinUtils.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VIN Scanner Utilities
|
|
3
|
+
*
|
|
4
|
+
* This module provides advanced VIN (Vehicle Identification Number) detection
|
|
5
|
+
* and validation capabilities with the following features:
|
|
6
|
+
*
|
|
7
|
+
* 1. OCR Error Correction: Automatically corrects common OCR misreads (O/0, I/1, etc.)
|
|
8
|
+
* 2. Context-Aware Detection: Looks for VIN prefixes like "VIN:", "Vehicle ID", etc.
|
|
9
|
+
* 3. Check Digit Validation: Validates VINs using ISO 3779 standard algorithm
|
|
10
|
+
* 4. Smart Confidence Scoring: Assigns reliability scores based on multiple factors
|
|
11
|
+
* 5. Multi-Level Processing: Extracts from element, line, and block level text
|
|
12
|
+
*
|
|
13
|
+
* @see https://en.wikipedia.org/wiki/Vehicle_identification_number
|
|
14
|
+
*/
|
|
1
15
|
import type { DetectionOptions, ScanBarcodeOptions, TextRecognitionLanguage, VinCandidate, VinResultMode, VinScannerOptions, WorkletPayload } from './types';
|
|
2
16
|
export type ResolvedVinScannerOptions = {
|
|
3
17
|
barcode: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vinUtils.d.ts","sourceRoot":"","sources":["../../../src/vinUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,kBAAkB,EAElB,uBAAuB,EACvB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,kBAAkB,CAAC;KAC7B,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,uBAAuB,CAAC;KACnC,CAAC;IACF,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG;QAAE,UAAU,EAAE,aAAa,CAAA;KAAE,CAAC;CACvE,CAAC;AAmBF,eAAO,MAAM,cAAc,GACzB,UAAU,iBAAiB,KAC1B,yBAmCF,CAAC;
|
|
1
|
+
{"version":3,"file":"vinUtils.d.ts","sourceRoot":"","sources":["../../../src/vinUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAEV,gBAAgB,EAChB,kBAAkB,EAElB,uBAAuB,EACvB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,kBAAkB,CAAC;KAC7B,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,uBAAuB,CAAC;KACnC,CAAC;IACF,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG;QAAE,UAAU,EAAE,aAAa,CAAA;KAAE,CAAC;CACvE,CAAC;AAmBF,eAAO,MAAM,cAAc,GACzB,UAAU,iBAAiB,KAC1B,yBAmCF,CAAC;AAoMF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,OA6B1C,CAAC;AAgQF,eAAO,MAAM,kBAAkB,GAC7B,SAAS,cAAc,EACvB,SAAS,yBAAyB,KACjC,YAAY,EAkBd,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,YAAY,YAAY,EAAE,EAC1B,SAAS,yBAAyB,KACjC,YAAY,GAAG,IAejB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mleonard9/vin-scanner",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "High-performance VIN scanner for React Native Vision Camera powered by Google ML Kit barcode + text recognition.",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
package/src/vinUtils.ts
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VIN Scanner Utilities
|
|
3
|
+
*
|
|
4
|
+
* This module provides advanced VIN (Vehicle Identification Number) detection
|
|
5
|
+
* and validation capabilities with the following features:
|
|
6
|
+
*
|
|
7
|
+
* 1. OCR Error Correction: Automatically corrects common OCR misreads (O/0, I/1, etc.)
|
|
8
|
+
* 2. Context-Aware Detection: Looks for VIN prefixes like "VIN:", "Vehicle ID", etc.
|
|
9
|
+
* 3. Check Digit Validation: Validates VINs using ISO 3779 standard algorithm
|
|
10
|
+
* 4. Smart Confidence Scoring: Assigns reliability scores based on multiple factors
|
|
11
|
+
* 5. Multi-Level Processing: Extracts from element, line, and block level text
|
|
12
|
+
*
|
|
13
|
+
* @see https://en.wikipedia.org/wiki/Vehicle_identification_number
|
|
14
|
+
*/
|
|
15
|
+
|
|
1
16
|
import type {
|
|
2
17
|
BarcodeDetection,
|
|
3
18
|
DetectionOptions,
|
|
@@ -106,27 +121,169 @@ const transliteration: Record<string, number> = {
|
|
|
106
121
|
|
|
107
122
|
const weights = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
108
123
|
|
|
124
|
+
// Common OCR misreads that need correction
|
|
125
|
+
const OCR_SUBSTITUTIONS: Record<string, string[]> = {
|
|
126
|
+
'O': ['0'], // O often misread as 0 (and vice versa)
|
|
127
|
+
'0': ['O'],
|
|
128
|
+
'I': ['1'], // I often misread as 1 (and vice versa)
|
|
129
|
+
'1': ['I'],
|
|
130
|
+
'Q': ['0', 'O'], // Q should not appear in VINs
|
|
131
|
+
'S': ['5'], // S can be misread as 5
|
|
132
|
+
'5': ['S'],
|
|
133
|
+
'B': ['8'], // B can be misread as 8
|
|
134
|
+
'8': ['B'],
|
|
135
|
+
'Z': ['2'], // Z can be misread as 2
|
|
136
|
+
'2': ['Z'],
|
|
137
|
+
'G': ['6'], // G can be misread as 6
|
|
138
|
+
'6': ['G'],
|
|
139
|
+
'D': ['0'], // D can be misread as 0
|
|
140
|
+
'U': ['V'], // U can be misread as V
|
|
141
|
+
'V': ['U'],
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Generate character substitution candidates for OCR error correction
|
|
146
|
+
* This creates variations of the input by substituting commonly misread characters
|
|
147
|
+
*/
|
|
148
|
+
const generateSubstitutionCandidates = (
|
|
149
|
+
value: string,
|
|
150
|
+
maxSubstitutions: number = 3
|
|
151
|
+
): string[] => {
|
|
152
|
+
'worklet';
|
|
153
|
+
const candidates = new Set<string>([value]);
|
|
154
|
+
|
|
155
|
+
// Find positions that might need substitution
|
|
156
|
+
const positions: number[] = [];
|
|
157
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
158
|
+
const char = value[i];
|
|
159
|
+
if (char && OCR_SUBSTITUTIONS[char]) {
|
|
160
|
+
positions.push(i);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Limit the number of positions to try (combinatorial explosion prevention)
|
|
165
|
+
const positionsToTry = positions.slice(0, maxSubstitutions);
|
|
166
|
+
|
|
167
|
+
// Generate candidates by substituting at different positions
|
|
168
|
+
const generate = (
|
|
169
|
+
current: string,
|
|
170
|
+
posIndex: number,
|
|
171
|
+
substitutionCount: number
|
|
172
|
+
) => {
|
|
173
|
+
if (
|
|
174
|
+
posIndex >= positionsToTry.length ||
|
|
175
|
+
substitutionCount >= maxSubstitutions
|
|
176
|
+
) {
|
|
177
|
+
candidates.add(current);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Don't substitute at this position
|
|
182
|
+
generate(current, posIndex + 1, substitutionCount);
|
|
183
|
+
|
|
184
|
+
// Try substituting at this position
|
|
185
|
+
const pos = positionsToTry[posIndex];
|
|
186
|
+
if (pos !== undefined) {
|
|
187
|
+
const char = current[pos];
|
|
188
|
+
const replacements = char ? OCR_SUBSTITUTIONS[char] : undefined;
|
|
189
|
+
if (replacements) {
|
|
190
|
+
replacements.forEach((replacement) => {
|
|
191
|
+
const newValue =
|
|
192
|
+
current.slice(0, pos) + replacement + current.slice(pos + 1);
|
|
193
|
+
generate(newValue, posIndex + 1, substitutionCount + 1);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
generate(value, 0, 0);
|
|
200
|
+
return Array.from(candidates);
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Extract VINs using context-aware patterns (looking for VIN: prefix, etc.)
|
|
205
|
+
* Note: Regex patterns must be defined inside worklet for proper serialization
|
|
206
|
+
*/
|
|
207
|
+
const extractWithContext = (text: string): string[] => {
|
|
208
|
+
'worklet';
|
|
209
|
+
const matches = new Set<string>();
|
|
210
|
+
const VIN_PATTERN = /^[A-HJ-NPR-Z0-9]{17}$/;
|
|
211
|
+
|
|
212
|
+
// Define patterns inside worklet to ensure they're available in the worklet context
|
|
213
|
+
const patterns = [
|
|
214
|
+
/(?:^|[\s:])VIN[:\s]+([A-Z0-9]{17,})/i,
|
|
215
|
+
/(?:^|[\s:])V\.?I\.?N\.?[:\s]+([A-Z0-9]{17,})/i,
|
|
216
|
+
/Vehicle\s+(?:Identification\s+)?(?:Number|ID|Id)[:\s]+([A-Z0-9]{17,})/i,
|
|
217
|
+
/(?:^|[\s:])Chassis\s+(?:Number|No\.?)[:\s]+([A-Z0-9]{17,})/i,
|
|
218
|
+
/(?:^|[\s:])Serial\s+(?:Number|No\.?)[:\s]+([A-Z0-9]{17,})/i,
|
|
219
|
+
];
|
|
220
|
+
|
|
221
|
+
patterns.forEach((pattern) => {
|
|
222
|
+
const match = pattern.exec(text);
|
|
223
|
+
if (match && match[1]) {
|
|
224
|
+
const captured = match[1].replace(/[^A-Z0-9]/gi, '');
|
|
225
|
+
// Extract exactly 17 characters
|
|
226
|
+
if (captured.length >= 17) {
|
|
227
|
+
const candidate = captured.slice(0, 17).toUpperCase();
|
|
228
|
+
if (VIN_PATTERN.test(candidate)) {
|
|
229
|
+
matches.add(candidate);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
return Array.from(matches);
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Tokenize and extract VIN candidates from raw text
|
|
240
|
+
* Includes OCR error correction and context-aware extraction
|
|
241
|
+
*/
|
|
109
242
|
const tokenizeCandidate = (value: string): string[] => {
|
|
110
243
|
'worklet';
|
|
111
244
|
const VIN_PATTERN = /^[A-HJ-NPR-Z0-9]{17}$/;
|
|
112
245
|
if (!value) {
|
|
113
246
|
return [];
|
|
114
247
|
}
|
|
248
|
+
|
|
115
249
|
const normalized = value.toUpperCase();
|
|
250
|
+
const matches = new Set<string>();
|
|
251
|
+
|
|
252
|
+
// First, try context-aware extraction (VIN: prefix, etc.)
|
|
253
|
+
extractWithContext(normalized).forEach((vin) => matches.add(vin));
|
|
254
|
+
|
|
255
|
+
// Then do regular tokenization
|
|
116
256
|
const cleaned = normalized.replace(/[^A-Z0-9]/g, ' ');
|
|
117
257
|
const tokens = cleaned.split(/\s+/).filter((token) => token.length > 0);
|
|
118
|
-
|
|
258
|
+
|
|
119
259
|
tokens.forEach((token) => {
|
|
120
260
|
if (token.length < 17) {
|
|
121
261
|
return;
|
|
122
262
|
}
|
|
263
|
+
|
|
264
|
+
// Try every 17-character substring
|
|
123
265
|
for (let i = 0; i <= token.length - 17; i += 1) {
|
|
124
266
|
const candidate = token.slice(i, i + 17);
|
|
267
|
+
|
|
268
|
+
// Direct match
|
|
125
269
|
if (VIN_PATTERN.test(candidate)) {
|
|
126
270
|
matches.add(candidate);
|
|
127
271
|
}
|
|
272
|
+
|
|
273
|
+
// Try with OCR substitutions for candidates that are close
|
|
274
|
+
// Only if they contain substitutable characters and don't match directly
|
|
275
|
+
const hasSubstitutableChars = /[OISQBZGDUV]/.test(candidate);
|
|
276
|
+
if (hasSubstitutableChars) {
|
|
277
|
+
const substitutions = generateSubstitutionCandidates(candidate, 2);
|
|
278
|
+
substitutions.forEach((sub) => {
|
|
279
|
+
if (VIN_PATTERN.test(sub)) {
|
|
280
|
+
matches.add(sub);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
128
284
|
}
|
|
129
285
|
});
|
|
286
|
+
|
|
130
287
|
return Array.from(matches);
|
|
131
288
|
};
|
|
132
289
|
|
|
@@ -254,6 +411,28 @@ const toBoundingBox = (
|
|
|
254
411
|
return blockBox || lineBox || elementBox;
|
|
255
412
|
};
|
|
256
413
|
|
|
414
|
+
/**
|
|
415
|
+
* Calculate confidence score for a barcode-based VIN candidate
|
|
416
|
+
* Barcodes are generally more reliable than text recognition
|
|
417
|
+
*/
|
|
418
|
+
const calculateBarcodeConfidence = (
|
|
419
|
+
value: string,
|
|
420
|
+
validateChecksum: boolean
|
|
421
|
+
): number => {
|
|
422
|
+
'worklet';
|
|
423
|
+
let confidence = 0.85; // Base confidence for barcode
|
|
424
|
+
|
|
425
|
+
// Check digit validation
|
|
426
|
+
const checksumValid = isValidVin(value);
|
|
427
|
+
if (checksumValid) {
|
|
428
|
+
confidence = 0.98; // Very high confidence
|
|
429
|
+
} else if (!validateChecksum) {
|
|
430
|
+
confidence = 0.9; // Still high if validation disabled
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return confidence;
|
|
434
|
+
};
|
|
435
|
+
|
|
257
436
|
const candidateFromBarcode = (
|
|
258
437
|
detection: BarcodeDetection,
|
|
259
438
|
validateChecksum: boolean
|
|
@@ -268,11 +447,11 @@ const candidateFromBarcode = (
|
|
|
268
447
|
);
|
|
269
448
|
const boundingBox = toBoundingBox(detection, 'barcode');
|
|
270
449
|
return Array.from(values).map((value) => {
|
|
271
|
-
const
|
|
450
|
+
const confidence = calculateBarcodeConfidence(value, validateChecksum);
|
|
272
451
|
return {
|
|
273
452
|
value,
|
|
274
453
|
source: 'barcode' as const,
|
|
275
|
-
confidence
|
|
454
|
+
confidence,
|
|
276
455
|
boundingBox,
|
|
277
456
|
origin: detection.displayValue ? 'displayValue' : 'rawValue',
|
|
278
457
|
rawPayload: detection,
|
|
@@ -280,36 +459,96 @@ const candidateFromBarcode = (
|
|
|
280
459
|
});
|
|
281
460
|
};
|
|
282
461
|
|
|
462
|
+
/**
|
|
463
|
+
* Calculate confidence score for a text-based VIN candidate
|
|
464
|
+
* Higher confidence for:
|
|
465
|
+
* - Valid check digit
|
|
466
|
+
* - Found with VIN prefix context
|
|
467
|
+
* - Element/line level detection (vs block level)
|
|
468
|
+
*/
|
|
469
|
+
const calculateTextConfidence = (
|
|
470
|
+
value: string,
|
|
471
|
+
rawText: string,
|
|
472
|
+
origin: string,
|
|
473
|
+
validateChecksum: boolean
|
|
474
|
+
): number => {
|
|
475
|
+
'worklet';
|
|
476
|
+
let confidence = 0.5; // Base confidence for text recognition
|
|
477
|
+
|
|
478
|
+
// Check digit validation significantly increases confidence
|
|
479
|
+
const checksumValid = isValidVin(value);
|
|
480
|
+
if (checksumValid) {
|
|
481
|
+
confidence += 0.35; // Boost to 0.85
|
|
482
|
+
} else if (!validateChecksum) {
|
|
483
|
+
confidence += 0.2; // Still boost if validation is disabled
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// Context-aware detection (VIN prefix found) increases confidence
|
|
487
|
+
const hasVinPrefix =
|
|
488
|
+
/VIN|Vehicle\s+(?:Identification|ID|Id)|Chassis|Serial/i.test(rawText);
|
|
489
|
+
if (hasVinPrefix) {
|
|
490
|
+
confidence += 0.1; // Boost to 0.95 if checksum valid, 0.6 if not
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// Element-level text is more accurate than block-level
|
|
494
|
+
if (origin === 'element') {
|
|
495
|
+
confidence += 0.05;
|
|
496
|
+
} else if (origin === 'line') {
|
|
497
|
+
confidence += 0.03;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// Cap at 0.98 (never 1.0 for text recognition)
|
|
501
|
+
return Math.min(confidence, 0.98);
|
|
502
|
+
};
|
|
503
|
+
|
|
283
504
|
const candidateFromText = (
|
|
284
505
|
detection: TextDetection,
|
|
285
506
|
validateChecksum: boolean
|
|
286
507
|
): VinCandidate[] => {
|
|
287
508
|
'worklet';
|
|
288
|
-
const
|
|
509
|
+
const valueMap = new Map<string, { rawText: string; order: number }>();
|
|
510
|
+
|
|
511
|
+
// Process each text level, with priority ordering
|
|
289
512
|
[
|
|
290
|
-
detection.
|
|
291
|
-
detection.
|
|
292
|
-
detection.blockText,
|
|
293
|
-
detection.resultText,
|
|
294
|
-
].forEach((
|
|
295
|
-
|
|
296
|
-
|
|
513
|
+
{ text: detection.elementText, order: 1 },
|
|
514
|
+
{ text: detection.lineText, order: 2 },
|
|
515
|
+
{ text: detection.blockText, order: 3 },
|
|
516
|
+
{ text: detection.resultText, order: 4 },
|
|
517
|
+
].forEach(({ text, order }) => {
|
|
518
|
+
if (text) {
|
|
519
|
+
tokenizeCandidate(text).forEach((v) => {
|
|
520
|
+
if (!valueMap.has(v) || (valueMap.get(v)?.order ?? 999) > order) {
|
|
521
|
+
valueMap.set(v, { rawText: text, order });
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
|
|
297
527
|
const boundingBox =
|
|
298
528
|
toBoundingBox(detection, 'line') ??
|
|
299
529
|
toBoundingBox(detection, 'element') ??
|
|
300
530
|
toBoundingBox(detection, 'block');
|
|
301
|
-
|
|
302
|
-
|
|
531
|
+
|
|
532
|
+
return Array.from(valueMap.entries()).map(([value, { rawText }]) => {
|
|
533
|
+
const origin = detection.elementText?.includes(value)
|
|
534
|
+
? 'element'
|
|
535
|
+
: detection.lineText?.includes(value)
|
|
536
|
+
? 'line'
|
|
537
|
+
: 'block';
|
|
538
|
+
|
|
539
|
+
const confidence = calculateTextConfidence(
|
|
540
|
+
value,
|
|
541
|
+
rawText,
|
|
542
|
+
origin,
|
|
543
|
+
validateChecksum
|
|
544
|
+
);
|
|
545
|
+
|
|
303
546
|
return {
|
|
304
547
|
value,
|
|
305
548
|
source: 'text' as const,
|
|
306
|
-
confidence
|
|
549
|
+
confidence,
|
|
307
550
|
boundingBox,
|
|
308
|
-
origin
|
|
309
|
-
? 'element'
|
|
310
|
-
: detection.lineText
|
|
311
|
-
? 'line'
|
|
312
|
-
: 'block',
|
|
551
|
+
origin,
|
|
313
552
|
rawPayload: detection,
|
|
314
553
|
};
|
|
315
554
|
});
|