├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── android_projects ├── OcrLiteAndroidMNN │ ├── .gitignore │ ├── OcrLibrary │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── benjaminwan │ │ │ │ └── ocrlibrary │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ ├── angle_net.mnn │ │ │ │ ├── crnn_lite_lstm.mnn │ │ │ │ ├── dbnet.mnn │ │ │ │ └── keys.txt │ │ │ ├── cpp │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── include │ │ │ │ │ ├── AngleNet.h │ │ │ │ │ ├── BitmapUtils.h │ │ │ │ │ ├── CrnnNet.h │ │ │ │ │ ├── DbNet.h │ │ │ │ │ ├── OcrLite.h │ │ │ │ │ ├── OcrResultUtils.h │ │ │ │ │ ├── OcrStruct.h │ │ │ │ │ ├── OcrUtils.h │ │ │ │ │ └── clipper.hpp │ │ │ │ └── src │ │ │ │ │ ├── AngleNet.cpp │ │ │ │ │ ├── BitmapUtils.cpp │ │ │ │ │ ├── CrnnNet.cpp │ │ │ │ │ ├── DbNet.cpp │ │ │ │ │ ├── OcrLite.cpp │ │ │ │ │ ├── OcrResultUtils.cpp │ │ │ │ │ ├── OcrUtils.cpp │ │ │ │ │ ├── clipper.cpp │ │ │ │ │ └── main.cpp │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── benjaminwan │ │ │ │ └── ocrlibrary │ │ │ │ ├── OcrEngine.kt │ │ │ │ └── OcrResult.kt │ │ │ ├── mnn │ │ │ ├── MNNConfig.cmake │ │ │ └── include │ │ │ │ ├── AutoTime.hpp │ │ │ │ ├── ErrorCode.hpp │ │ │ │ ├── HalideRuntime.h │ │ │ │ ├── ImageProcess.hpp │ │ │ │ ├── Interpreter.hpp │ │ │ │ ├── MNNDefine.h │ │ │ │ ├── MNNForwardType.h │ │ │ │ ├── Matrix.h │ │ │ │ ├── Rect.h │ │ │ │ └── Tensor.hpp │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── benjaminwan │ │ │ └── ocrlibrary │ │ │ └── ExampleUnitTest.kt │ ├── README.md │ ├── app │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── benjaminwan │ │ │ │ └── ocr │ │ │ │ └── onnx │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── benjaminwan │ │ │ │ │ └── ocr │ │ │ │ │ └── onnx │ │ │ │ │ ├── GalleryActivity.kt │ │ │ │ │ ├── app │ │ │ │ │ └── App.kt │ │ │ │ │ ├── dialog │ │ │ │ │ ├── BaseDialog.kt │ │ │ │ │ ├── DebugDialog.kt │ │ │ │ │ └── TextResultDialog.kt │ │ │ │ │ ├── models │ │ │ │ │ ├── DbNetTimeItemView.kt │ │ │ │ │ ├── DebugItemView.kt │ │ │ │ │ └── IdCardFront.kt │ │ │ │ │ └── utils │ │ │ │ │ ├── BitmapUtils.kt │ │ │ │ │ ├── ClipboardUtils.kt │ │ │ │ │ ├── DecimalFormatUtils.kt │ │ │ │ │ ├── IdCardMatchUtils.kt │ │ │ │ │ ├── ImeiMatchUtils.kt │ │ │ │ │ ├── PlateMatchUtils.kt │ │ │ │ │ ├── RecyclerViewUtils.kt │ │ │ │ │ ├── SoftInputUtils.kt │ │ │ │ │ └── ToastUtils.kt │ │ │ └── res │ │ │ │ ├── anim │ │ │ │ ├── window_close_down.xml │ │ │ │ ├── window_close_up.xml │ │ │ │ ├── window_enter_anim.xml │ │ │ │ ├── window_exit_anim.xml │ │ │ │ ├── window_fade_in.xml │ │ │ │ ├── window_fade_out.xml │ │ │ │ ├── window_show_down.xml │ │ │ │ └── window_show_up.xml │ │ │ │ ├── color │ │ │ │ ├── btn_blue3_to_blue5.xml │ │ │ │ ├── btn_blue5_to_blue7.xml │ │ │ │ ├── btn_grey3_to_grey5.xml │ │ │ │ ├── btn_grey5_to_grey7.xml │ │ │ │ ├── btn_pink5_to_pink7.xml │ │ │ │ └── btn_white_to_grey.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── bg_blue3_to_blue5.xml │ │ │ │ ├── bg_blue5_to_blue7.xml │ │ │ │ ├── bg_edittext.xml │ │ │ │ ├── bg_edittext_focused.xml │ │ │ │ ├── bg_edittext_normal.xml │ │ │ │ ├── bg_transparent_to_transparent_half.xml │ │ │ │ ├── ic_close.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_loading.xml │ │ │ │ ├── ic_ocr.xml │ │ │ │ └── loading_anim.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_gallery.xml │ │ │ │ ├── dialog_debug.xml │ │ │ │ ├── dialog_text_result.xml │ │ │ │ ├── rv_dbnet_time_item.xml │ │ │ │ ├── rv_debug_item_content.xml │ │ │ │ └── rv_debug_view_item.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── colors_material.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── benjaminwan │ │ │ └── ocr │ │ │ └── onnx │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── common-aar │ │ └── IdCardView-1.0.aar │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── keystore │ │ └── ocrlite.keystore │ ├── scripts │ │ ├── build-onnxruntime-android.sh │ │ └── build-opencv3-static-android.sh │ └── settings.gradle ├── OcrLiteAndroidNcnn │ ├── .gitignore │ ├── OcrLibrary │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── benjaminwan │ │ │ │ └── ocrlibrary │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ └── keys.txt │ │ │ ├── cpp │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── include │ │ │ │ │ ├── AngleNet.h │ │ │ │ │ ├── BitmapUtils.h │ │ │ │ │ ├── CrnnNet.h │ │ │ │ │ ├── DbNet.h │ │ │ │ │ ├── OcrLite.h │ │ │ │ │ ├── OcrResultUtils.h │ │ │ │ │ ├── OcrStruct.h │ │ │ │ │ ├── OcrUtils.h │ │ │ │ │ └── clipper.hpp │ │ │ │ └── src │ │ │ │ │ ├── AngleNet.cpp │ │ │ │ │ ├── BitmapUtils.cpp │ │ │ │ │ ├── CrnnNet.cpp │ │ │ │ │ ├── DbNet.cpp │ │ │ │ │ ├── OcrLite.cpp │ │ │ │ │ ├── OcrResultUtils.cpp │ │ │ │ │ ├── OcrUtils.cpp │ │ │ │ │ ├── clipper.cpp │ │ │ │ │ └── main.cpp │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── benjaminwan │ │ │ │ └── ocrlibrary │ │ │ │ ├── OcrEngine.kt │ │ │ │ └── OcrResult.kt │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── benjaminwan │ │ │ └── ocrlibrary │ │ │ └── ExampleUnitTest.kt │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── benjaminwan │ │ │ │ └── ocr │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── benjaminwan │ │ │ │ │ └── ocr │ │ │ │ │ └── ncnn │ │ │ │ │ ├── CameraActivity.kt │ │ │ │ │ ├── GalleryActivity.kt │ │ │ │ │ ├── IdCardFrontActivity.kt │ │ │ │ │ ├── ImeiActivity.kt │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── PlateActivity.kt │ │ │ │ │ ├── app │ │ │ │ │ └── App.kt │ │ │ │ │ ├── dialog │ │ │ │ │ ├── BaseDialog.kt │ │ │ │ │ ├── DebugDialog.kt │ │ │ │ │ └── TextResultDialog.kt │ │ │ │ │ ├── models │ │ │ │ │ ├── DbNetTimeItemView.kt │ │ │ │ │ ├── DebugItemView.kt │ │ │ │ │ └── IdCardFront.kt │ │ │ │ │ └── utils │ │ │ │ │ ├── BitmapUtils.kt │ │ │ │ │ ├── ClipboardUtils.kt │ │ │ │ │ ├── DecimalFormatUtils.kt │ │ │ │ │ ├── IdCardMatchUtils.kt │ │ │ │ │ ├── ImeiMatchUtils.kt │ │ │ │ │ ├── PlateMatchUtils.kt │ │ │ │ │ ├── RecyclerViewUtils.kt │ │ │ │ │ ├── SoftInputUtils.kt │ │ │ │ │ └── ToastUtils.kt │ │ │ └── res │ │ │ │ ├── anim │ │ │ │ ├── window_close_down.xml │ │ │ │ ├── window_close_up.xml │ │ │ │ ├── window_enter_anim.xml │ │ │ │ ├── window_exit_anim.xml │ │ │ │ ├── window_fade_in.xml │ │ │ │ ├── window_fade_out.xml │ │ │ │ ├── window_show_down.xml │ │ │ │ └── window_show_up.xml │ │ │ │ ├── color │ │ │ │ ├── btn_blue3_to_blue5.xml │ │ │ │ ├── btn_blue5_to_blue7.xml │ │ │ │ ├── btn_grey3_to_grey5.xml │ │ │ │ ├── btn_grey5_to_grey7.xml │ │ │ │ ├── btn_pink5_to_pink7.xml │ │ │ │ └── btn_white_to_grey.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── bg_blue3_to_blue5.xml │ │ │ │ ├── bg_blue5_to_blue7.xml │ │ │ │ ├── bg_edittext.xml │ │ │ │ ├── bg_edittext_focused.xml │ │ │ │ ├── bg_edittext_normal.xml │ │ │ │ ├── bg_transparent_to_transparent_half.xml │ │ │ │ ├── ic_close.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_loading.xml │ │ │ │ ├── ic_ocr.xml │ │ │ │ └── loading_anim.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_camera.xml │ │ │ │ ├── activity_gallery.xml │ │ │ │ ├── activity_idcard_front.xml │ │ │ │ ├── activity_imei.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── activity_plate.xml │ │ │ │ ├── dialog_debug.xml │ │ │ │ ├── dialog_text_result.xml │ │ │ │ ├── rv_dbnet_time_item.xml │ │ │ │ ├── rv_debug_item_content.xml │ │ │ │ └── rv_debug_view_item.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── colors_material.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── benjaminwan │ │ │ └── ocr │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── capture │ │ ├── detect_IMEI.gif │ │ ├── detect_id_card.gif │ │ └── detect_plate.gif │ ├── common-aar │ │ └── IdCardView-1.0.aar │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── keystore │ │ └── ocrlite.keystore │ ├── scripts │ │ ├── build-opencv3-android.sh │ │ ├── build-opencv3-static-android.sh │ │ └── patch-opencv3-source.sh │ └── settings.gradle ├── OcrLiteAndroidOnnx │ ├── .gitignore │ ├── OcrLibrary │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── benjaminwan │ │ │ │ └── ocrlibrary │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ └── keys.txt │ │ │ ├── cpp │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── include │ │ │ │ │ ├── AngleNet.h │ │ │ │ │ ├── BitmapUtils.h │ │ │ │ │ ├── CrnnNet.h │ │ │ │ │ ├── DbNet.h │ │ │ │ │ ├── OcrLite.h │ │ │ │ │ ├── OcrResultUtils.h │ │ │ │ │ ├── OcrStruct.h │ │ │ │ │ ├── OcrUtils.h │ │ │ │ │ └── clipper.hpp │ │ │ │ └── src │ │ │ │ │ ├── AngleNet.cpp │ │ │ │ │ ├── BitmapUtils.cpp │ │ │ │ │ ├── CrnnNet.cpp │ │ │ │ │ ├── DbNet.cpp │ │ │ │ │ ├── OcrLite.cpp │ │ │ │ │ ├── OcrResultUtils.cpp │ │ │ │ │ ├── OcrUtils.cpp │ │ │ │ │ ├── clipper.cpp │ │ │ │ │ └── main.cpp │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── benjaminwan │ │ │ │ └── ocrlibrary │ │ │ │ ├── OcrEngine.kt │ │ │ │ └── OcrResult.kt │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── benjaminwan │ │ │ └── ocrlibrary │ │ │ └── ExampleUnitTest.kt │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── benjaminwan │ │ │ │ └── ocr │ │ │ │ └── onnx │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── benjaminwan │ │ │ │ │ └── ocr │ │ │ │ │ └── onnx │ │ │ │ │ ├── CameraActivity.kt │ │ │ │ │ ├── GalleryActivity.kt │ │ │ │ │ ├── IdCardFrontActivity.kt │ │ │ │ │ ├── ImeiActivity.kt │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── PlateActivity.kt │ │ │ │ │ ├── app │ │ │ │ │ └── App.kt │ │ │ │ │ ├── dialog │ │ │ │ │ ├── BaseDialog.kt │ │ │ │ │ ├── DebugDialog.kt │ │ │ │ │ └── TextResultDialog.kt │ │ │ │ │ ├── models │ │ │ │ │ ├── DbNetTimeItemView.kt │ │ │ │ │ ├── DebugItemView.kt │ │ │ │ │ └── IdCardFront.kt │ │ │ │ │ └── utils │ │ │ │ │ ├── BitmapUtils.kt │ │ │ │ │ ├── ClipboardUtils.kt │ │ │ │ │ ├── DecimalFormatUtils.kt │ │ │ │ │ ├── IdCardMatchUtils.kt │ │ │ │ │ ├── ImeiMatchUtils.kt │ │ │ │ │ ├── PlateMatchUtils.kt │ │ │ │ │ ├── RecyclerViewUtils.kt │ │ │ │ │ ├── SoftInputUtils.kt │ │ │ │ │ └── ToastUtils.kt │ │ │ └── res │ │ │ │ ├── anim │ │ │ │ ├── window_close_down.xml │ │ │ │ ├── window_close_up.xml │ │ │ │ ├── window_enter_anim.xml │ │ │ │ ├── window_exit_anim.xml │ │ │ │ ├── window_fade_in.xml │ │ │ │ ├── window_fade_out.xml │ │ │ │ ├── window_show_down.xml │ │ │ │ └── window_show_up.xml │ │ │ │ ├── color │ │ │ │ ├── btn_blue3_to_blue5.xml │ │ │ │ ├── btn_blue5_to_blue7.xml │ │ │ │ ├── btn_grey3_to_grey5.xml │ │ │ │ ├── btn_grey5_to_grey7.xml │ │ │ │ ├── btn_pink5_to_pink7.xml │ │ │ │ └── btn_white_to_grey.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── bg_blue3_to_blue5.xml │ │ │ │ ├── bg_blue5_to_blue7.xml │ │ │ │ ├── bg_edittext.xml │ │ │ │ ├── bg_edittext_focused.xml │ │ │ │ ├── bg_edittext_normal.xml │ │ │ │ ├── bg_transparent_to_transparent_half.xml │ │ │ │ ├── ic_close.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_loading.xml │ │ │ │ ├── ic_ocr.xml │ │ │ │ └── loading_anim.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_camera.xml │ │ │ │ ├── activity_gallery.xml │ │ │ │ ├── activity_idcard_front.xml │ │ │ │ ├── activity_imei.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── activity_plate.xml │ │ │ │ ├── dialog_debug.xml │ │ │ │ ├── dialog_text_result.xml │ │ │ │ ├── rv_dbnet_time_item.xml │ │ │ │ ├── rv_debug_item_content.xml │ │ │ │ └── rv_debug_view_item.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── colors_material.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── benjaminwan │ │ │ └── ocr │ │ │ └── onnx │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── capture │ │ ├── detect_IMEI.gif │ │ ├── detect_id_card.gif │ │ └── detect_plate.gif │ ├── common-aar │ │ └── IdCardView-1.0.aar │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── keystore │ │ └── ocrlite.keystore │ ├── scripts │ │ ├── build-onnxruntime-android.sh │ │ ├── build-opencv3-android.sh │ │ └── build-opencv3-static-android.sh │ └── settings.gradle ├── README.md └── test_resource │ ├── 随机IMEI.xlsx │ └── 随机车牌.xlsx ├── angnet ├── __init__.py └── angle.py ├── backend ├── __init__.py ├── dist │ └── chineseocr_lite_fontend │ │ ├── css │ │ ├── app.77d50329.css │ │ └── chunk-vendors.9d96bc97.css │ │ ├── favicon.ico │ │ ├── index.html │ │ └── js │ │ ├── app.7dd3e457.js │ │ ├── app.7dd3e457.js.map │ │ ├── chunk-vendors.ae13d15d.js │ │ └── chunk-vendors.ae13d15d.js.map ├── main.py ├── np_encoder.py ├── tools │ ├── __init__.py │ ├── get_host_ip.py │ ├── log.py │ └── np_encoder.py ├── webInterface │ ├── __init__.py │ ├── tr_index.py │ └── tr_run.py └── 仿宋_GB2312.ttf ├── config.py ├── cpp_projects ├── OcrLiteMnn │ ├── CMakeLists.txt │ ├── README.md │ ├── benchmark │ │ └── benchmark.cpp │ ├── build.bat │ ├── build.sh │ ├── generate-vs-project.bat │ ├── include │ │ ├── AngleNet.h │ │ ├── CrnnNet.h │ │ ├── DbNet.h │ │ ├── OcrLite.h │ │ ├── OcrResultUtils.h │ │ ├── OcrStruct.h │ │ ├── OcrUtils.h │ │ ├── clipper.hpp │ │ ├── getopt.h │ │ ├── main.h │ │ └── version.h │ ├── models │ │ └── keys.txt │ ├── run-benchmark.bat │ ├── run-benchmark.sh │ ├── run-test.bat │ ├── run-test.sh │ ├── src │ │ ├── AngleNet.cpp │ │ ├── CrnnNet.cpp │ │ ├── DbNet.cpp │ │ ├── OcrLite.cpp │ │ ├── OcrLiteJni.cpp │ │ ├── OcrResultUtils.cpp │ │ ├── OcrUtils.cpp │ │ ├── clipper.cpp │ │ ├── getopt.cpp │ │ └── main.cpp │ ├── valgrind-memcheck.sh │ └── valgrind-memcheck.txt ├── OcrLiteNcnn │ ├── .gitignore │ ├── BUILD.md │ ├── CMakeLists.txt │ ├── README.md │ ├── benchmark │ │ └── benchmark.cpp │ ├── build-default.bat │ ├── build-default.sh │ ├── build.bat │ ├── build.sh │ ├── generate-vs-project.bat │ ├── images │ │ ├── 1.jpg │ │ ├── clear.cmd │ │ └── clear.sh │ ├── include │ │ ├── AngleNet.h │ │ ├── CrnnNet.h │ │ ├── DbNet.h │ │ ├── OcrLite.h │ │ ├── OcrLiteCaller.h │ │ ├── OcrLitePort.h │ │ ├── OcrResultUtils.h │ │ ├── OcrStruct.h │ │ ├── OcrUtils.h │ │ ├── clipper.hpp │ │ ├── getopt.h │ │ ├── main.h │ │ └── version.h │ ├── models │ │ └── keys.txt │ ├── ncnn-static │ │ └── NcnnWrapperConfig.cmake │ ├── ncnn-vulkan-static │ │ └── NcnnWrapperConfig.cmake │ ├── opencv-static │ │ └── OpenCVWrapperConfig.cmake │ ├── run-benchmark.bat │ ├── run-benchmark.sh │ ├── run-test.bat │ ├── run-test.sh │ ├── scripts │ │ ├── build-ncnn-nmake.bat │ │ ├── build-ncnn.sh │ │ └── install-vulkan-linux.sh │ ├── src │ │ ├── AngleNet.cpp │ │ ├── CrnnNet.cpp │ │ ├── DbNet.cpp │ │ ├── OcrLite.cpp │ │ ├── OcrLiteCaller.cpp │ │ ├── OcrLiteJni.cpp │ │ ├── OcrResultUtils.cpp │ │ ├── OcrUtils.cpp │ │ ├── clipper.cpp │ │ ├── getopt.cpp │ │ └── main.cpp │ ├── valgrind-memcheck.sh │ └── valgrind-memcheck.txt ├── OcrLiteOnnx │ ├── .gitignore │ ├── BUILD.md │ ├── CMakeLists.txt │ ├── README.md │ ├── benchmark │ │ └── benchmark.cpp │ ├── build-default.bat │ ├── build-default.sh │ ├── build.bat │ ├── build.sh │ ├── generate-vs-project.bat │ ├── images │ │ ├── 1.jpg │ │ ├── clear.cmd │ │ └── clear.sh │ ├── include │ │ ├── AngleNet.h │ │ ├── CrnnNet.h │ │ ├── DbNet.h │ │ ├── OcrLite.h │ │ ├── OcrLiteCaller.h │ │ ├── OcrLitePort.h │ │ ├── OcrResultUtils.h │ │ ├── OcrStruct.h │ │ ├── OcrUtils.h │ │ ├── clipper.hpp │ │ ├── getopt.h │ │ ├── main.h │ │ └── version.h │ ├── models │ │ └── keys.txt │ ├── onnxruntime-static │ │ └── OnnxRuntimeWrapper.cmake │ ├── opencv-static │ │ └── OpenCVWrapperConfig.cmake │ ├── run-benchmark.bat │ ├── run-benchmark.sh │ ├── run-test.bat │ ├── run-test.sh │ ├── scripts │ │ ├── build-onnxruntime.bat │ │ ├── build-onnxruntime.sh │ │ ├── build-opencv3-nmake.bat │ │ ├── build-opencv3-vs.bat │ │ └── build-opencv3.sh │ ├── src │ │ ├── AngleNet.cpp │ │ ├── CrnnNet.cpp │ │ ├── DbNet.cpp │ │ ├── OcrLite.cpp │ │ ├── OcrLiteCaller.cpp │ │ ├── OcrLiteJni.cpp │ │ ├── OcrResultUtils.cpp │ │ ├── OcrUtils.cpp │ │ ├── clipper.cpp │ │ ├── getopt.cpp │ │ └── main.cpp │ ├── valgrind-massif.sh │ ├── valgrind-memcheck.sh │ └── valgrind-memcheck.txt ├── README.md └── images │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ ├── clear.cmd │ ├── clear.sh │ └── mostAngle.jpg ├── crnn ├── CRNN.py ├── __init__.py ├── keys.py └── util.py ├── dbnet ├── .DS_Store ├── dbnet_infer.py ├── decode.py └── test.jpg ├── dotnet_projects ├── OcrLiteOnnxCs │ ├── .gitignore │ ├── OcrLiteLib │ │ ├── AngleNet.cs │ │ ├── CrnnNet.cs │ │ ├── DbNet.cs │ │ ├── OcrLite.cs │ │ ├── OcrLiteLib.csproj │ │ ├── OcrResult.cs │ │ ├── OcrUtils.cs │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ ├── ScaleParam.cs │ │ └── packages.config │ ├── OcrLiteOnnxCs.sln │ ├── OcrLiteOnnxForm │ │ ├── App.config │ │ ├── FormOcrLite.Designer.cs │ │ ├── FormOcrLite.cs │ │ ├── OcrLiteOnnxForm.csproj │ │ ├── Program.cs │ │ ├── Properties │ │ │ ├── AssemblyInfo.cs │ │ │ ├── Resources.Designer.cs │ │ │ ├── Resources.resx │ │ │ ├── Settings.Designer.cs │ │ │ └── Settings.settings │ │ └── packages.config │ └── README.md ├── OcrLiteOnnxVB │ ├── .gitignore │ ├── OcrLiteLib │ │ ├── AngleNet.vb │ │ ├── CrnnNet.vb │ │ ├── DbNet.vb │ │ ├── My Project │ │ │ ├── Application.Designer.vb │ │ │ ├── Application.myapp │ │ │ ├── AssemblyInfo.vb │ │ │ ├── Resources.Designer.vb │ │ │ ├── Resources.resx │ │ │ ├── Settings.Designer.vb │ │ │ └── Settings.settings │ │ ├── OcrLite.vb │ │ ├── OcrLiteLib.vbproj │ │ ├── OcrResult.vb │ │ ├── OcrUtils.vb │ │ ├── ScaleParam.vb │ │ └── packages.config │ ├── OcrLiteOnnxForm │ │ ├── App.config │ │ ├── FormOcrLite.Designer.vb │ │ ├── FormOcrLite.resx │ │ ├── FormOcrLite.vb │ │ ├── My Project │ │ │ ├── Application.Designer.vb │ │ │ ├── Application.myapp │ │ │ ├── AssemblyInfo.vb │ │ │ ├── Resources.Designer.vb │ │ │ ├── Resources.resx │ │ │ ├── Settings.Designer.vb │ │ │ └── Settings.settings │ │ ├── OcrLiteOnnxForm.vbproj │ │ └── packages.config │ ├── OcrLiteOnnxVB.sln │ └── README.md └── README.md ├── jvm_projects ├── OcrLiteNcnnJvm │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── run-test │ │ ├── models │ │ │ └── keys.txt │ │ ├── test_imgs │ │ │ ├── 1.jpg │ │ │ ├── clear.cmd │ │ │ └── clear.sh │ │ └── valgrind-memcheck-java.sh │ ├── settings.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── benjaminwan │ │ │ ├── ocr │ │ │ ├── Main.java │ │ │ └── main.kt │ │ │ └── ocrlibrary │ │ │ ├── OcrEngine.kt │ │ │ └── OcrResult.kt │ │ └── resources │ │ └── META-INF │ │ └── MANIFEST.MF ├── OcrLiteOnnxJvm │ ├── .gitignore │ ├── README.md │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── run-test │ │ ├── models │ │ │ └── keys.txt │ │ ├── test_imgs │ │ │ ├── 1.jpg │ │ │ ├── clear.cmd │ │ │ └── clear.sh │ │ └── valgrind-memcheck-java.sh │ ├── settings.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── benjaminwan │ │ │ ├── ocr │ │ │ ├── Main.java │ │ │ └── main.kt │ │ │ └── ocrlibrary │ │ │ ├── OcrEngine.kt │ │ │ └── OcrResult.kt │ │ └── resources │ │ └── META-INF │ │ └── MANIFEST.MF └── README.md ├── model.py ├── models ├── angle_net.onnx ├── crnn_lite_lstm.onnx └── dbnet.onnx ├── models_ncnn ├── angle_op.bin ├── angle_op.param ├── crnn_lite_op.bin ├── crnn_lite_op.param ├── dbnet_op.bin └── dbnet_op.param ├── requirements.txt ├── test_imgs ├── android │ ├── detect_IMEI.gif │ ├── detect_id_card.gif │ └── detect_plate.gif ├── dotnet │ └── OcrLiteOnnxCs.PNG ├── o2-word.jpg ├── res.jpg ├── res_2.jpg └── third_party │ ├── tnn_detect_camera.gif │ ├── tnn_detect_poster1.png │ └── tnn_detect_poster2.png ├── utils.py └── 仿宋_GB2312.ttf /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos:7.2.1511 2 | 3 | LABEL Author="Pad0y" 4 | 5 | ENV LANG C.UTF-8 LC_ALL=C.UTF-8 6 | 7 | COPY . /data/project/ 8 | WORKDIR /data/project/ 9 | 10 | RUN yum -y update \ 11 | && yum -y install gcc gcc-c++ wget make git libSM-1.2.2-2.el7.x86_64 libXrender libXext\ 12 | && yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel \ 13 | && yum -y install python3-devel centos-release-scl scl-utils-build \ 14 | && yum -y install devtoolset-7-gcc* \ 15 | && echo 'source /opt/rh/devtoolset-7/enable' >> ~/.bash_profile \ 16 | && source ~/.bash_profile \ 17 | && scl enable devtoolset-7 bash 18 | 19 | 20 | RUN pip3 install --user -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple/ \ 21 | && pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 22 | 23 | 24 | RUN source ~/.bash_profile && pip3 install -r requirements.txt 25 | 26 | EXPOSE 5000 27 | EXPOSE 8000 28 | 29 | CMD python3 backend/main.py -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /.gradle 3 | app/build 4 | /OcrLibrary/build 5 | /OcrLibrary/.cxx 6 | /OcrLibrary/src/sdk -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/OcrLibrary/consumer-rules.pro -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/androidTest/java/com/benjaminwan/ocrlibrary/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocrlibrary 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.benjaminwan.ocrlibrary.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | / 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/assets/angle_net.mnn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/assets/angle_net.mnn -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/assets/crnn_lite_lstm.mnn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/assets/crnn_lite_lstm.mnn -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/assets/dbnet.mnn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/assets/dbnet.mnn -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/cpp/include/AngleNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_ANGLENET_H__ 2 | #define __OCR_ANGLENET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | 8 | class AngleNet { 9 | public: 10 | AngleNet(); 11 | 12 | ~AngleNet(); 13 | 14 | void setNumThread(int numOfThread); 15 | 16 | bool initModel(const char* angelpath); 17 | 18 | std::vector getAngles(std::vector &partImgs, bool doAngle, bool mostAngle); 19 | 20 | private: 21 | std::shared_ptr net; 22 | MNN::Session* session; 23 | int numThread = 4; 24 | 25 | const float meanValues[3] = {127.5, 127.5, 127.5}; 26 | const float normValues[3] = {1.0 / 127.5, 1.0 / 127.5, 1.0 / 127.5}; 27 | const int angleCols = 2; 28 | const int dstWidth = 192; 29 | const int dstHeight = 32; 30 | 31 | Angle getAngle(cv::Mat &src); 32 | }; 33 | 34 | 35 | #endif //__OCR_ANGLENET_H__ 36 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/cpp/include/BitmapUtils.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_LITE_BITMAP_UTILS_H__ 2 | #define __OCR_LITE_BITMAP_UTILS_H__ 3 | 4 | #include 5 | #include "opencv2/core.hpp" 6 | #include "opencv2/imgproc.hpp" 7 | 8 | void bitmapToMat(JNIEnv *env, jobject bitmap, cv::Mat &dst); 9 | 10 | void matToBitmap(JNIEnv *env, cv::Mat &src, jobject bitmap); 11 | 12 | 13 | #endif //__OCR_LITE_BITMAP_UTILS_H__ 14 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/cpp/include/CrnnNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_CRNNNET_H__ 2 | #define __OCR_CRNNNET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | class CrnnNet { 11 | public: 12 | 13 | CrnnNet(); 14 | 15 | ~CrnnNet(); 16 | 17 | void setNumThread(int numOfThread); 18 | 19 | bool initModel(AAssetManager *mgr,const char* crnnpath); 20 | 21 | std::vector getTextLines(std::vector &partImg); 22 | 23 | private: 24 | std::shared_ptr net; 25 | MNN::Session* session; 26 | int numThread = 4; 27 | 28 | const float meanValues[3] = {127.5, 127.5, 127.5}; 29 | const float normValues[3] = {1.0 / 127.5, 1.0 / 127.5, 1.0 / 127.5}; 30 | const int dstHeight = 32; 31 | const int crnnCols = 5531; 32 | 33 | std::vector keys; 34 | 35 | TextLine scoreToTextLine(const float *srcData, int h, int w); 36 | 37 | TextLine getTextLine(cv::Mat &src); 38 | }; 39 | 40 | 41 | #endif //__OCR_CRNNNET_H__ 42 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/cpp/include/DbNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_DBNET_H__ 2 | #define __OCR_DBNET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | 8 | class DbNet { 9 | public: 10 | DbNet(); 11 | 12 | ~DbNet(); 13 | 14 | void setNumThread(int numOfThread); 15 | 16 | bool initModel(const char* dbnetpath); 17 | 18 | std::vector getTextBoxes(cv::Mat &src, ScaleParam &s, float boxScoreThresh, 19 | float boxThresh, float unClipRatio); 20 | 21 | private: 22 | std::shared_ptr net; 23 | MNN::Session* session; 24 | int numThread = 4; 25 | 26 | const float meanValues[3] = {0.485 * 255, 0.456 * 255, 0.406 * 255}; 27 | const float normValues[3] = {1.0 / 0.229 / 255.0, 1.0 / 0.224 / 255.0, 1.0 / 0.225 / 255.0}; 28 | }; 29 | 30 | 31 | #endif //__OCR_DBNET_H__ 32 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/cpp/include/OcrLite.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_LITE_H__ 2 | #define __OCR_LITE_H__ 3 | 4 | #include "opencv2/core.hpp" 5 | #include "OcrStruct.h" 6 | #include "DbNet.h" 7 | #include "AngleNet.h" 8 | #include "CrnnNet.h" 9 | 10 | class OcrLite { 11 | public: 12 | OcrLite(); 13 | 14 | ~OcrLite(); 15 | 16 | void init(JNIEnv *jniEnv, jobject assetManager, int numOfThread,jstring dbnetmodelPath ,jstring angelmodelPath, jstring crnnmodelPath); 17 | 18 | //void initLogger(bool isDebug); 19 | 20 | //void Logger(const char *format, ...); 21 | 22 | OcrResult detect(cv::Mat &src, cv::Rect &originRect, ScaleParam &scale, 23 | float boxScoreThresh, float boxThresh, 24 | float unClipRatio, bool doAngle, bool mostAngle); 25 | 26 | private: 27 | bool isLOG = true; 28 | DbNet dbNet; 29 | AngleNet angleNet; 30 | CrnnNet crnnNet; 31 | }; 32 | 33 | 34 | #endif -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/cpp/include/OcrResultUtils.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_RESULT_UTILS_H__ 2 | #define __OCR_RESULT_UTILS_H__ 3 | 4 | #include 5 | #include "OcrStruct.h" 6 | 7 | class OcrResultUtils { 8 | public: 9 | OcrResultUtils(JNIEnv *env, OcrResult &ocrResult, jobject boxImg); 10 | 11 | ~OcrResultUtils(); 12 | 13 | jobject getJObject(); 14 | 15 | private: 16 | JNIEnv *jniEnv; 17 | jobject jOcrResult; 18 | 19 | jclass newJListClass(); 20 | 21 | jmethodID getListConstructor(jclass clazz); 22 | 23 | jobject getTextBlock(TextBlock &textBlock); 24 | 25 | jobject getTextBlocks(std::vector &textBlocks); 26 | 27 | jobject newJPoint(cv::Point &point); 28 | 29 | jobject newJBoxPoint(std::vector &boxPoint); 30 | 31 | jfloatArray newJScoreArray(std::vector &scores); 32 | 33 | }; 34 | 35 | 36 | #endif //__OCR_RESULT_UTILS_H__ 37 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/main/cpp/include/OcrStruct.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_STRUCT_H__ 2 | #define __OCR_STRUCT_H__ 3 | 4 | #include "opencv2/core.hpp" 5 | #include 6 | 7 | struct ScaleParam { 8 | int srcWidth; 9 | int srcHeight; 10 | int dstWidth; 11 | int dstHeight; 12 | float ratioWidth; 13 | float ratioHeight; 14 | }; 15 | 16 | struct TextBox { 17 | std::vector boxPoint; 18 | float score; 19 | }; 20 | 21 | struct Angle { 22 | int index; 23 | float score; 24 | double time; 25 | }; 26 | 27 | struct TextLine { 28 | std::string text; 29 | std::vector charScores; 30 | double time; 31 | }; 32 | 33 | struct TextBlock { 34 | std::vector boxPoint; 35 | float boxScore; 36 | int angleIndex; 37 | float angleScore; 38 | double angleTime; 39 | std::string text; 40 | std::vector charScores; 41 | double crnnTime; 42 | double blockTime; 43 | }; 44 | 45 | struct OcrResult { 46 | double dbNetTime; 47 | std::vector textBlocks; 48 | cv::Mat boxImg; 49 | double detectTime; 50 | std::string strRes; 51 | }; 52 | 53 | #endif //__OCR_STRUCT_H__ 54 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/mnn/MNNConfig.cmake: -------------------------------------------------------------------------------- 1 | set(MNN_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/include") 2 | message("配置MNN include: ${MNN_INCLUDE_DIRS}") 3 | include_directories(${MNN_INCLUDE_DIRS}) 4 | 5 | set(MNN_LIBS libMNNruntime) 6 | add_library(${MNN_LIBS} SHARED IMPORTED) 7 | set_target_properties(${MNN_LIBS} PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../../mnn/${ANDROID_ABI}/libMNN.so) 8 | 9 | set(MNN_FOUND TRUE) -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/mnn/include/AutoTime.hpp: -------------------------------------------------------------------------------- 1 | // 2 | // AutoTime.hpp 3 | // MNN 4 | // 5 | // Created by MNN on 2018/07/27. 6 | // Copyright © 2018, Alibaba Group Holding Limited 7 | // 8 | 9 | #ifndef AutoTime_hpp 10 | #define AutoTime_hpp 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | namespace MNN { 17 | 18 | /** time tracing util. prints duration between init and deinit. */ 19 | class MNN_PUBLIC AutoTime { 20 | public: 21 | AutoTime(int line, const char* func); 22 | ~AutoTime(); 23 | AutoTime(const AutoTime&) = delete; 24 | AutoTime(const AutoTime&&) = delete; 25 | AutoTime& operator=(const AutoTime&) = delete; 26 | AutoTime& operator=(const AutoTime&&) = delete; 27 | 28 | private: 29 | int mLine; 30 | char* mName; 31 | uint64_t mCurrentTime; 32 | }; 33 | } // namespace MNN 34 | 35 | #ifdef MNN_OPEN_TIME_TRACE 36 | #define AUTOTIME MNN::AutoTime ___t(__LINE__, __func__) 37 | #else 38 | #define AUTOTIME 39 | #endif 40 | 41 | #endif /* AutoTime_hpp */ 42 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/mnn/include/ErrorCode.hpp: -------------------------------------------------------------------------------- 1 | // 2 | // ErrorCode.hpp 3 | // MNN 4 | // 5 | // Created by MNN on 2018/09/18. 6 | // Copyright © 2018, Alibaba Group Holding Limited 7 | // 8 | 9 | #ifndef ErrorCode_h 10 | #define ErrorCode_h 11 | 12 | namespace MNN { 13 | enum ErrorCode { 14 | #ifdef NO_ERROR 15 | #undef NO_ERROR 16 | #endif //NO_ERROR 17 | NO_ERROR = 0, 18 | OUT_OF_MEMORY = 1, 19 | NOT_SUPPORT = 2, 20 | COMPUTE_SIZE_ERROR = 3, 21 | NO_EXECUTION = 4, 22 | 23 | // User error 24 | INPUT_DATA_ERROR = 10, 25 | CALL_BACK_STOP = 11, 26 | 27 | // Op Resize Error 28 | TENSOR_NOT_SUPPORT = 20, 29 | TENSOR_NEED_DIVIDE = 21, 30 | }; 31 | } 32 | 33 | #endif /* ErrorCode_h */ 34 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/OcrLibrary/src/test/java/com/benjaminwan/ocrlibrary/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocrlibrary 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/androidTest/java/com/benjaminwan/ocr/onnx/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.benjaminwan.ocr.onnx", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/java/com/benjaminwan/ocr/onnx/models/IdCardFront.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.models 2 | 3 | import android.os.Parcelable 4 | import com.benjaminwan.ocrlibrary.OcrOutput 5 | import kotlinx.android.parcel.Parcelize 6 | 7 | @Parcelize 8 | data class IdCardFront( 9 | val name: String,//姓名 10 | val nation: String,//民族 11 | val address: String,//地址 12 | val number: String,//身份证号 13 | ) : Parcelable, OcrOutput() { 14 | //性别 15 | val gender: String 16 | get() { 17 | val genderNumber = number[16].toInt() 18 | return if (genderNumber % 2 == 1) "男" else "女" 19 | } 20 | 21 | //出生日期 22 | val birth: String 23 | get() { 24 | val year = number.substring(6..9) 25 | val month = number.substring(10..11) 26 | val date = number.substring(12..13) 27 | return "$year-$month-$date" 28 | } 29 | 30 | fun isEmpty(): Boolean = 31 | name.isEmpty() && nation.isEmpty() && address.isEmpty() && number.isEmpty() 32 | 33 | 34 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/java/com/benjaminwan/ocr/onnx/utils/BitmapUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import android.content.Context 4 | import android.graphics.Bitmap 5 | import android.graphics.BitmapFactory 6 | import android.net.Uri 7 | import java.io.FileNotFoundException 8 | 9 | @Throws(FileNotFoundException::class) 10 | fun Context.decodeUri(imgUri: Uri): Bitmap? { 11 | // Decode image size 12 | val options = BitmapFactory.Options() 13 | options.inJustDecodeBounds = false 14 | options.inMutable = true 15 | options.inPreferredConfig = Bitmap.Config.ARGB_8888 16 | return BitmapFactory.decodeStream(contentResolver.openInputStream(imgUri), null, options) 17 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/java/com/benjaminwan/ocr/onnx/utils/ClipboardUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import android.content.ClipData 4 | import android.content.ClipboardManager 5 | import android.content.Context 6 | 7 | fun Context.toClipboard(text: String) { 8 | val clipboardManager = 9 | this.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 10 | // 创建普通字符型ClipData 11 | val mClipData = ClipData.newPlainText(packageName, text) 12 | // 将ClipData内容放到系统剪贴板里。 13 | clipboardManager.setPrimaryClip(mClipData) 14 | this.showToast("已复制到剪切板!") 15 | } 16 | 17 | fun Context.fromClipboard(): String? { 18 | val clipboardManager = 19 | this.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 20 | return if (clipboardManager.hasPrimaryClip()) { 21 | val clipData = clipboardManager.primaryClip 22 | if (clipData != null) { 23 | if (clipData.itemCount > 0) { 24 | clipData.getItemAt(0).text.toString() 25 | } else { 26 | null 27 | } 28 | } else { 29 | null 30 | } 31 | } else { 32 | null 33 | } 34 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/java/com/benjaminwan/ocr/onnx/utils/IdCardMatchUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import com.orhanobut.logger.Logger 4 | import java.util.regex.Matcher 5 | import java.util.regex.Pattern 6 | 7 | const val idCardNumberRegex = 8 | "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}\$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)\$" 9 | 10 | 11 | fun getMatchIdCardNumberStr(text: String): String? { 12 | val matchALL = Regex(idCardNumberRegex).find(text) 13 | if (matchALL != null) { 14 | Logger.i("match结果 matchALL:${matchALL.value}") 15 | return matchALL.value 16 | } 17 | return null 18 | } 19 | 20 | fun String.trimSymbols(): String { 21 | var dest = "" 22 | if (this.isNotEmpty()) { 23 | val p: Pattern = Pattern.compile("\\p{P}|\\p{S}") 24 | val m: Matcher = p.matcher(this) 25 | dest = m.replaceAll("") 26 | } 27 | return dest 28 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/java/com/benjaminwan/ocr/onnx/utils/ImeiMatchUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import com.orhanobut.logger.Logger 4 | import java.util.regex.Matcher 5 | import java.util.regex.Pattern 6 | 7 | const val imeiRegex = "\\d{15}|\\d{17}" 8 | 9 | fun getMatchImeiStr(text: String): String? { 10 | val matchALL = Regex(imeiRegex).find(text) 11 | if (matchALL != null) { 12 | Logger.i("match结果 matchALL:${matchALL.value}") 13 | return matchALL.value 14 | } 15 | return null 16 | } 17 | 18 | fun String.replaceBlank(): String { 19 | var dest = "" 20 | if (this.isNotEmpty()) { 21 | val p: Pattern = Pattern.compile("\\s*|\t|\r|\n") 22 | val m: Matcher = p.matcher(this) 23 | dest = m.replaceAll("") 24 | } 25 | return dest 26 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/java/com/benjaminwan/ocr/onnx/utils/PlateMatchUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import com.orhanobut.logger.Logger 4 | import java.util.regex.Matcher 5 | import java.util.regex.Pattern 6 | 7 | const val plateRegex = "^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))\$" 8 | 9 | fun getMatchPlateStr(text: String): String? { 10 | val matchALL = Regex(plateRegex).find(text) 11 | if (matchALL != null) { 12 | Logger.i("match结果 matchALL:${matchALL.value}") 13 | return matchALL.value 14 | } 15 | return null 16 | } 17 | 18 | fun String.trimBlankAndSymbols(): String { 19 | var dest = "" 20 | if (this.isNotEmpty()) { 21 | val p: Pattern = Pattern.compile("\\p{P}|\\p{S}|\\s*|\t|\r|\n") 22 | val m: Matcher = p.matcher(this) 23 | dest = m.replaceAll("") 24 | } 25 | return dest 26 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/java/com/benjaminwan/ocr/onnx/utils/SoftInputUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import android.content.Context 4 | import android.view.View 5 | import android.view.inputmethod.InputMethodManager 6 | import android.widget.EditText 7 | import androidx.fragment.app.Fragment 8 | 9 | /** 10 | * 显示软建键盘 11 | */ 12 | fun EditText.showSoftInput(){ 13 | requestFocus() 14 | setSelection(text.toString().length)//将光标移至文字末尾 15 | val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 16 | imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) 17 | } 18 | 19 | /** 20 | * 隐藏软键盘 21 | */ 22 | fun Fragment.hideSoftInput() { 23 | val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 24 | imm.hideSoftInputFromWindow(view?.windowToken, 0) 25 | } 26 | 27 | /** 28 | * 动态隐藏软键盘 29 | * 30 | * @param view 视图 31 | */ 32 | fun View.hideSoftInput() { 33 | val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 34 | imm.hideSoftInputFromWindow(windowToken, 0) 35 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/anim/window_close_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/anim/window_close_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/anim/window_enter_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/anim/window_exit_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/anim/window_fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/anim/window_fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/anim/window_show_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/anim/window_show_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/color/btn_blue3_to_blue5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/color/btn_blue5_to_blue7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/color/btn_grey3_to_grey5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/color/btn_grey5_to_grey7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/color/btn_pink5_to_pink7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/color/btn_white_to_grey.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/drawable/bg_blue3_to_blue5.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 18 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/drawable/bg_blue5_to_blue7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 13 | 17 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/drawable/bg_edittext.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/drawable/bg_edittext_focused.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/drawable/bg_edittext_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/drawable/bg_transparent_to_transparent_half.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/drawable/ic_loading.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/drawable/loading_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/layout/rv_dbnet_time_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #6200EE 4 | #3700B3 5 | #03DAC5 6 | #10000000 7 | #00000000 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | OcrLiteMNN 3 | 4 | 框置信度门限 5 | 框大小倍率 6 | 获取相机权限 7 | 文字方向检测 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/app/src/test/java/com/benjaminwan/ocr/onnx/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/common-aar/IdCardView-1.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/common-aar/IdCardView-1.0.aar -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Nov 19 08:49:30 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip 7 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/keystore/ocrlite.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidMNN/keystore/ocrlite.keystore -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/scripts/build-onnxruntime-android.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # build onnxruntime 1.6 by benjaminwan 3 | # CMakeFiles/onnxruntime.dir/link.txt link lib*.a 4 | 5 | function cmakeParams(){ 6 | ./build.sh --build_dir "$1_$2_$3" --parallel --config $1 --skip_tests \ 7 | --build_shared_lib --cmake_extra_defines CMAKE_INSTALL_PREFIX=./install \ 8 | --android --android_sdk_path /Users/mywork/android-sdk-macosx \ 9 | --android_ndk_path /Users/mywork/android-sdk-macosx/ndk/21.1.6352462 \ 10 | --android_abi $2 \ 11 | --android_api $3 12 | } 13 | 14 | echo "请选择编译选项并回车: 1)Release,2)Debug" 15 | echo "Please Select Build Type: 1)Release,2)Debug" 16 | read -p "" BUILD_TYPE 17 | if [ $BUILD_TYPE == 0 ]; then 18 | echo 19 | elif [ $BUILD_TYPE == 1 ]; then 20 | cmakeParams "Release" "armeabi-v7a" 19 21 | cmakeParams "Release" "arm64-v8a" 21 22 | cmakeParams "Release" "x86" 19 23 | cmakeParams "Release" "x86_64" 21 24 | elif [ $BUILD_TYPE == 2 ]; then 25 | cmakeParams "Debug" "armeabi-v7a" 19 26 | cmakeParams "Debug" "arm64-v8a" 21 27 | cmakeParams "Debug" "x86" 19 28 | cmakeParams "Debug" "x86_64" 21 29 | else 30 | echo -e "输入错误!Input Error!" 31 | fi -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidMNN/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = "OcrLiteAndroidMNN" 2 | include ':app' 3 | include ':OcrLibrary' 4 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /.cxx 3 | /src/main/ncnn 4 | /src/main/ncnn-vulkan 5 | /src/main/assets/*.bin 6 | /src/main/assets/*.param 7 | /src/sdk -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/OcrLibrary/consumer-rules.pro -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/androidTest/java/com/benjaminwan/ocrlibrary/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocrlibrary 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.benjaminwan.ocrlibrary.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | / 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/main/cpp/include/AngleNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_ANGLENET_H__ 2 | #define __OCR_ANGLENET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | 8 | class AngleNet { 9 | public: 10 | 11 | ~AngleNet(); 12 | 13 | void setNumThread(int numOfThread); 14 | 15 | bool initModel(AAssetManager *mgr); 16 | 17 | std::vector getAngles(std::vector &partImgs, bool doAngle, bool mostAngle); 18 | 19 | private: 20 | int numThread; 21 | ncnn::Net net; 22 | const float meanValues[3] = {127.5, 127.5, 127.5}; 23 | const float normValues[3] = {1.0 / 127.5, 1.0 / 127.5, 1.0 / 127.5}; 24 | 25 | const int dstWidth = 192; 26 | const int dstHeight = 32; 27 | 28 | Angle getAngle(cv::Mat &src); 29 | }; 30 | 31 | 32 | #endif //__OCR_ANGLENET_H__ 33 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/main/cpp/include/BitmapUtils.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_LITE_BITMAP_UTILS_H__ 2 | #define __OCR_LITE_BITMAP_UTILS_H__ 3 | 4 | #include 5 | #include "opencv2/core.hpp" 6 | #include "opencv2/imgproc.hpp" 7 | 8 | void bitmapToMat(JNIEnv *env, jobject bitmap, cv::Mat &dst); 9 | 10 | void matToBitmap(JNIEnv *env, cv::Mat &src, jobject bitmap); 11 | 12 | 13 | #endif //__OCR_LITE_BITMAP_UTILS_H__ 14 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/main/cpp/include/CrnnNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_CRNNNET_H__ 2 | #define __OCR_CRNNNET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | #include 8 | 9 | class CrnnNet { 10 | public: 11 | 12 | ~CrnnNet(); 13 | 14 | void setNumThread(int numOfThread); 15 | 16 | bool initModel(AAssetManager *mgr); 17 | 18 | std::vector getTextLines(std::vector &partImg); 19 | 20 | private: 21 | int numThread; 22 | ncnn::Net net; 23 | 24 | const float meanValues[3] = {127.5, 127.5, 127.5}; 25 | const float normValues[3] = {1.0 / 127.5, 1.0 / 127.5, 1.0 / 127.5}; 26 | const int dstHeight = 32; 27 | 28 | std::vector keys; 29 | 30 | TextLine scoreToTextLine(const float *outputData, int h, int w); 31 | 32 | TextLine getTextLine(const cv::Mat &src); 33 | }; 34 | 35 | 36 | #endif //__OCR_CRNNNET_H__ 37 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/main/cpp/include/DbNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_DBNET_H__ 2 | #define __OCR_DBNET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | #include 8 | 9 | class DbNet { 10 | public: 11 | DbNet(); 12 | 13 | ~DbNet(); 14 | 15 | void setNumThread(int numOfThread); 16 | 17 | void setGpuIndex(int gpuIndex); 18 | 19 | bool initModel(AAssetManager *mgr); 20 | 21 | std::vector getTextBoxes(cv::Mat &src, ScaleParam &s, float boxScoreThresh, 22 | float boxThresh, float unClipRatio); 23 | 24 | private: 25 | int numThread; 26 | ncnn::Net net; 27 | const float meanValues[3] = {0.485 * 255, 0.456 * 255, 0.406 * 255}; 28 | const float normValues[3] = {1.0 / 0.229 / 255.0, 1.0 / 0.224 / 255.0, 1.0 / 0.225 / 255.0}; 29 | }; 30 | 31 | 32 | #endif //__OCR_DBNET_H__ 33 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/main/cpp/include/OcrLite.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_LITE_H__ 2 | #define __OCR_LITE_H__ 3 | 4 | #include "opencv2/core.hpp" 5 | #include 6 | #include "OcrStruct.h" 7 | #include "DbNet.h" 8 | #include "AngleNet.h" 9 | #include "CrnnNet.h" 10 | 11 | class OcrLite { 12 | public: 13 | OcrLite(); 14 | 15 | void init(JNIEnv *jniEnv, jobject assetManager, int numOfThread); 16 | 17 | //void initLogger(bool isDebug); 18 | 19 | //void Logger(const char *format, ...); 20 | 21 | OcrResult detect(cv::Mat &src, cv::Rect &originRect, ScaleParam &scale, float boxScoreThresh, float boxThresh, 22 | float unClipRatio, bool doAngle, bool mostAngle); 23 | 24 | private: 25 | bool isLOG = true; 26 | DbNet dbNet; 27 | AngleNet angleNet; 28 | CrnnNet crnnNet; 29 | 30 | }; 31 | 32 | 33 | #endif -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/main/cpp/include/OcrResultUtils.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_RESULT_UTILS_H__ 2 | #define __OCR_RESULT_UTILS_H__ 3 | 4 | #include 5 | #include "OcrStruct.h" 6 | 7 | class OcrResultUtils { 8 | public: 9 | OcrResultUtils(JNIEnv *env, OcrResult &ocrResult, jobject boxImg); 10 | 11 | ~OcrResultUtils(); 12 | 13 | jobject getJObject(); 14 | 15 | private: 16 | JNIEnv *jniEnv; 17 | jobject jOcrResult; 18 | 19 | jclass newJListClass(); 20 | 21 | jmethodID getListConstructor(jclass clazz); 22 | 23 | jobject getTextBlock(TextBlock &textBlock); 24 | 25 | jobject getTextBlocks(std::vector &textBlocks); 26 | 27 | jobject newJPoint(cv::Point &point); 28 | 29 | jobject newJBoxPoint(std::vector &boxPoint); 30 | 31 | jfloatArray newJScoreArray(std::vector &scores); 32 | 33 | }; 34 | 35 | 36 | #endif //__OCR_RESULT_UTILS_H__ 37 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/main/cpp/include/OcrStruct.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_STRUCT_H__ 2 | #define __OCR_STRUCT_H__ 3 | 4 | #include "opencv2/core.hpp" 5 | #include 6 | 7 | struct ScaleParam { 8 | int srcWidth; 9 | int srcHeight; 10 | int dstWidth; 11 | int dstHeight; 12 | float ratioWidth; 13 | float ratioHeight; 14 | }; 15 | 16 | struct TextBox { 17 | std::vector boxPoint; 18 | float score; 19 | }; 20 | 21 | struct Angle { 22 | int index; 23 | float score; 24 | double time; 25 | }; 26 | 27 | struct TextLine { 28 | std::string text; 29 | std::vector charScores; 30 | double time; 31 | }; 32 | 33 | struct TextBlock { 34 | std::vector boxPoint; 35 | float boxScore; 36 | int angleIndex; 37 | float angleScore; 38 | double angleTime; 39 | std::string text; 40 | std::vector charScores; 41 | double crnnTime; 42 | double blockTime; 43 | }; 44 | 45 | struct OcrResult { 46 | double dbNetTime; 47 | std::vector textBlocks; 48 | cv::Mat boxImg; 49 | double detectTime; 50 | std::string strRes; 51 | }; 52 | 53 | #endif //__OCR_STRUCT_H__ 54 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/OcrLibrary/src/test/java/com/benjaminwan/ocrlibrary/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocrlibrary 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/androidTest/java/com/benjaminwan/ocr/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.benjaminwan.ocr", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/java/com/benjaminwan/ocr/ncnn/models/IdCardFront.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.ncnn.models 2 | 3 | import android.os.Parcelable 4 | import com.benjaminwan.ocrlibrary.OcrOutput 5 | import kotlinx.android.parcel.Parcelize 6 | 7 | @Parcelize 8 | data class IdCardFront( 9 | val name: String,//姓名 10 | val nation: String,//民族 11 | val address: String,//地址 12 | val number: String,//身份证号 13 | ) : Parcelable, OcrOutput() { 14 | //性别 15 | val gender: String 16 | get() { 17 | val genderNumber = number[16].toInt() 18 | return if (genderNumber % 2 == 1) "男" else "女" 19 | } 20 | 21 | //出生日期 22 | val birth: String 23 | get() { 24 | val year = number.substring(6..9) 25 | val month = number.substring(10..11) 26 | val date = number.substring(12..13) 27 | return "$year-$month-$date" 28 | } 29 | 30 | fun isEmpty(): Boolean = 31 | name.isEmpty() && nation.isEmpty() && address.isEmpty() && number.isEmpty() 32 | 33 | 34 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/java/com/benjaminwan/ocr/ncnn/utils/BitmapUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.ncnn.utils 2 | 3 | import android.content.Context 4 | import android.graphics.Bitmap 5 | import android.graphics.BitmapFactory 6 | import android.net.Uri 7 | import java.io.FileNotFoundException 8 | 9 | @Throws(FileNotFoundException::class) 10 | fun Context.decodeUri(imgUri: Uri): Bitmap? { 11 | // Decode image size 12 | val options = BitmapFactory.Options() 13 | options.inJustDecodeBounds = false 14 | options.inMutable = true 15 | options.inPreferredConfig = Bitmap.Config.ARGB_8888 16 | return BitmapFactory.decodeStream(contentResolver.openInputStream(imgUri), null, options) 17 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/java/com/benjaminwan/ocr/ncnn/utils/ClipboardUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.ncnn.utils 2 | 3 | import android.content.ClipData 4 | import android.content.ClipboardManager 5 | import android.content.Context 6 | 7 | fun Context.toClipboard(text: String) { 8 | val clipboardManager = 9 | this.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 10 | // 创建普通字符型ClipData 11 | val mClipData = ClipData.newPlainText(packageName, text) 12 | // 将ClipData内容放到系统剪贴板里。 13 | clipboardManager.setPrimaryClip(mClipData) 14 | this.showToast("已复制到剪切板!") 15 | } 16 | 17 | fun Context.fromClipboard(): String? { 18 | val clipboardManager = 19 | this.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 20 | return if (clipboardManager.hasPrimaryClip()) { 21 | val clipData = clipboardManager.primaryClip 22 | if (clipData != null) { 23 | if (clipData.itemCount > 0) { 24 | clipData.getItemAt(0).text.toString() 25 | } else { 26 | null 27 | } 28 | } else { 29 | null 30 | } 31 | } else { 32 | null 33 | } 34 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/java/com/benjaminwan/ocr/ncnn/utils/IdCardMatchUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.ncnn.utils 2 | 3 | import com.orhanobut.logger.Logger 4 | import java.util.regex.Matcher 5 | import java.util.regex.Pattern 6 | 7 | const val idCardNumberRegex = 8 | "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}\$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)\$" 9 | 10 | 11 | fun getMatchIdCardNumberStr(text: String): String? { 12 | val matchALL = Regex(idCardNumberRegex).find(text) 13 | if (matchALL != null) { 14 | Logger.i("match结果 matchALL:${matchALL.value}") 15 | return matchALL.value 16 | } 17 | return null 18 | } 19 | 20 | fun String.trimSymbols(): String { 21 | var dest = "" 22 | if (this.isNotEmpty()) { 23 | val p: Pattern = Pattern.compile("\\p{P}|\\p{S}") 24 | val m: Matcher = p.matcher(this) 25 | dest = m.replaceAll("") 26 | } 27 | return dest 28 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/java/com/benjaminwan/ocr/ncnn/utils/ImeiMatchUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.ncnn.utils 2 | 3 | import com.orhanobut.logger.Logger 4 | import java.util.regex.Matcher 5 | import java.util.regex.Pattern 6 | 7 | const val imeiRegex = "\\d{15}|\\d{17}" 8 | 9 | fun getMatchImeiStr(text: String): String? { 10 | val matchALL = Regex(imeiRegex).find(text) 11 | if (matchALL != null) { 12 | Logger.i("match结果 matchALL:${matchALL.value}") 13 | return matchALL.value 14 | } 15 | return null 16 | } 17 | 18 | fun String.replaceBlank(): String { 19 | var dest = "" 20 | if (this.isNotEmpty()) { 21 | val p: Pattern = Pattern.compile("\\s*|\t|\r|\n") 22 | val m: Matcher = p.matcher(this) 23 | dest = m.replaceAll("") 24 | } 25 | return dest 26 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/java/com/benjaminwan/ocr/ncnn/utils/PlateMatchUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.ncnn.utils 2 | 3 | import com.orhanobut.logger.Logger 4 | import java.util.regex.Matcher 5 | import java.util.regex.Pattern 6 | 7 | const val plateRegex = "^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))\$" 8 | 9 | fun getMatchPlateStr(text: String): String? { 10 | val matchALL = Regex(plateRegex).find(text) 11 | if (matchALL != null) { 12 | Logger.i("match结果 matchALL:${matchALL.value}") 13 | return matchALL.value 14 | } 15 | return null 16 | } 17 | 18 | fun String.trimBlankAndSymbols(): String { 19 | var dest = "" 20 | if (this.isNotEmpty()) { 21 | val p: Pattern = Pattern.compile("\\p{P}|\\p{S}|\\s*|\t|\r|\n") 22 | val m: Matcher = p.matcher(this) 23 | dest = m.replaceAll("") 24 | } 25 | return dest 26 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/java/com/benjaminwan/ocr/ncnn/utils/SoftInputUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.ncnn.utils 2 | 3 | import android.content.Context 4 | import android.view.View 5 | import android.view.inputmethod.InputMethodManager 6 | import android.widget.EditText 7 | import androidx.fragment.app.Fragment 8 | 9 | /** 10 | * 显示软建键盘 11 | */ 12 | fun EditText.showSoftInput(){ 13 | requestFocus() 14 | setSelection(text.toString().length)//将光标移至文字末尾 15 | val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 16 | imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) 17 | } 18 | 19 | /** 20 | * 隐藏软键盘 21 | */ 22 | fun Fragment.hideSoftInput() { 23 | val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 24 | imm.hideSoftInputFromWindow(view?.windowToken, 0) 25 | } 26 | 27 | /** 28 | * 动态隐藏软键盘 29 | * 30 | * @param view 视图 31 | */ 32 | fun View.hideSoftInput() { 33 | val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 34 | imm.hideSoftInputFromWindow(windowToken, 0) 35 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/anim/window_close_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/anim/window_close_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/anim/window_enter_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/anim/window_exit_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/anim/window_fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/anim/window_fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/anim/window_show_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/anim/window_show_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/color/btn_blue3_to_blue5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/color/btn_blue5_to_blue7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/color/btn_grey3_to_grey5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/color/btn_grey5_to_grey7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/color/btn_pink5_to_pink7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/color/btn_white_to_grey.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/drawable/bg_blue3_to_blue5.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 18 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/drawable/bg_blue5_to_blue7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 13 | 17 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/drawable/bg_edittext.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/drawable/bg_edittext_focused.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/drawable/bg_edittext_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/drawable/bg_transparent_to_transparent_half.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/drawable/ic_loading.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/drawable/loading_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/layout/rv_dbnet_time_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #6200EE 4 | #3700B3 5 | #03DAC5 6 | #10000000 7 | #00000000 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | OcrLiteNcnn 3 | 4 | 框置信度门限 5 | 框大小倍率 6 | 获取相机权限 7 | 获取存储权限 8 | 文字方向检测 9 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/app/src/test/java/com/benjaminwan/ocr/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | ext.kotlin_version = "1.5.31" 4 | ext.compile_sdk_version = 31 5 | ext.min_sdk_version = 21 6 | ext.target_sdk_version = 31 7 | ext.project_version_code = 22 8 | ext.project_version_name = "1.6.1" 9 | repositories { 10 | mavenCentral() 11 | maven { url "https://jitpack.io" } 12 | google() 13 | jcenter() 14 | } 15 | dependencies { 16 | classpath 'com.android.tools.build:gradle:7.0.3' 17 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 18 | 19 | // NOTE: Do not place your application dependencies here; they belong 20 | // in the individual module build.gradle files 21 | } 22 | } 23 | 24 | allprojects { 25 | repositories { 26 | mavenCentral() 27 | maven { url "https://jitpack.io" } 28 | google() 29 | jcenter() 30 | } 31 | } 32 | 33 | task clean(type: Delete) { 34 | delete rootProject.buildDir 35 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/capture/detect_IMEI.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/capture/detect_IMEI.gif -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/capture/detect_id_card.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/capture/detect_id_card.gif -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/capture/detect_plate.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/capture/detect_plate.gif -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/common-aar/IdCardView-1.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/common-aar/IdCardView-1.0.aar -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Nov 19 08:49:30 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip 7 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/keystore/ocrlite.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidNcnn/keystore/ocrlite.keystore -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/scripts/patch-opencv3-source.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # base on https://github.com/nihui/opencv-mobile/blob/master/.github/workflows/release.yml 3 | 4 | # patch opencv 5 | truncate -s 0 cmake/OpenCVFindLibsGrfmt.cmake 6 | patch -p1 -i ../opencv-3.4.15-no-rtti.patch 7 | patch -p1 -i ../opencv-3.4.15-no-zlib.patch 8 | rm -rf modules/highgui 9 | cp -r ../highgui modules/ 10 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidNcnn/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = "OcrLiteAndroidNcnn" 2 | include ':app' 3 | include ':OcrLibrary' 4 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /.cxx 3 | /src/main/sharedLibs 4 | /src/sdk 5 | /src/main/onnx -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/OcrLibrary/consumer-rules.pro -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/src/androidTest/java/com/benjaminwan/ocrlibrary/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocrlibrary 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.benjaminwan.ocrlibrary.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | / 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/src/main/cpp/include/BitmapUtils.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_LITE_BITMAP_UTILS_H__ 2 | #define __OCR_LITE_BITMAP_UTILS_H__ 3 | 4 | #include 5 | #include "opencv2/core.hpp" 6 | #include "opencv2/imgproc.hpp" 7 | 8 | void bitmapToMat(JNIEnv *env, jobject bitmap, cv::Mat &dst); 9 | 10 | void matToBitmap(JNIEnv *env, cv::Mat &src, jobject bitmap); 11 | 12 | 13 | #endif //__OCR_LITE_BITMAP_UTILS_H__ 14 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/src/main/cpp/include/OcrLite.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_LITE_H__ 2 | #define __OCR_LITE_H__ 3 | 4 | #include "opencv2/core.hpp" 5 | #include "onnx/onnxruntime_cxx_api.h" 6 | #include "OcrStruct.h" 7 | #include "DbNet.h" 8 | #include "AngleNet.h" 9 | #include "CrnnNet.h" 10 | 11 | class OcrLite { 12 | public: 13 | OcrLite(); 14 | 15 | ~OcrLite(); 16 | 17 | void init(JNIEnv *jniEnv, jobject assetManager, int numOfThread); 18 | 19 | //void initLogger(bool isDebug); 20 | 21 | //void Logger(const char *format, ...); 22 | 23 | OcrResult detect(cv::Mat &src, cv::Rect &originRect, ScaleParam &scale, 24 | float boxScoreThresh, float boxThresh, 25 | float unClipRatio, bool doAngle, bool mostAngle); 26 | 27 | private: 28 | bool isLOG = true; 29 | DbNet dbNet; 30 | AngleNet angleNet; 31 | CrnnNet crnnNet; 32 | }; 33 | 34 | 35 | #endif -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/src/main/cpp/include/OcrResultUtils.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_RESULT_UTILS_H__ 2 | #define __OCR_RESULT_UTILS_H__ 3 | 4 | #include 5 | #include "OcrStruct.h" 6 | 7 | class OcrResultUtils { 8 | public: 9 | OcrResultUtils(JNIEnv *env, OcrResult &ocrResult, jobject boxImg); 10 | 11 | ~OcrResultUtils(); 12 | 13 | jobject getJObject(); 14 | 15 | private: 16 | JNIEnv *jniEnv; 17 | jobject jOcrResult; 18 | 19 | jclass newJListClass(); 20 | 21 | jmethodID getListConstructor(jclass clazz); 22 | 23 | jobject getTextBlock(TextBlock &textBlock); 24 | 25 | jobject getTextBlocks(std::vector &textBlocks); 26 | 27 | jobject newJPoint(cv::Point &point); 28 | 29 | jobject newJBoxPoint(std::vector &boxPoint); 30 | 31 | jfloatArray newJScoreArray(std::vector &scores); 32 | 33 | }; 34 | 35 | 36 | #endif //__OCR_RESULT_UTILS_H__ 37 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/src/main/cpp/include/OcrStruct.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_STRUCT_H__ 2 | #define __OCR_STRUCT_H__ 3 | 4 | #include "opencv2/core.hpp" 5 | #include 6 | 7 | struct ScaleParam { 8 | int srcWidth; 9 | int srcHeight; 10 | int dstWidth; 11 | int dstHeight; 12 | float ratioWidth; 13 | float ratioHeight; 14 | }; 15 | 16 | struct TextBox { 17 | std::vector boxPoint; 18 | float score; 19 | }; 20 | 21 | struct Angle { 22 | int index; 23 | float score; 24 | double time; 25 | }; 26 | 27 | struct TextLine { 28 | std::string text; 29 | std::vector charScores; 30 | double time; 31 | }; 32 | 33 | struct TextBlock { 34 | std::vector boxPoint; 35 | float boxScore; 36 | int angleIndex; 37 | float angleScore; 38 | double angleTime; 39 | std::string text; 40 | std::vector charScores; 41 | double crnnTime; 42 | double blockTime; 43 | }; 44 | 45 | struct OcrResult { 46 | double dbNetTime; 47 | std::vector textBlocks; 48 | cv::Mat boxImg; 49 | double detectTime; 50 | std::string strRes; 51 | }; 52 | 53 | #endif //__OCR_STRUCT_H__ 54 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/OcrLibrary/src/test/java/com/benjaminwan/ocrlibrary/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocrlibrary 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/androidTest/java/com/benjaminwan/ocr/onnx/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.benjaminwan.ocr.onnx", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/java/com/benjaminwan/ocr/onnx/models/IdCardFront.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.models 2 | 3 | import android.os.Parcelable 4 | import com.benjaminwan.ocrlibrary.OcrOutput 5 | import kotlinx.android.parcel.Parcelize 6 | 7 | @Parcelize 8 | data class IdCardFront( 9 | val name: String,//姓名 10 | val nation: String,//民族 11 | val address: String,//地址 12 | val number: String,//身份证号 13 | ) : Parcelable, OcrOutput() { 14 | //性别 15 | val gender: String 16 | get() { 17 | val genderNumber = number[16].toInt() 18 | return if (genderNumber % 2 == 1) "男" else "女" 19 | } 20 | 21 | //出生日期 22 | val birth: String 23 | get() { 24 | val year = number.substring(6..9) 25 | val month = number.substring(10..11) 26 | val date = number.substring(12..13) 27 | return "$year-$month-$date" 28 | } 29 | 30 | fun isEmpty(): Boolean = 31 | name.isEmpty() && nation.isEmpty() && address.isEmpty() && number.isEmpty() 32 | 33 | 34 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/java/com/benjaminwan/ocr/onnx/utils/BitmapUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import android.content.Context 4 | import android.graphics.Bitmap 5 | import android.graphics.BitmapFactory 6 | import android.net.Uri 7 | import java.io.FileNotFoundException 8 | 9 | @Throws(FileNotFoundException::class) 10 | fun Context.decodeUri(imgUri: Uri): Bitmap? { 11 | // Decode image size 12 | val options = BitmapFactory.Options() 13 | options.inJustDecodeBounds = false 14 | options.inMutable = true 15 | options.inPreferredConfig = Bitmap.Config.ARGB_8888 16 | return BitmapFactory.decodeStream(contentResolver.openInputStream(imgUri), null, options) 17 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/java/com/benjaminwan/ocr/onnx/utils/ClipboardUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import android.content.ClipData 4 | import android.content.ClipboardManager 5 | import android.content.Context 6 | 7 | fun Context.toClipboard(text: String) { 8 | val clipboardManager = 9 | this.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 10 | // 创建普通字符型ClipData 11 | val mClipData = ClipData.newPlainText(packageName, text) 12 | // 将ClipData内容放到系统剪贴板里。 13 | clipboardManager.setPrimaryClip(mClipData) 14 | this.showToast("已复制到剪切板!") 15 | } 16 | 17 | fun Context.fromClipboard(): String? { 18 | val clipboardManager = 19 | this.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 20 | return if (clipboardManager.hasPrimaryClip()) { 21 | val clipData = clipboardManager.primaryClip 22 | if (clipData != null) { 23 | if (clipData.itemCount > 0) { 24 | clipData.getItemAt(0).text.toString() 25 | } else { 26 | null 27 | } 28 | } else { 29 | null 30 | } 31 | } else { 32 | null 33 | } 34 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/java/com/benjaminwan/ocr/onnx/utils/IdCardMatchUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import com.orhanobut.logger.Logger 4 | import java.util.regex.Matcher 5 | import java.util.regex.Pattern 6 | 7 | const val idCardNumberRegex = 8 | "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}\$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)\$" 9 | 10 | 11 | fun getMatchIdCardNumberStr(text: String): String? { 12 | val matchALL = Regex(idCardNumberRegex).find(text) 13 | if (matchALL != null) { 14 | Logger.i("match结果 matchALL:${matchALL.value}") 15 | return matchALL.value 16 | } 17 | return null 18 | } 19 | 20 | fun String.trimSymbols(): String { 21 | var dest = "" 22 | if (this.isNotEmpty()) { 23 | val p: Pattern = Pattern.compile("\\p{P}|\\p{S}") 24 | val m: Matcher = p.matcher(this) 25 | dest = m.replaceAll("") 26 | } 27 | return dest 28 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/java/com/benjaminwan/ocr/onnx/utils/ImeiMatchUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import com.orhanobut.logger.Logger 4 | import java.util.regex.Matcher 5 | import java.util.regex.Pattern 6 | 7 | const val imeiRegex = "\\d{15}|\\d{17}" 8 | 9 | fun getMatchImeiStr(text: String): String? { 10 | val matchALL = Regex(imeiRegex).find(text) 11 | if (matchALL != null) { 12 | Logger.i("match结果 matchALL:${matchALL.value}") 13 | return matchALL.value 14 | } 15 | return null 16 | } 17 | 18 | fun String.replaceBlank(): String { 19 | var dest = "" 20 | if (this.isNotEmpty()) { 21 | val p: Pattern = Pattern.compile("\\s*|\t|\r|\n") 22 | val m: Matcher = p.matcher(this) 23 | dest = m.replaceAll("") 24 | } 25 | return dest 26 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/java/com/benjaminwan/ocr/onnx/utils/PlateMatchUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import com.orhanobut.logger.Logger 4 | import java.util.regex.Matcher 5 | import java.util.regex.Pattern 6 | 7 | const val plateRegex = "^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))\$" 8 | 9 | fun getMatchPlateStr(text: String): String? { 10 | val matchALL = Regex(plateRegex).find(text) 11 | if (matchALL != null) { 12 | Logger.i("match结果 matchALL:${matchALL.value}") 13 | return matchALL.value 14 | } 15 | return null 16 | } 17 | 18 | fun String.trimBlankAndSymbols(): String { 19 | var dest = "" 20 | if (this.isNotEmpty()) { 21 | val p: Pattern = Pattern.compile("\\p{P}|\\p{S}|\\s*|\t|\r|\n") 22 | val m: Matcher = p.matcher(this) 23 | dest = m.replaceAll("") 24 | } 25 | return dest 26 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/java/com/benjaminwan/ocr/onnx/utils/SoftInputUtils.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx.utils 2 | 3 | import android.content.Context 4 | import android.view.View 5 | import android.view.inputmethod.InputMethodManager 6 | import android.widget.EditText 7 | import androidx.fragment.app.Fragment 8 | 9 | /** 10 | * 显示软建键盘 11 | */ 12 | fun EditText.showSoftInput(){ 13 | requestFocus() 14 | setSelection(text.toString().length)//将光标移至文字末尾 15 | val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 16 | imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) 17 | } 18 | 19 | /** 20 | * 隐藏软键盘 21 | */ 22 | fun Fragment.hideSoftInput() { 23 | val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 24 | imm.hideSoftInputFromWindow(view?.windowToken, 0) 25 | } 26 | 27 | /** 28 | * 动态隐藏软键盘 29 | * 30 | * @param view 视图 31 | */ 32 | fun View.hideSoftInput() { 33 | val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 34 | imm.hideSoftInputFromWindow(windowToken, 0) 35 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/anim/window_close_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/anim/window_close_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/anim/window_enter_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/anim/window_exit_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/anim/window_fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/anim/window_fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/anim/window_show_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/anim/window_show_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/color/btn_blue3_to_blue5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/color/btn_blue5_to_blue7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/color/btn_grey3_to_grey5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/color/btn_grey5_to_grey7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/color/btn_pink5_to_pink7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/color/btn_white_to_grey.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 20 | 24 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/drawable/bg_blue3_to_blue5.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 18 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/drawable/bg_blue5_to_blue7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 13 | 17 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/drawable/bg_edittext.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/drawable/bg_edittext_focused.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/drawable/bg_edittext_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/drawable/bg_transparent_to_transparent_half.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/drawable/ic_loading.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/drawable/loading_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/layout/rv_dbnet_time_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #6200EE 4 | #3700B3 5 | #03DAC5 6 | #10000000 7 | #00000000 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | OcrLiteOnnx 3 | 4 | 框置信度门限 5 | 框大小倍率 6 | 获取相机权限 7 | 文字方向检测 8 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/app/src/test/java/com/benjaminwan/ocr/onnx/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.benjaminwan.ocr.onnx 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | ext.kotlin_version = "1.5.31" 4 | ext.compile_sdk_version = 31 5 | ext.min_sdk_version = 21 6 | ext.target_sdk_version = 31 7 | ext.project_version_code = 20 8 | ext.project_version_name = "1.6.1" 9 | repositories { 10 | mavenCentral() 11 | maven { url "https://jitpack.io" } 12 | google() 13 | jcenter() 14 | } 15 | dependencies { 16 | classpath 'com.android.tools.build:gradle:7.0.3' 17 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 18 | 19 | // NOTE: Do not place your application dependencies here; they belong 20 | // in the individual module build.gradle files 21 | } 22 | } 23 | 24 | allprojects { 25 | repositories { 26 | mavenCentral() 27 | maven { url "https://jitpack.io" } 28 | google() 29 | jcenter() 30 | } 31 | } 32 | 33 | task clean(type: Delete) { 34 | delete rootProject.buildDir 35 | } -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/capture/detect_IMEI.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/capture/detect_IMEI.gif -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/capture/detect_id_card.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/capture/detect_id_card.gif -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/capture/detect_plate.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/capture/detect_plate.gif -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/common-aar/IdCardView-1.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/common-aar/IdCardView-1.0.aar -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Nov 19 08:49:30 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip 7 | -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/keystore/ocrlite.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/OcrLiteAndroidOnnx/keystore/ocrlite.keystore -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/scripts/build-onnxruntime-android.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # build onnxruntime 1.6~1.9 by benjaminwan 3 | # CMakeFiles/onnxruntime.dir/link.txt link lib*.a 4 | 5 | function cmakeParams(){ 6 | ./build.sh --build_dir "$1_$2_$3" --parallel --config $1 --skip_tests \ 7 | --build_shared_lib --cmake_extra_defines CMAKE_INSTALL_PREFIX=./install \ 8 | --android --android_sdk_path /Users/mywork/android-sdk-macosx \ 9 | --android_ndk_path /Users/mywork/android-sdk-macosx/ndk-bundle \ 10 | --android_abi $2 \ 11 | --android_api $3 \ 12 | --target install 13 | } 14 | 15 | echo "请选择编译选项并回车: 1)Release,2)Debug" 16 | echo "Please Select Build Type: 1)Release,2)Debug" 17 | read -p "" BUILD_TYPE 18 | if [ $BUILD_TYPE == 0 ]; then 19 | echo 20 | elif [ $BUILD_TYPE == 1 ]; then 21 | cmakeParams "Release" "armeabi-v7a" 19 22 | cmakeParams "Release" "arm64-v8a" 21 23 | cmakeParams "Release" "x86" 19 24 | cmakeParams "Release" "x86_64" 21 25 | elif [ $BUILD_TYPE == 2 ]; then 26 | cmakeParams "Debug" "armeabi-v7a" 19 27 | cmakeParams "Debug" "arm64-v8a" 21 28 | cmakeParams "Debug" "x86" 19 29 | cmakeParams "Debug" "x86_64" 21 30 | else 31 | echo -e "输入错误!Input Error!" 32 | fi -------------------------------------------------------------------------------- /android_projects/OcrLiteAndroidOnnx/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = "OcrLiteAndroidOnnx" 2 | include ':app' 3 | include ':OcrLibrary' 4 | -------------------------------------------------------------------------------- /android_projects/test_resource/随机IMEI.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/test_resource/随机IMEI.xlsx -------------------------------------------------------------------------------- /android_projects/test_resource/随机车牌.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/android_projects/test_resource/随机车牌.xlsx -------------------------------------------------------------------------------- /angnet/__init__.py: -------------------------------------------------------------------------------- 1 | from .angle import AngleNetHandle 2 | -------------------------------------------------------------------------------- /backend/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /backend/dist/chineseocr_lite_fontend/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/backend/dist/chineseocr_lite_fontend/favicon.ico -------------------------------------------------------------------------------- /backend/dist/chineseocr_lite_fontend/index.html: -------------------------------------------------------------------------------- 1 | chineseocr_lite-开源的离线ocr
-------------------------------------------------------------------------------- /backend/np_encoder.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import json 4 | import numpy as np 5 | 6 | 7 | class NpEncoder(json.JSONEncoder): 8 | def default(self, obj): 9 | if isinstance(obj, np.integer): 10 | return int(obj) 11 | elif isinstance(obj, np.floating): 12 | return float(obj) 13 | elif isinstance(obj, np.ndarray): 14 | return obj.tolist() 15 | else: 16 | return super(NpEncoder, self).default(obj) 17 | -------------------------------------------------------------------------------- /backend/tools/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /backend/tools/get_host_ip.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import socket 4 | 5 | 6 | def host_ip(): 7 | """ 8 | 查询本机ip地址 9 | :return: ip 10 | """ 11 | ip = '0.0.0.0' 12 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 13 | try: 14 | s.connect(('8.8.8.8', 80)) 15 | ip = s.getsockname()[0] 16 | except OSError as ex: 17 | hostname = socket.gethostname() 18 | ip = socket.gethostbyname(hostname) 19 | finally: 20 | s.close() 21 | 22 | return ip 23 | -------------------------------------------------------------------------------- /backend/tools/log.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import logging 4 | from logging.handlers import RotatingFileHandler 5 | import os 6 | import datetime 7 | 8 | BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 9 | 10 | LOGGER_ROOT_NAME = 'TrWebOCRLog' 11 | logger = logging.getLogger(LOGGER_ROOT_NAME) 12 | logger.setLevel(logging.INFO) 13 | # Formatter 14 | formatter = logging.Formatter('%(asctime)s - %(name)s - [%(levelname)s] | %(message)s', 15 | datefmt='%Y/%m/%d %H:%M:%S') 16 | 17 | logfile_name = datetime.date.today().__format__('%Y-%m-%d.log') 18 | logfile_path = os.path.join(BASE_PATH, f'logs/') 19 | if not os.path.exists(logfile_path): 20 | os.mkdir(logfile_path) 21 | 22 | handler_logfile = RotatingFileHandler(logfile_path + logfile_name, 23 | maxBytes=1 * 1024 * 1024, 24 | backupCount=3) 25 | handler_logfile.setLevel(logging.INFO) 26 | handler_logfile.setFormatter(formatter) 27 | 28 | console_output = logging.StreamHandler() 29 | console_output.setLevel(logging.INFO) 30 | console_output.setFormatter(formatter) 31 | 32 | logger.addHandler(handler_logfile) 33 | logger.addHandler(console_output) 34 | -------------------------------------------------------------------------------- /backend/tools/np_encoder.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import json 4 | import numpy as np 5 | 6 | 7 | class NpEncoder(json.JSONEncoder): 8 | def default(self, obj): 9 | if isinstance(obj, np.integer): 10 | return int(obj) 11 | elif isinstance(obj, np.floating): 12 | return float(obj) 13 | elif isinstance(obj, np.ndarray): 14 | return obj.tolist() 15 | else: 16 | return super(NpEncoder, self).default(obj) 17 | -------------------------------------------------------------------------------- /backend/webInterface/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # encoding: utf-8 3 | # author:alisen 4 | # time: 2020/4/29 10:47 5 | 6 | -------------------------------------------------------------------------------- /backend/webInterface/tr_index.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import tornado.web 4 | import tornado.gen 5 | import tornado.template 6 | import os 7 | 8 | BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 9 | 10 | 11 | class Index(tornado.web.RequestHandler): 12 | 13 | @tornado.gen.coroutine 14 | def get(self, *args, **kwargs): 15 | self.render(os.path.join(BASE_PATH, 'dist/chineseocr_lite_fontend/index.html')) 16 | -------------------------------------------------------------------------------- /backend/仿宋_GB2312.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/backend/仿宋_GB2312.ttf -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | 5 | filt_path = os.path.abspath(__file__) 6 | father_path = os.path.abspath(os.path.dirname(filt_path) + os.path.sep + ".") 7 | 8 | # dbnet 参数 9 | dbnet_max_size = 6000 #长边最大长度 10 | pad_size = 0 #检测是pad尺寸,有些文档文字充满整个屏幕检测有误,需要pad 11 | 12 | 13 | # crnn参数 14 | crnn_lite = True 15 | model_path = os.path.join(father_path, "models/dbnet.onnx") 16 | is_rgb = True 17 | crnn_model_path = os.path.join(father_path, "models/crnn_lite_lstm.onnx") 18 | 19 | 20 | 21 | # angle 22 | angle_detect = True 23 | angle_detect_num = 30 24 | angle_net_path = os.path.join(father_path, "models/angle_net.onnx") 25 | 26 | 27 | max_post_time = 100 # ip 访问最大次数 28 | 29 | from crnn.keys import alphabetChinese as alphabet 30 | 31 | 32 | white_ips = [] #白名单 33 | 34 | version = 'api/v1' 35 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/include/AngleNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_ANGLENET_H__ 2 | #define __OCR_ANGLENET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | 8 | class AngleNet { 9 | public: 10 | AngleNet(); 11 | 12 | ~AngleNet(); 13 | 14 | void setNumThread(int numOfThread); 15 | 16 | void initModel(const std::string &pathStr); 17 | 18 | std::vector getAngles(std::vector &partImgs, const char *path, 19 | const char *imgName, bool doAngle, bool mostAngle); 20 | 21 | private: 22 | bool isOutputAngleImg = false; 23 | 24 | std::shared_ptr net; 25 | MNN::Session* session; 26 | int numThread = 4; 27 | 28 | const float meanValues[3] = {127.5, 127.5, 127.5}; 29 | const float normValues[3] = {1.0 / 127.5, 1.0 / 127.5, 1.0 / 127.5}; 30 | const int dstWidth = 192; 31 | const int dstHeight = 32; 32 | 33 | Angle getAngle(cv::Mat &src); 34 | }; 35 | 36 | 37 | #endif //__OCR_ANGLENET_H__ 38 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/include/CrnnNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_CRNNNET_H__ 2 | #define __OCR_CRNNNET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | 8 | class CrnnNet { 9 | public: 10 | 11 | CrnnNet(); 12 | ~CrnnNet(); 13 | void setNumThread(int numOfThread); 14 | 15 | void initModel(const std::string &pathStr, const std::string &keysPath); 16 | 17 | std::vector getTextLines(std::vector &partImg, const char *path, const char *imgName); 18 | 19 | private: 20 | std::shared_ptr net; 21 | MNN::Session* session; 22 | bool isOutputDebugImg = false; 23 | int numThread = 4; 24 | 25 | const float meanValues[3] = {127.5, 127.5, 127.5}; 26 | const float normValues[3] = {1.0 / 127.5, 1.0 / 127.5, 1.0 / 127.5}; 27 | const int dstHeight = 32; 28 | 29 | std::vector keys; 30 | 31 | TextLine scoreToTextLine(const std::vector &outputData, int h, int w); 32 | 33 | TextLine getTextLine(const cv::Mat &src); 34 | }; 35 | 36 | 37 | #endif //__OCR_CRNNNET_H__ 38 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/include/DbNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_DBNET_H__ 2 | #define __OCR_DBNET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | 8 | class DbNet { 9 | public: 10 | DbNet(); 11 | 12 | ~DbNet(); 13 | 14 | void setNumThread(int numOfThread); 15 | 16 | void initModel(const std::string &pathStr); 17 | 18 | std::vector getTextBoxes(cv::Mat &src, ScaleParam &s, float boxScoreThresh, 19 | float boxThresh, float unClipRatio); 20 | 21 | private: 22 | std::shared_ptr net; 23 | MNN::Session* session; 24 | int numThread = 4; 25 | 26 | const float meanValues[3] = {0.485 * 255, 0.456 * 255, 0.406 * 255}; 27 | const float normValues[3] = {1.0 / 0.229 / 255.0, 1.0 / 0.224 / 255.0, 1.0 / 0.225 / 255.0}; 28 | }; 29 | 30 | 31 | #endif //__OCR_DBNET_H__ 32 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/include/OcrResultUtils.h: -------------------------------------------------------------------------------- 1 | #ifdef __JNI__ 2 | #ifndef __OCR_RESULT_UTILS_H__ 3 | #define __OCR_RESULT_UTILS_H__ 4 | #include 5 | #include "OcrStruct.h" 6 | 7 | class OcrResultUtils { 8 | public: 9 | OcrResultUtils(JNIEnv *env, OcrResult &ocrResult); 10 | 11 | ~OcrResultUtils(); 12 | 13 | jobject getJObject(); 14 | 15 | private: 16 | JNIEnv *jniEnv; 17 | jobject jOcrResult; 18 | 19 | jclass newJListClass(); 20 | 21 | jmethodID getListConstructor(jclass clazz); 22 | 23 | jobject getTextBlock(TextBlock &textBlock); 24 | 25 | jobject getTextBlocks(std::vector &textBlocks); 26 | 27 | jobject newJPoint(cv::Point &point); 28 | 29 | jobject newJBoxPoint(std::vector &boxPoint); 30 | 31 | jfloatArray newJScoreArray(std::vector &scores); 32 | 33 | }; 34 | #endif //__OCR_RESULT_UTILS_H__ 35 | #endif 36 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/include/OcrStruct.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_STRUCT_H__ 2 | #define __OCR_STRUCT_H__ 3 | 4 | #include "opencv2/core.hpp" 5 | #include 6 | 7 | struct ScaleParam { 8 | int srcWidth; 9 | int srcHeight; 10 | int dstWidth; 11 | int dstHeight; 12 | float ratioWidth; 13 | float ratioHeight; 14 | }; 15 | 16 | struct TextBox { 17 | std::vector boxPoint; 18 | float score; 19 | }; 20 | 21 | struct Angle { 22 | int index; 23 | float score; 24 | double time; 25 | }; 26 | 27 | struct TextLine { 28 | std::string text; 29 | std::vector charScores; 30 | double time; 31 | }; 32 | 33 | struct TextBlock { 34 | std::vector boxPoint; 35 | float boxScore; 36 | int angleIndex; 37 | float angleScore; 38 | double angleTime; 39 | std::string text; 40 | std::vector charScores; 41 | double crnnTime; 42 | double blockTime; 43 | }; 44 | 45 | struct OcrResult { 46 | double dbNetTime; 47 | std::vector textBlocks; 48 | cv::Mat boxImg; 49 | double detectTime; 50 | std::string strRes; 51 | }; 52 | 53 | #endif //__OCR_STRUCT_H__ 54 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/include/version.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_VERSION_H__ 2 | #define __OCR_VERSION_H__ 3 | 4 | #define VERSION "1.5.1.20210128" 5 | 6 | #endif //__OCR_VERSION_H__ 7 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/run-benchmark.bat: -------------------------------------------------------------------------------- 1 | chcp 65001 2 | :: Set Param 3 | @ECHO OFF 4 | @SETLOCAL 5 | echo "Setting the Number of Threads=%NUMBER_OF_PROCESSORS% Using an OpenMP Environment Variable" 6 | set OMP_NUM_THREADS=%NUMBER_OF_PROCESSORS% 7 | 8 | echo "请输入循环次数:" 9 | set /p LOOP_COUNT= 10 | 11 | SET TARGET_IMG=../images/1.jpg 12 | if not exist %TARGET_IMG% ( 13 | echo "找不到待识别的目标图片:%TARGET_IMG%,请打开本文件并编辑TARGET_IMG" 14 | PAUSE 15 | exit 16 | ) 17 | 18 | :: run Windows 19 | build\benchmark.exe --version 20 | build\benchmark.exe --models models ^ 21 | --det dbnet.mnn ^ 22 | --cls angle_net.mnn ^ 23 | --rec crnn_lite_lstm.mnn ^ 24 | --keys keys.txt ^ 25 | --image %TARGET_IMG% ^ 26 | --numThread %NUMBER_OF_PROCESSORS% ^ 27 | --padding 50 ^ 28 | --maxSideLen 1024 ^ 29 | --boxScoreThresh 0.6 ^ 30 | --boxThresh 0.3 ^ 31 | --unClipRatio 2.0 ^ 32 | --doAngle 1 ^ 33 | --mostAngle 1 ^ 34 | --loopCount %LOOP_COUNT% 35 | PAUSE 36 | @ENDLOCAL 37 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/run-benchmark.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | sysOS=`uname -s` 4 | NUM_THREADS=1 5 | if [ $sysOS == "Darwin" ];then 6 | #echo "I'm MacOS" 7 | NUM_THREADS=$(sysctl -n hw.ncpu) 8 | elif [ $sysOS == "Linux" ];then 9 | #echo "I'm Linux" 10 | NUM_THREADS=$(grep ^processor /proc/cpuinfo | wc -l) 11 | else 12 | echo "Other OS: $sysOS" 13 | fi 14 | 15 | echo "Setting the Number of Threads=$NUM_THREADS Using an OpenMP Environment Variable" 16 | set OMP_NUM_THREADS=$NUM_THREADS 17 | 18 | echo "请输入循环次数:" 19 | read -p "" LOOP_COUNT 20 | 21 | TARGET_IMG=../images/1.jpg 22 | if [ ! -f "$TARGET_IMG" ]; then 23 | echo "找不到待识别的目标图片:${TARGET_IMG},请打开本文件并编辑TARGET_IMG" 24 | exit 25 | fi 26 | 27 | ##### run test on MacOS or Linux 28 | ./build/benchmark --version 29 | ./build/benchmark --models models \ 30 | --det dbnet.mnn \ 31 | --cls angle_net.mnn \ 32 | --rec crnn_lite_lstm.mnn \ 33 | --keys keys.txt \ 34 | --image $TARGET_IMG \ 35 | --numThread $NUM_THREADS \ 36 | --padding 50 \ 37 | --maxSideLen 1024 \ 38 | --boxScoreThresh 0.6 \ 39 | --boxThresh 0.3 \ 40 | --unClipRatio 2.0 \ 41 | --doAngle 1 \ 42 | --mostAngle 1 \ 43 | --loopCount $LOOP_COUNT -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/run-test.bat: -------------------------------------------------------------------------------- 1 | chcp 65001 2 | :: Set Param 3 | @ECHO OFF 4 | @SETLOCAL 5 | echo "Setting the Number of Threads=%NUMBER_OF_PROCESSORS% Using an OpenMP Environment Variable" 6 | set OMP_NUM_THREADS=%NUMBER_OF_PROCESSORS% 7 | 8 | SET TARGET_IMG=../images/1.jpg 9 | if not exist %TARGET_IMG% ( 10 | echo "找不到待识别的目标图片:%TARGET_IMG%,请打开本文件并编辑TARGET_IMG" 11 | PAUSE 12 | exit 13 | ) 14 | 15 | :: run Windows 16 | build\OcrLiteMnn.exe --version 17 | build\OcrLiteMnn.exe --models models ^ 18 | --det dbnet.mnn ^ 19 | --cls angle_net.mnn ^ 20 | --rec crnn_lite_lstm.mnn ^ 21 | --keys keys.txt ^ 22 | --image %TARGET_IMG% ^ 23 | --numThread %NUMBER_OF_PROCESSORS% ^ 24 | --padding 50 ^ 25 | --maxSideLen 1024 ^ 26 | --boxScoreThresh 0.6 ^ 27 | --boxThresh 0.3 ^ 28 | --unClipRatio 2.0 ^ 29 | --doAngle 1 ^ 30 | --mostAngle 1 31 | PAUSE 32 | @ENDLOCAL 33 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/run-test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | sysOS=`uname -s` 4 | NUM_THREADS=1 5 | if [ $sysOS == "Darwin" ];then 6 | #echo "I'm MacOS" 7 | NUM_THREADS=$(sysctl -n hw.ncpu) 8 | elif [ $sysOS == "Linux" ];then 9 | #echo "I'm Linux" 10 | NUM_THREADS=$(grep ^processor /proc/cpuinfo | wc -l) 11 | else 12 | echo "Other OS: $sysOS" 13 | fi 14 | 15 | 16 | TARGET_IMG=../images/1.jpg 17 | if [ ! -f "$TARGET_IMG" ]; then 18 | echo "找不到待识别的目标图片:${TARGET_IMG},请打开本文件并编辑TARGET_IMG" 19 | exit 20 | fi 21 | 22 | ##### run test on MacOS or Linux 23 | ./build/OcrLiteMnn --version 24 | ./build/OcrLiteMnn --models models \ 25 | --det dbnet.mnn \ 26 | --cls angle_net.mnn \ 27 | --rec crnn_lite_lstm.mnn \ 28 | --keys keys.txt \ 29 | --image $TARGET_IMG \ 30 | --numThread $NUM_THREADS \ 31 | --padding 50 \ 32 | --maxSideLen 1024 \ 33 | --boxScoreThresh 0.6 \ 34 | --boxThresh 0.3 \ 35 | --unClipRatio 2.0 \ 36 | --doAngle 1 \ 37 | --mostAngle 1 -------------------------------------------------------------------------------- /cpp_projects/OcrLiteMnn/valgrind-memcheck.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## script for 内存泄露检查 3 | # ========== macOS ========== 4 | # https://github.com/LouisBrunner/valgrind-macos 5 | # brew tap LouisBrunner/valgrind 6 | # brew install --HEAD LouisBrunner/valgrind/valgrind 7 | # ========== linux ========== 8 | # https://www.valgrind.org/ 9 | # apt install valgrind 10 | 11 | NUM_THREADS=1 12 | 13 | set OMP_NUM_THREADS=$NUM_THREADS 14 | 15 | TARGET_IMG=images/1.jpg 16 | if [ ! -f "$TARGET_IMG" ]; then 17 | echo "找不到待识别的目标图片:${TARGET_IMG},请打开本文件并编辑TARGET_IMG" 18 | exit 19 | fi 20 | 21 | ##### run test on MacOS or Linux 22 | valgrind --tool=memcheck --leak-check=full --leak-resolution=med --track-origins=yes --vgdb=no --log-file=valgrind-memcheck.txt \ 23 | ./build/OcrLiteMnn --models models \ 24 | --det dbnet.mnn \ 25 | --cls angle_net.mnn \ 26 | --rec crnn_lite_lstm.mnn \ 27 | --keys keys.txt \ 28 | --image $TARGET_IMG \ 29 | --numThread $NUM_THREADS \ 30 | --padding 50 \ 31 | --maxSideLen 1024 \ 32 | --boxScoreThresh 0.6 \ 33 | --boxThresh 0.3 \ 34 | --unClipRatio 2.0 \ 35 | --doAngle 1 \ 36 | --mostAngle 1 37 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/OcrLiteNcnn/images/1.jpg -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/images/clear.cmd: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | echo Delete part img 3 | DEL /Q *-part-*.jpg 4 | 5 | echo Delete angle img 6 | DEL /Q *-angle-*.jpg 7 | 8 | echo Delete debug img 9 | DEL /Q *-debug-*.jpg 10 | 11 | echo Delete result img 12 | DEL /Q *-result.jpg 13 | 14 | echo Delete result txt 15 | DEL /Q *-result.txt 16 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/images/clear.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo Delete part img 4 | rm -f *-part-*.jpg 5 | 6 | echo Delete angle img 7 | rm -f *-angle-*.jpg 8 | 9 | echo Delete debug img 10 | rm -f *-debug-*.jpg 11 | 12 | echo Delete result img 13 | rm -f *-result.jpg 14 | 15 | echo Delete result txt 16 | rm -f *-result.txt 17 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/include/AngleNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_ANGLENET_H__ 2 | #define __OCR_ANGLENET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include "ncnn/net.h" 6 | #include 7 | 8 | class AngleNet { 9 | public: 10 | 11 | ~AngleNet(); 12 | 13 | void setNumThread(int numOfThread); 14 | 15 | void setGpuIndex(int gpuIndex); 16 | 17 | bool initModel(const std::string &pathStr); 18 | 19 | std::vector getAngles(std::vector &partImgs, const char *path, 20 | const char *imgName, bool doAngle, bool mostAngle); 21 | 22 | private: 23 | bool isOutputAngleImg = false; 24 | int numThread; 25 | ncnn::Net net; 26 | const float meanValues[3] = {127.5, 127.5, 127.5}; 27 | const float normValues[3] = {1.0 / 127.5, 1.0 / 127.5, 1.0 / 127.5}; 28 | 29 | const int dstWidth = 192; 30 | const int dstHeight = 32; 31 | 32 | Angle getAngle(cv::Mat &src); 33 | }; 34 | 35 | 36 | #endif //__OCR_ANGLENET_H__ 37 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/include/CrnnNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_CRNNNET_H__ 2 | #define __OCR_CRNNNET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include "ncnn/net.h" 6 | #include 7 | 8 | class CrnnNet { 9 | public: 10 | 11 | ~CrnnNet(); 12 | 13 | void setNumThread(int numOfThread); 14 | 15 | void setGpuIndex(int gpuIndex); 16 | 17 | bool initModel(const std::string &pathStr, const std::string &keysPath); 18 | 19 | std::vector getTextLines(std::vector &partImg, const char *path, const char *imgName); 20 | 21 | private: 22 | bool isOutputDebugImg = false; 23 | int numThread; 24 | ncnn::Net net; 25 | 26 | const float meanValues[3] = {127.5, 127.5, 127.5}; 27 | const float normValues[3] = {1.0 / 127.5, 1.0 / 127.5, 1.0 / 127.5}; 28 | const int dstHeight = 32; 29 | 30 | std::vector keys; 31 | 32 | TextLine scoreToTextLine(const std::vector &outputData, int h, int w); 33 | 34 | TextLine getTextLine(const cv::Mat &src); 35 | }; 36 | 37 | 38 | #endif //__OCR_CRNNNET_H__ 39 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/include/DbNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_DBNET_H__ 2 | #define __OCR_DBNET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include "ncnn/net.h" 6 | #include 7 | 8 | class DbNet { 9 | public: 10 | ~DbNet(); 11 | 12 | void setNumThread(int numOfThread); 13 | 14 | void setGpuIndex(int gpuIndex); 15 | 16 | bool initModel(const std::string &pathStr); 17 | 18 | std::vector getTextBoxes(cv::Mat &src, ScaleParam &s, float boxScoreThresh, 19 | float boxThresh, float unClipRatio); 20 | 21 | private: 22 | int numThread; 23 | ncnn::Net net; 24 | const float meanValues[3] = {0.485 * 255, 0.456 * 255, 0.406 * 255}; 25 | const float normValues[3] = {1.0 / 0.229 / 255.0, 1.0 / 0.224 / 255.0, 1.0 / 0.225 / 255.0}; 26 | }; 27 | 28 | 29 | #endif //__OCR_DBNET_H__ 30 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/include/OcrResultUtils.h: -------------------------------------------------------------------------------- 1 | #ifdef __JNI__ 2 | #ifndef __OCR_RESULT_UTILS_H__ 3 | #define __OCR_RESULT_UTILS_H__ 4 | #include 5 | #include "OcrStruct.h" 6 | 7 | class OcrResultUtils { 8 | public: 9 | OcrResultUtils(JNIEnv *env, OcrResult &ocrResult); 10 | 11 | ~OcrResultUtils(); 12 | 13 | jobject getJObject(); 14 | 15 | private: 16 | JNIEnv *jniEnv; 17 | jobject jOcrResult; 18 | 19 | jclass newJListClass(); 20 | 21 | jmethodID getListConstructor(jclass clazz); 22 | 23 | jobject getTextBlock(TextBlock &textBlock); 24 | 25 | jobject getTextBlocks(std::vector &textBlocks); 26 | 27 | jobject newJPoint(cv::Point &point); 28 | 29 | jobject newJBoxPoint(std::vector &boxPoint); 30 | 31 | jfloatArray newJScoreArray(std::vector &scores); 32 | 33 | }; 34 | #endif //__OCR_RESULT_UTILS_H__ 35 | #endif 36 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/include/version.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_VERSION_H__ 2 | #define __OCR_VERSION_H__ 3 | 4 | #define VERSION "1.6.0.20211013" 5 | 6 | #endif //__OCR_VERSION_H__ 7 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/opencv-static/OpenCVWrapperConfig.cmake: -------------------------------------------------------------------------------- 1 | if (WIN32) 2 | if (CMAKE_CL_64) 3 | message("配置WINDOWS OpenCV x64 路径: ${CMAKE_CURRENT_LIST_DIR}/windows-x64") 4 | set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/windows-x64") 5 | else () 6 | message("配置WINDOWS OpenCV x86 路径: ${CMAKE_CURRENT_LIST_DIR}/windows-x86") 7 | set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/windows-x86") 8 | endif () 9 | elseif (APPLE) 10 | message("配置macOS OpenCV 路径: ${CMAKE_CURRENT_LIST_DIR}/macos/lib/cmake/opencv4") 11 | set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/macos/lib/cmake/opencv4") 12 | elseif (UNIX) 13 | message("配置Linux OpenCV 路径: ${CMAKE_CURRENT_LIST_DIR}/linux/lib/cmake/opencv4") 14 | set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/linux/lib/cmake/opencv4") 15 | endif () 16 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/scripts/build-ncnn-nmake.bat: -------------------------------------------------------------------------------- 1 | :: build opencv 3.4.x for windows by benjaminwan 2 | @ECHO OFF 3 | chcp 65001 4 | cls 5 | @SETLOCAL 6 | 7 | echo 请选择要生成的选项并回车: 1)Release,2)Debug: 8 | echo Please Select Build Type: 1)Release,2)Debug: 9 | set BUILD_TYPE=Release 10 | set /p flag= 11 | if %flag% == 0 (set BUILD_TYPE=Release)^ 12 | else if %flag% == 1 (set BUILD_TYPE=Release)^ 13 | else if %flag% == 2 (set BUILD_TYPE=Debug)^ 14 | else (echo "输入错误!Input Error!") 15 | call :cmakeParams %BUILD_TYPE% 16 | GOTO:EOF 17 | 18 | :cmakeParams 19 | mkdir "build-windows-%~1" 20 | pushd "build-windows-%~1" 21 | cmake -G "NMake Makefiles" ^ 22 | -DCMAKE_BUILD_TYPE="%~1" ^ 23 | -DNCNN_OPENMP=ON ^ 24 | -DNCNN_BUILD_BENCHMARK=OFF ^ 25 | -DNCNN_BUILD_EXAMPLES=OFF ^ 26 | -DNCNN_BUILD_TOOLS=OFF ^ 27 | -DNCNN_PYTHON=OFF ^ 28 | -DNCNN_VULKAN=OFF ^ 29 | .. 30 | nmake 31 | nmake install 32 | popd 33 | GOTO:EOF -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/scripts/install-vulkan-linux.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | VULKAN_SDK="$(dirname "$(readlink -f "${BASH_SOURCE:-$_}" )" )/x86_64" 3 | sudo cp -r $VULKAN_SDK/include/vulkan/ /usr/local/include/ 4 | sudo cp -P $VULKAN_SDK/lib/libvulkan.so* /usr/local/lib/ 5 | sudo cp $VULKAN_SDK/lib/libVkLayer_*.so /usr/local/lib/ 6 | sudo mkdir -p /usr/local/share/vulkan/explicit_layer.d 7 | sudo cp $VULKAN_SDK/etc/vulkan/explicit_layer.d/VkLayer_*.json /usr/local/share/vulkan/explicit_layer.d -------------------------------------------------------------------------------- /cpp_projects/OcrLiteNcnn/valgrind-memcheck.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## script for 内存泄露检查 3 | # ========== macOS ========== 4 | # https://github.com/LouisBrunner/valgrind-macos 5 | # brew tap LouisBrunner/valgrind 6 | # brew install --HEAD LouisBrunner/valgrind/valgrind 7 | # ========== linux ========== 8 | # https://www.valgrind.org/ 9 | # apt install valgrind 10 | 11 | NUM_THREADS=1 12 | 13 | set OMP_NUM_THREADS=$NUM_THREADS 14 | 15 | TARGET_IMG=../images/1.jpg 16 | if [ ! -f "$TARGET_IMG" ]; then 17 | echo "找不到待识别的目标图片:${TARGET_IMG},请打开本文件并编辑TARGET_IMG" 18 | exit 19 | fi 20 | 21 | ##### run test on MacOS or Linux 22 | valgrind --tool=memcheck --leak-check=full --leak-resolution=med --track-origins=yes --vgdb=no --log-file=valgrind-memcheck.txt \ 23 | ./build/OcrLiteNcnn --models models \ 24 | --det dbnet.onnx \ 25 | --cls angle_net.onnx \ 26 | --rec crnn_lite_lstm.onnx \ 27 | --keys keys.txt \ 28 | --image $TARGET_IMG \ 29 | --numThread $NUM_THREADS \ 30 | --padding 50 \ 31 | --maxSideLen 1024 \ 32 | --boxScoreThresh 0.6 \ 33 | --boxThresh 0.3 \ 34 | --unClipRatio 2.0 \ 35 | --doAngle 1 \ 36 | --mostAngle 1 37 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/build-default.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | sysOS=$(uname -s) 4 | NUM_THREADS=1 5 | if [ $sysOS == "Darwin" ]; then 6 | #echo "I'm MacOS" 7 | NUM_THREADS=$(sysctl -n hw.nCPU) 8 | elif [ $sysOS == "Linux" ]; then 9 | #echo "I'm Linux" 10 | NUM_THREADS=$(grep ^processor /proc/cpuinfo | wc -l) 11 | else 12 | echo "Other OS: $sysOS" 13 | fi 14 | 15 | mkdir -p ${sysOS}-BIN 16 | pushd ${sysOS}-BIN 17 | cmake -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release -DOCR_OUTPUT="BIN" .. 18 | cmake --build . --config Release -j $NUM_THREADS 19 | cmake --build . --config Release --target install 20 | popd 21 | 22 | 23 | mkdir -p ${sysOS}-JNI 24 | pushd ${sysOS}-JNI 25 | cmake -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release -DOCR_OUTPUT="JNI" .. 26 | cmake --build . --config Release -j $NUM_THREADS 27 | cmake --build . --config Release --target install 28 | popd 29 | 30 | 31 | mkdir -p ${sysOS}-CLIB 32 | pushd ${sysOS}-CLIB 33 | cmake -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release -DOCR_OUTPUT="CLIB" .. 34 | cmake --build . --config Release -j $NUM_THREADS 35 | cmake --build . --config Release --target install 36 | popd 37 | 38 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/OcrLiteOnnx/images/1.jpg -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/images/clear.cmd: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | echo Delete part img 3 | DEL /Q *-part-*.jpg 4 | 5 | echo Delete angle img 6 | DEL /Q *-angle-*.jpg 7 | 8 | echo Delete debug img 9 | DEL /Q *-debug-*.jpg 10 | 11 | echo Delete result img 12 | DEL /Q *-result.jpg 13 | 14 | echo Delete result txt 15 | DEL /Q *-result.txt 16 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/images/clear.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo Delete part img 4 | rm -f *-part-*.jpg 5 | 6 | echo Delete angle img 7 | rm -f *-angle-*.jpg 8 | 9 | echo Delete debug img 10 | rm -f *-debug-*.jpg 11 | 12 | echo Delete result img 13 | rm -f *-result.jpg 14 | 15 | echo Delete result txt 16 | rm -f *-result.txt 17 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/include/DbNet.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_DBNET_H__ 2 | #define __OCR_DBNET_H__ 3 | 4 | #include "OcrStruct.h" 5 | #include 6 | #include 7 | 8 | class DbNet { 9 | public: 10 | DbNet(); 11 | 12 | ~DbNet(); 13 | 14 | void setNumThread(int numOfThread); 15 | 16 | void initModel(const std::string &pathStr); 17 | 18 | std::vector getTextBoxes(cv::Mat &src, ScaleParam &s, float boxScoreThresh, 19 | float boxThresh, float unClipRatio); 20 | 21 | private: 22 | Ort::Session *session; 23 | Ort::Env env = Ort::Env(ORT_LOGGING_LEVEL_ERROR, "DbNet"); 24 | Ort::SessionOptions sessionOptions = Ort::SessionOptions(); 25 | int numThread = 0; 26 | char *inputName; 27 | char *outputName; 28 | 29 | const float meanValues[3] = {0.485 * 255, 0.456 * 255, 0.406 * 255}; 30 | const float normValues[3] = {1.0 / 0.229 / 255.0, 1.0 / 0.224 / 255.0, 1.0 / 0.225 / 255.0}; 31 | }; 32 | 33 | 34 | #endif //__OCR_DBNET_H__ 35 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/include/OcrResultUtils.h: -------------------------------------------------------------------------------- 1 | #ifdef __JNI__ 2 | #ifndef __OCR_RESULT_UTILS_H__ 3 | #define __OCR_RESULT_UTILS_H__ 4 | #include 5 | #include "OcrStruct.h" 6 | 7 | class OcrResultUtils { 8 | public: 9 | OcrResultUtils(JNIEnv *env, OcrResult &ocrResult); 10 | 11 | ~OcrResultUtils(); 12 | 13 | jobject getJObject(); 14 | 15 | private: 16 | JNIEnv *jniEnv; 17 | jobject jOcrResult; 18 | 19 | jclass newJListClass(); 20 | 21 | jmethodID getListConstructor(jclass clazz); 22 | 23 | jobject getTextBlock(TextBlock &textBlock); 24 | 25 | jobject getTextBlocks(std::vector &textBlocks); 26 | 27 | jobject newJPoint(cv::Point &point); 28 | 29 | jobject newJBoxPoint(std::vector &boxPoint); 30 | 31 | jfloatArray newJScoreArray(std::vector &scores); 32 | 33 | }; 34 | #endif //__OCR_RESULT_UTILS_H__ 35 | #endif 36 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/include/version.h: -------------------------------------------------------------------------------- 1 | #ifndef __OCR_VERSION_H__ 2 | #define __OCR_VERSION_H__ 3 | 4 | #define VERSION "1.6.0.20211015" 5 | 6 | #endif //__OCR_VERSION_H__ 7 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/onnxruntime-static/OnnxRuntimeWrapper.cmake: -------------------------------------------------------------------------------- 1 | if (APPLE) 2 | message("配置macOS OnnxRuntime 路径: ${CMAKE_CURRENT_LIST_DIR}/macos") 3 | set(OnnxRuntime_DIR "${CMAKE_CURRENT_LIST_DIR}/macos") 4 | elseif (WIN32) 5 | if (CMAKE_CL_64) 6 | message("配置WINDOWS OnnxRuntime x64 路径: ${CMAKE_CURRENT_LIST_DIR}/windows-x64") 7 | set(OnnxRuntime_DIR "${CMAKE_CURRENT_LIST_DIR}/windows-x64") 8 | else () 9 | message("配置WINDOWS OnnxRuntime x86 路径: ${CMAKE_CURRENT_LIST_DIR}/windows-x86") 10 | set(OnnxRuntime_DIR "${CMAKE_CURRENT_LIST_DIR}/windows-x86") 11 | endif () 12 | elseif (UNIX) 13 | message("配置Linux OnnxRuntime 路径: ${CMAKE_CURRENT_LIST_DIR}/linux") 14 | set(OnnxRuntime_DIR "${CMAKE_CURRENT_LIST_DIR}/linux") 15 | endif () 16 | 17 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/opencv-static/OpenCVWrapperConfig.cmake: -------------------------------------------------------------------------------- 1 | if (WIN32) 2 | if (CMAKE_CL_64) 3 | message("配置WINDOWS OpenCV x64 路径: ${CMAKE_CURRENT_LIST_DIR}/windows-x64") 4 | set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/windows-x64") 5 | else () 6 | message("配置WINDOWS OpenCV x86 路径: ${CMAKE_CURRENT_LIST_DIR}/windows-x86") 7 | set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/windows-x86") 8 | endif () 9 | elseif (APPLE) 10 | message("配置macOS OpenCV 路径: ${CMAKE_CURRENT_LIST_DIR}/macos/lib/cmake/opencv4") 11 | set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/macos/lib/cmake/opencv4") 12 | elseif (UNIX) 13 | message("配置Linux OpenCV 路径: ${CMAKE_CURRENT_LIST_DIR}/linux/lib/cmake/opencv4") 14 | set(OpenCV_DIR "${CMAKE_CURRENT_LIST_DIR}/linux/lib/cmake/opencv4") 15 | endif () 16 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/run-test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | function PrepareVar(){ 4 | EXE_PATH=${sysOS}-BIN 5 | } 6 | 7 | sysOS=`uname -s` 8 | NUM_THREADS=1 9 | if [ $sysOS == "Darwin" ];then 10 | #echo "I'm MacOS" 11 | NUM_THREADS=$(sysctl -n hw.ncpu) 12 | elif [ $sysOS == "Linux" ];then 13 | #echo "I'm Linux" 14 | NUM_THREADS=$(grep ^processor /proc/cpuinfo | wc -l) 15 | else 16 | echo "Other OS: $sysOS" 17 | fi 18 | 19 | echo "Setting the Number of Threads=$NUM_THREADS Using an OpenMP Environment Variable" 20 | set OMP_NUM_THREADS=$NUM_THREADS 21 | 22 | PrepareVar 23 | 24 | TARGET_IMG=images/1.jpg 25 | if [ ! -f "$TARGET_IMG" ]; then 26 | echo "找不到待识别的目标图片:${TARGET_IMG},请打开本文件并编辑TARGET_IMG" 27 | exit 28 | fi 29 | 30 | ##### run test on MacOS or Linux 31 | ./${EXE_PATH}/OcrLiteOnnx --version 32 | ./${EXE_PATH}/OcrLiteOnnx --models models \ 33 | --det dbnet.onnx \ 34 | --cls angle_net.onnx \ 35 | --rec crnn_lite_lstm.onnx \ 36 | --keys keys.txt \ 37 | --image $TARGET_IMG \ 38 | --numThread $NUM_THREADS \ 39 | --padding 50 \ 40 | --maxSideLen 1024 \ 41 | --boxScoreThresh 0.6 \ 42 | --boxThresh 0.3 \ 43 | --unClipRatio 2.0 \ 44 | --doAngle 1 \ 45 | --mostAngle 1 -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/scripts/build-onnxruntime.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # build onnxruntime 1.6 by benjaminwan 3 | # CMakeFiles/onnxruntime.dir/link.txtlinklib*.a 4 | 5 | function cmakeParams(){ 6 | ./build.sh --parallel --config $1 --skip_tests --build_shared_lib \ 7 | --cmake_extra_defines CMAKE_INSTALL_PREFIX=./install 8 | #--disable_contrib_ops --disable_ml_ops --disable_rtti 9 | } 10 | 11 | echo "请选择编译选项并回车: 1)Release,2)Debug" 12 | echo "Please Select Build Type: 1)Release,2)Debug" 13 | read -p "" BUILD_TYPE 14 | if [ $BUILD_TYPE == 0 ]; then 15 | cmakeParams "Release" 16 | elif [ $BUILD_TYPE == 1 ]; then 17 | cmakeParams "Release" 18 | elif [ $BUILD_TYPE == 2 ]; then 19 | cmakeParams "Debug" 20 | else 21 | echo -e "输入错误!Input Error!" 22 | fi -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/valgrind-massif.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## script for 内存占用检查 3 | # ========== macOS ========== 4 | # https://github.com/LouisBrunner/valgrind-macos 5 | # brew tap LouisBrunner/valgrind 6 | # brew install --HEAD LouisBrunner/valgrind/valgrind 7 | # ========== linux ========== 8 | # https://www.valgrind.org/ 9 | # apt install valgrind 10 | 11 | NUM_THREADS=1 12 | 13 | set OMP_NUM_THREADS=$NUM_THREADS 14 | 15 | TARGET_IMG=../images/1.jpg 16 | if [ ! -f "$TARGET_IMG" ]; then 17 | echo "找不到待识别的目标图片:${TARGET_IMG},请打开本文件并编辑TARGET_IMG" 18 | exit 19 | fi 20 | 21 | ##### run test on MacOS or Linux 22 | valgrind --tool=massif --pages-as-heap=yes \ 23 | ./build/OcrLiteOnnx --models models \ 24 | --det dbnet.onnx \ 25 | --cls angle_net.onnx \ 26 | --rec crnn_lite_lstm.onnx \ 27 | --keys keys.txt \ 28 | --image $TARGET_IMG \ 29 | --numThread $NUM_THREADS \ 30 | --padding 50 \ 31 | --maxSideLen 1024 \ 32 | --boxScoreThresh 0.6 \ 33 | --boxThresh 0.3 \ 34 | --unClipRatio 2.0 \ 35 | --doAngle 1 \ 36 | --mostAngle 1 37 | -------------------------------------------------------------------------------- /cpp_projects/OcrLiteOnnx/valgrind-memcheck.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## script for 内存泄露检查 3 | # ========== macOS ========== 4 | # https://github.com/LouisBrunner/valgrind-macos 5 | # brew tap LouisBrunner/valgrind 6 | # brew install --HEAD LouisBrunner/valgrind/valgrind 7 | # ========== linux ========== 8 | # https://www.valgrind.org/ 9 | # apt install valgrind 10 | 11 | NUM_THREADS=1 12 | 13 | set OMP_NUM_THREADS=$NUM_THREADS 14 | 15 | TARGET_IMG=../images/1.jpg 16 | if [ ! -f "$TARGET_IMG" ]; then 17 | echo "找不到待识别的目标图片:${TARGET_IMG},请打开本文件并编辑TARGET_IMG" 18 | exit 19 | fi 20 | 21 | ##### run test on MacOS or Linux 22 | valgrind --tool=memcheck --leak-check=full --leak-resolution=med --track-origins=yes --vgdb=no --log-file=valgrind-memcheck.txt \ 23 | ./build/OcrLiteOnnx --models models \ 24 | --det dbnet.onnx \ 25 | --cls angle_net.onnx \ 26 | --rec crnn_lite_lstm.onnx \ 27 | --keys keys.txt \ 28 | --image $TARGET_IMG \ 29 | --numThread $NUM_THREADS \ 30 | --padding 50 \ 31 | --maxSideLen 1024 \ 32 | --boxScoreThresh 0.6 \ 33 | --boxThresh 0.3 \ 34 | --unClipRatio 2.0 \ 35 | --doAngle 1 \ 36 | --mostAngle 1 37 | -------------------------------------------------------------------------------- /cpp_projects/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/images/1.jpg -------------------------------------------------------------------------------- /cpp_projects/images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/images/2.jpg -------------------------------------------------------------------------------- /cpp_projects/images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/images/3.jpg -------------------------------------------------------------------------------- /cpp_projects/images/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/images/4.jpg -------------------------------------------------------------------------------- /cpp_projects/images/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/images/5.jpg -------------------------------------------------------------------------------- /cpp_projects/images/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/images/6.jpg -------------------------------------------------------------------------------- /cpp_projects/images/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/images/7.jpg -------------------------------------------------------------------------------- /cpp_projects/images/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/images/8.jpg -------------------------------------------------------------------------------- /cpp_projects/images/clear.cmd: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | echo Delete part img 3 | DEL /Q *-part-*.jpg 4 | 5 | echo Delete debug img 6 | DEL /Q *-debug-*.jpg 7 | 8 | echo Delete result img 9 | DEL /Q *-result.jpg 10 | 11 | echo Delete result txt 12 | DEL /Q *-result.txt 13 | -------------------------------------------------------------------------------- /cpp_projects/images/clear.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo Delete part img 4 | rm -f *-part-*.jpg 5 | 6 | echo Delete debug img 7 | rm -f *-debug-*.jpg 8 | 9 | echo Delete result img 10 | rm -f *-result.jpg 11 | 12 | echo Delete result txt 13 | rm -f *-result.txt 14 | -------------------------------------------------------------------------------- /cpp_projects/images/mostAngle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/cpp_projects/images/mostAngle.jpg -------------------------------------------------------------------------------- /crnn/__init__.py: -------------------------------------------------------------------------------- 1 | from .CRNN import CRNNHandle 2 | -------------------------------------------------------------------------------- /dbnet/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/dbnet/.DS_Store -------------------------------------------------------------------------------- /dbnet/test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/dbnet/test.jpg -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxCs/OcrLiteLib/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的一般信息由以下 6 | // 控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("OcrLiteLib")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("OcrLiteLib")] 13 | [assembly: AssemblyCopyright("Copyright © 2020")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 会使此程序集中的类型 18 | //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 19 | //请将此类型的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("3a1647da-83cd-4f9d-9ffa-f663bb55ff6a")] 24 | 25 | // 程序集的版本信息由下列四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 33 | //通过使用 "*",如下所示: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxCs/OcrLiteOnnxForm/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxCs/OcrLiteOnnxForm/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace OcrLiteOnnxCs 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// 应用程序的主入口点。 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new FormOcrLite()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxCs/OcrLiteOnnxForm/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的一般信息由以下 6 | // 控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("OcrLiteOnnxCs")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("OcrLiteOnnxCs")] 13 | [assembly: AssemblyCopyright("Copyright © 2020")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 会使此程序集中的类型 18 | //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 19 | //请将此类型的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("56f142a0-de89-497c-bb20-872e6bebb176")] 24 | 25 | // 程序集的版本信息由下列四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 33 | // 方法是按如下所示使用“*”: : 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxCs/OcrLiteOnnxForm/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // 此代码由工具生成。 4 | // 运行时版本:4.0.30319.42000 5 | // 6 | // 对此文件的更改可能会导致不正确的行为,并且如果 7 | // 重新生成代码,这些更改将会丢失。 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace OcrLiteOnnxForm.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxCs/OcrLiteOnnxForm/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxCs/OcrLiteOnnxForm/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxVB/OcrLiteLib/My Project/Application.Designer.vb: -------------------------------------------------------------------------------- 1 | '------------------------------------------------------------------------------ 2 | ' 3 | ' This code was generated by a tool. 4 | ' Runtime Version:4.0.30319.42000 5 | ' 6 | ' Changes to this file may cause incorrect behavior and will be lost if 7 | ' the code is regenerated. 8 | ' 9 | '------------------------------------------------------------------------------ 10 | 11 | Option Strict On 12 | Option Explicit On 13 | 14 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxVB/OcrLiteLib/My Project/Application.myapp: -------------------------------------------------------------------------------- 1 |  2 | 3 | false 4 | false 5 | 0 6 | true 7 | 0 8 | 1 9 | true 10 | 11 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxVB/OcrLiteLib/My Project/AssemblyInfo.vb: -------------------------------------------------------------------------------- 1 | Imports System 2 | Imports System.Reflection 3 | Imports System.Runtime.InteropServices 4 | 5 | ' 有关程序集的一般信息由以下 6 | ' 控制。更改这些特性值可修改 7 | ' 与程序集关联的信息。 8 | 9 | '查看程序集特性的值 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | '如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 21 | 22 | 23 | ' 程序集的版本信息由下列四个值组成: 24 | ' 25 | ' 主版本 26 | ' 次版本 27 | ' 生成号 28 | ' 修订号 29 | ' 30 | ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 31 | ' 方法是按如下所示使用“*”: : 32 | ' 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxVB/OcrLiteLib/My Project/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxVB/OcrLiteOnnxForm/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxVB/OcrLiteOnnxForm/My Project/Application.myapp: -------------------------------------------------------------------------------- 1 |  2 | 3 | true 4 | FormOcrLite 5 | false 6 | 0 7 | true 8 | 0 9 | true 10 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxVB/OcrLiteOnnxForm/My Project/AssemblyInfo.vb: -------------------------------------------------------------------------------- 1 | Imports System 2 | Imports System.Reflection 3 | Imports System.Runtime.InteropServices 4 | 5 | ' 有关程序集的一般信息由以下 6 | ' 控制。更改这些特性值可修改 7 | ' 与程序集关联的信息。 8 | 9 | '查看程序集特性的值 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | '如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 21 | 22 | 23 | ' 程序集的版本信息由下列四个值组成: 24 | ' 25 | ' 主版本 26 | ' 次版本 27 | ' 生成号 28 | ' 修订号 29 | ' 30 | ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 31 | ' 方法是按如下所示使用“*”: : 32 | ' 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxVB/OcrLiteOnnxForm/My Project/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /dotnet_projects/OcrLiteOnnxVB/OcrLiteOnnxForm/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dotnet_projects/README.md: -------------------------------------------------------------------------------- 1 | # .Net版OcrLite范例 2 | 3 | #### 介绍 4 | 本目录存放.Net相关demo项目 5 | * OcrLiteOnnxCs项目是Windows平台C# WinForm范例 6 | * OcrLiteOnnxVB项目是Windows平台VB.Net WinForm范例 7 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'org.jetbrains.kotlin.jvm' version '1.3.72' 4 | } 5 | 6 | group 'com.benjaminwan.ocrlite' 7 | version '1.0-SNAPSHOT' 8 | 9 | repositories { 10 | maven { url 'https://maven.aliyun.com/repository/google' } 11 | maven { url 'https://maven.aliyun.com/repository/jcenter' } 12 | maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } 13 | mavenCentral() 14 | } 15 | 16 | dependencies { 17 | implementation "org.jetbrains.kotlin:kotlin-stdlib" 18 | testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' 19 | testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' 20 | } 21 | 22 | test { 23 | useJUnitPlatform() 24 | } -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/jvm_projects/OcrLiteNcnnJvm/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://code.aliyun.com/kar/gradle-bin-zip/raw/master/gradle-6.3-bin.zip 4 | #distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/run-test/test_imgs/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/jvm_projects/OcrLiteNcnnJvm/run-test/test_imgs/1.jpg -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/run-test/test_imgs/clear.cmd: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | echo Delete part img 3 | DEL /Q *-part-*.jpg 4 | 5 | echo Delete angle img 6 | DEL /Q *-angle-*.jpg 7 | 8 | echo Delete debug img 9 | DEL /Q *-debug-*.jpg 10 | 11 | echo Delete result img 12 | DEL /Q *-result.jpg 13 | 14 | echo Delete result txt 15 | DEL /Q *-result.txt 16 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/run-test/test_imgs/clear.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo Delete part img 4 | rm -f *-part-*.jpg 5 | 6 | echo Delete angle img 7 | rm -f *-angle-*.jpg 8 | 9 | echo Delete debug img 10 | rm -f *-debug-*.jpg 11 | 12 | echo Delete result img 13 | rm -f *-result.jpg 14 | 15 | echo Delete result txt 16 | rm -f *-result.txt 17 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/run-test/valgrind-memcheck-java.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## script for 内存泄露检查 3 | # ========== macOS ========== 4 | # https://github.com/LouisBrunner/valgrind-macos 5 | # brew tap LouisBrunner/valgrind 6 | # brew install --HEAD LouisBrunner/valgrind/valgrind 7 | # ========== linux ========== 8 | # https://www.valgrind.org/ 9 | # apt install valgrind 10 | 11 | NUM_THREADS=1 12 | 13 | set OMP_NUM_THREADS=$NUM_THREADS 14 | 15 | ##### run test on MacOS or Linux 16 | #pushd cmake-build-debug 17 | valgrind --trace-children=yes --tool=memcheck --leak-check=full --leak-resolution=med --track-origins=yes --vgdb=no --log-file=valgrind-memcheck.txt \ 18 | java -Djava.library.path=. -jar OcrLiteNcnnJvm.jar models test_imgs/1.jpg 19 | #popd 20 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'OcrLiteNcnnJvm' 2 | 3 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteNcnnJvm/src/main/resources/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: com.benjaminwan.ocr.MainKt 3 | Class-Path: kotlin-stdlib-1.3.72.jar annotations-13.0.jar kotlin-stdlib- 4 | common-1.3.72.jar 5 | 6 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'org.jetbrains.kotlin.jvm' version '1.3.72' 4 | } 5 | 6 | group 'com.benjaminwan.ocrlite' 7 | version '1.0-SNAPSHOT' 8 | 9 | repositories { 10 | maven { url 'https://maven.aliyun.com/repository/google' } 11 | maven { url 'https://maven.aliyun.com/repository/jcenter' } 12 | maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } 13 | mavenCentral() 14 | } 15 | 16 | dependencies { 17 | implementation "org.jetbrains.kotlin:kotlin-stdlib" 18 | testCompile group: 'junit', name: 'junit', version: '4.12' 19 | } -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/jvm_projects/OcrLiteOnnxJvm/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://code.aliyun.com/kar/gradle-bin-zip/raw/master/gradle-6.3-bin.zip 4 | #distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/run-test/test_imgs/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/jvm_projects/OcrLiteOnnxJvm/run-test/test_imgs/1.jpg -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/run-test/test_imgs/clear.cmd: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | echo Delete part img 3 | DEL /Q *-part-*.jpg 4 | 5 | echo Delete angle img 6 | DEL /Q *-angle-*.jpg 7 | 8 | echo Delete debug img 9 | DEL /Q *-debug-*.jpg 10 | 11 | echo Delete result img 12 | DEL /Q *-result.jpg 13 | 14 | echo Delete result txt 15 | DEL /Q *-result.txt 16 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/run-test/test_imgs/clear.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo Delete part img 4 | rm -f *-part-*.jpg 5 | 6 | echo Delete angle img 7 | rm -f *-angle-*.jpg 8 | 9 | echo Delete debug img 10 | rm -f *-debug-*.jpg 11 | 12 | echo Delete result img 13 | rm -f *-result.jpg 14 | 15 | echo Delete result txt 16 | rm -f *-result.txt 17 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/run-test/valgrind-memcheck-java.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ## script for 内存泄露检查 3 | # ========== macOS ========== 4 | # https://github.com/LouisBrunner/valgrind-macos 5 | # brew tap LouisBrunner/valgrind 6 | # brew install --HEAD LouisBrunner/valgrind/valgrind 7 | # ========== linux ========== 8 | # https://www.valgrind.org/ 9 | # apt install valgrind 10 | 11 | NUM_THREADS=1 12 | 13 | set OMP_NUM_THREADS=$NUM_THREADS 14 | 15 | ##### run test on MacOS or Linux 16 | #pushd cmake-build-debug 17 | valgrind --trace-children=yes --tool=memcheck --leak-check=full --leak-resolution=med --track-origins=yes --vgdb=no --log-file=valgrind-memcheck.txt \ 18 | java -Djava.library.path=. -jar OcrLiteOnnxJvm.jar models test_imgs/1.jpg 19 | #popd 20 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'OcrLiteOnnxJvm' 2 | 3 | -------------------------------------------------------------------------------- /jvm_projects/OcrLiteOnnxJvm/src/main/resources/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: com.benjaminwan.ocr.MainKt 3 | Class-Path: kotlin-stdlib-1.3.72.jar annotations-13.0.jar kotlin-stdlib- 4 | common-1.3.72.jar 5 | 6 | -------------------------------------------------------------------------------- /jvm_projects/README.md: -------------------------------------------------------------------------------- 1 | # Jvm版OcrLite范例 2 | 3 | #### 介绍 4 | 本目录存放Jvm相关demo项目 5 | 1. OcrLiteOnnxJvm项目是通过jni调用OcrLiteOnnx动态运行库的范例,内含java和kotlin调用范例,附调试和编译相关说明 6 | * 因测试设备的限制,onnxruntime在macOS不支持AMD显卡,没有跨平台的GPU支持方案,所以目前Onnxruntime版仅支持cpu计算。 7 | * 如果想在windows或linux下启用GPU加速,除了装好显卡驱动,cuda sdk,以及gpu版onnxruntime以外,还必须修改代码,请自行到onnxruntime官方仓库寻找参考范例。 8 | 9 | ----- 10 | 11 | 2. OcrLiteNcnnJvm项目是通过jni调用OcrLiteNcnn动态运行库的范例,内含java和kotlin调用范例,附调试和编译相关说明 12 | * ncnn版支持Vulkan GPU加速,并支持跨平台,实测在macOS和windows下工作良好,ncnn版分为两个版本,一个版本仅支持CPU计算,另一个版本带vulkan支持。 13 | * 带vulkan支持的ncnn版本,需要先安装Vulkan SDK,Windows和LInux还需要安装显卡驱动,且显卡驱动要有vulkan支持。 14 | * Intel核芯显卡,AMD显卡,NVIDIA显卡大部分都支持Vulkan。 15 | * 关于GPU加速,Intel核芯显卡和AMD低端显卡都能获得非常不错的加速效果,Intel核芯显卡dbNet提速约一倍以上,AMD低端显卡(RX560D¥2xx)dbNet提速5~10倍左右,因测试设备的限制,没有条件测试NVIDIA显卡。 16 | * [详细的测试结果](https://github.com/ouyanghuiyu/chineseocr_lite/tree/onnx/cpp_projects) 17 | 18 | -------------------------------------------------------------------------------- /models/angle_net.onnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/models/angle_net.onnx -------------------------------------------------------------------------------- /models/crnn_lite_lstm.onnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/models/crnn_lite_lstm.onnx -------------------------------------------------------------------------------- /models/dbnet.onnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/models/dbnet.onnx -------------------------------------------------------------------------------- /models_ncnn/angle_op.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/models_ncnn/angle_op.bin -------------------------------------------------------------------------------- /models_ncnn/crnn_lite_op.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/models_ncnn/crnn_lite_op.bin -------------------------------------------------------------------------------- /models_ncnn/dbnet_op.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/models_ncnn/dbnet_op.bin -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | tornado==5.1.1 2 | numpy==1.19.1 3 | opencv_python==4.3.0.36 4 | onnxruntime==1.4.0 5 | Shapely==1.7.0 6 | pyclipper==1.2.0 7 | Pillow==7.2.0 8 | -------------------------------------------------------------------------------- /test_imgs/android/detect_IMEI.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/android/detect_IMEI.gif -------------------------------------------------------------------------------- /test_imgs/android/detect_id_card.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/android/detect_id_card.gif -------------------------------------------------------------------------------- /test_imgs/android/detect_plate.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/android/detect_plate.gif -------------------------------------------------------------------------------- /test_imgs/dotnet/OcrLiteOnnxCs.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/dotnet/OcrLiteOnnxCs.PNG -------------------------------------------------------------------------------- /test_imgs/o2-word.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/o2-word.jpg -------------------------------------------------------------------------------- /test_imgs/res.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/res.jpg -------------------------------------------------------------------------------- /test_imgs/res_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/res_2.jpg -------------------------------------------------------------------------------- /test_imgs/third_party/tnn_detect_camera.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/third_party/tnn_detect_camera.gif -------------------------------------------------------------------------------- /test_imgs/third_party/tnn_detect_poster1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/third_party/tnn_detect_poster1.png -------------------------------------------------------------------------------- /test_imgs/third_party/tnn_detect_poster2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/test_imgs/third_party/tnn_detect_poster2.png -------------------------------------------------------------------------------- /仿宋_GB2312.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DayBreak-u/chineseocr_lite/6b1a2ae63143805c96719d8b8d8309884a14f75e/仿宋_GB2312.ttf --------------------------------------------------------------------------------