react-native-plate-scanner
v1.0.1
Published
On-device Korean license-plate recognition for React Native (offline, no license).
Downloads
45
Maintainers
Readme
react-native-plate-scanner
On-device Korean license-plate recognition for React Native. Fully offline — no network, no cloud, no license/API key. Models are bundled in the native module.
- Android: implemented (YOLOv11-640 detect + tinyLPR OCR + Korean 8-format post-processing)
- iOS: not implemented yet (calls reject on iOS)
- Accuracy: ~70% exact match on real photos; higher on clean plates
Requires a custom dev client / bare workflow. Does not work in Expo Go (native code). For Expo, use a development build (
expo prebuild+expo run:android).
Install
npm install react-native-plate-scanner
# or
yarn add react-native-plate-scannerAutolinking wires up the Android native module. Then you must tell your app not
to compress the bundled model files — add this to android/app/build.gradle:
android {
androidResources {
noCompress 'tflite', 'onnx', 'txt'
}
}Finally rebuild the app:
npx react-native run-android
# (Expo) npx expo run:androidThe module pulls TensorFlow Lite + ONNX Runtime automatically. App size grows by ~15–20 MB (models + inference runtimes).
Usage
import { recognizePlate } from 'react-native-plate-scanner';
// imageUri: a file:// URI from a camera/picker (e.g. expo-camera, vision-camera,
// react-native-image-picker). Any orientation is handled internally.
const result = await recognizePlate(imageUri);
if (result.plate && !result.needsConfirm) {
console.log('Plate:', result.plate); // e.g. "대전 89 아3305" / "12가3456"
} else if (result.plate) {
// low confidence — ask user to confirm result.plate
} else {
// no plate found
}Result shape
interface PlateResult {
plate: string; // normalized plate ("" if none)
confidence: number; // 0..1
plateType: string; // ordinary_private | commercial | construction_new | ... | unknown
vehicleType: string;
region: string | null; // e.g. "대전"
matchedFormat: boolean; // matched one of the 8 Korean formats
needsConfirm: boolean; // true when confidence < 0.8
rawOcr: string; // OCR text before normalization (debug)
debug: string; // orientations tried, chosen degree, confidence
}Notes & limits
- Run recognition off the JS/UI critical path where possible; a call takes a few hundred ms depending on device and image size.
confidence >= 0.8typically means correct. UseneedsConfirmto gate auto-accept vs. manual confirmation.- Free/offline engine; for higher accuracy on hard images combine with an online OCR when connectivity is available.
- iOS is a stub;
recognizePlaterejects on iOS until an iOS implementation is added.
Author
HIEP LE VAN
- GitLab: https://gitlab.com/react-native7481714
- Email: [email protected]
License
MIT © HIEP LE VAN
