Проектная документация
Данный проект основан на коде, доступном по ссылке: https://github.com/XieZhiFa/IdCardOC. На этой базе был заново создан интерфейс для распознавания, поддерживающий автоматическое сканирование, сканирование с помощью камеры и сканирование из галереи изображений. Поддерживается только вертикальный режим отображения.
Главная страница
Лицевая сторона удостоверения личности
Обратная сторона удостоверения личности
Инициализация в приложении
LibraryInitOCR.initOCR(context);
Вызов окна сканирования
Bundle bundle = new Bundle();
bundle.putBoolean("saveImage",
binding.saveImage.getSelectedItemPosition() == 0 ? true : false); //сохранение распознанного изображения
bundle.putBoolean("showSelect", true); //отображение выбора изображения
bundle.putBoolean("showCamera", true); //отображение камеры (для водительских прав лучше использовать камеру, а не выбор изображения)
bundle.putInt("requestCode", REQUEST_CODE); // requestCode
bundle.putInt("type", binding.type.getSelectedItemPosition()); //0 — удостоверение личности, 1 — водительские права
LibraryInitOCR.startScan(context, bundle);
//Если вы не хотите интегрировать aar, то можно вызвать окно сканирования через неявное намерение
boolean isSave = binding.tip.getVisibility() == View.GONE;
Intent intent = new Intent("com.msd.ocr.idcard.ICVideo");
intent.putExtra("saveImage",isSave);//сохранение изображения
intent.putExtra("showSelect",true);//отображение выбора изображения
bundle.putBoolean("showCamera", true);//отображение камеры
intent.addCategory(getPackageName());//вызов окна сканирования в демо-приложении
startActivityForResult(intent, REQUEST_CODE);
//Оба способа дают одинаковый результат. Однако при выборе изображения изображение профиля временно недоступно.
Результат распознавания
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE && resultCode == RESULT_OK){
String result = data.getStringExtra("OCRResult");
try {
JSONObject jo = new JSONObject(result);
StringBuffer sb = new StringBuffer();
sb.append(String.format("Лицевая сторона = %s\n", jo.opt("type")));
sb.append(String.format("Имя = %s\n", jo.opt("name")));
sb.append(String.format("Пол = %s\n", jo.opt("sex")));
sb.append(String.format("Национальность = %s\n", jo.opt("folk")));
sb.append(String.format("Дата рождения = %s\n", jo.opt("birt")));
sb.append(String.format("Номер = %s\n", jo.opt("num")));
sb.append(String.format("Адрес = %s\n", jo.opt("addr")));
sb.append(String.format("Орган выдачи = %s\n", jo.opt("issue")));
sb.append(String.format("Срок действия = %s\n", jo.opt("valid")));
sb.append(String.format("Общее фото = %s\n", jo.opt("imgPath")));
sb.append(String.format("Путь к изображению профиля = %s\n", jo.opt("headPath")));
sb.append("\nПоля, относящиеся к водительским правам\n");
sb.append(String.format("Страна = %s\n", jo.opt("nation")));
sb.append(String.format("Начальная дата регистрации = %s\n", jo.opt("startTime")));
sb.append(String.format("Тип транспортного средства = %s\n", jo.opt("drivingType")));
sb.append(String.format("Срок действия регистрации = %s\n", jo.opt("registerDate")));
binding.textview.setText(sb.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Интеграция aar
Скопируйте файл aar в каталог libs, затем добавьте в build.gradle следующее:
android{
repositories {
flatDir {
dirs 'libs'
}
}
manifestPlaceholders = [
//debug.keystore генерируется, для официального пакета необходимо создать новый.
"OCR_API_KEY" : "26f1f6a0d4d7cb0dd0e9b28f4cedef83"
]
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'x86'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation (name: 'library-ocr-1.0.4-SNAPSHOT', ext: 'aar')
//Для использования OCR aar пакета требуется зависимость от другого модуля
implementation 'com.squareup.picasso:picasso:2.4.0'
implementation(name: 'library-multi-image-selector-1.0.5-SNAPSHOT', ext: 'aar')
Если текущий интерфейс сканирования не может удовлетворить требованиям, вы можете самостоятельно разработать интерфейс предварительного просмотра камеры и использовать следующий API для распознавания.
//1. Инициализация в приложении
LibraryInitOCR.initOCR(context);
//2. Инициализация декодера
/**
* Инициализирует декодер. Если необходимо сохранить изображение, необходимо запросить разрешение на чтение и запись SD-карты у системы.
* @param context Activity
* @param handler Используется для получения сообщений о декодировании
* @param isSaveImage Требуется ли сохранять изображение
*/
public static void initDecode(Context context, Handler handler, boolean isSaveImage)
//3. Начало декодирования
/**
* Начинает декодирование. Передаёт данные предварительного просмотра с камеры сюда, onPreviewFrame(byte[] data, Camera camera).
* @param rect Объект рамки предварительного просмотра
* @param previewWidth Ширина предварительного просмотра интерфейса
* @param previewHeight Высота предварительного просмотра интерфейса
* @param data Данные предварительного просмотра с камеры
*/
public static void decode(Rect rect, int previewWidth, int previewHeight, byte[] data)
/**
* Распознаёт выбранное изображение удостоверения личности (обратите внимание, что разрешение на чтение и запись должно быть запрошено заранее).
* @param filePath Путь к файлу
*/
public static void decode(String filePath)
//4. Освобождение ресурсов в Activity onDestroy
/**
* Освобождает ресурсы
*/
public static void closeDecode()
// Декодирование результатов через обработчик
switch (msg.what){
//Декодирование успешно
case LibraryInitOCR.DECODE_SUCCESS: {
Intent intent = (Intent) msg.obj;
String result = intent.getStringExtra("OCRResult");
String headImg = intent.getStringExtra("headImg");
String fullImg = intent.getStringExtra("fullImg");
break;
}
// Декодирование не удалось
case LibraryInitOCR.DECODE_FAIL:{
break;
}
// Нет разрешения
case LibraryInitOCR.DECODE_UNAUTHORIZED:{
break;
}
// Предложение перефокусироваться
case LibraryInitOCR.DECODE_AUTO_FOCUS:{
break;
}
}
#Исключение методов локального распознавания удостоверений личности
-keep class com.ym.idcard.reg.** {*;}
-keep class com.ym.ocr.img.** {*;}
-keep class hotcard.doc.reader.** {*;}
-keep class com.msd.ocr.idcard.LibraryInitOCR {*;}
-keepclassmembers class * {
native <methods>;
}
-keepclasseswithmembernames class * {
native <methods>;
}
Для сканирования с помощью компьютера скорость распознавания будет ниже, рекомендуется использовать оригинальные документы для тестирования.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )