From 298a4084c2bc75315fb251d8d1e1226476d091da Mon Sep 17 00:00:00 2001
From: Winter <1558270516@qq.com>
Date: Tue, 29 Nov 2022 21:48:02 +0800
Subject: [PATCH] [Android] Update ui module structure. (#706)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Remove redundant code for segmentation.
* Classification Documentation and example improvement.
* Ocr Documentation and example improvement.
* 1.detection、face、seg module add "svPreview.enableCamera();".
2.java/android add fastdepolyUi module.
* examples/vision/ to add OCRv3.
* Modify UI directory name.
* Refresh examples\vision,change OCR README.md
* Update ui module
* Update ui module
Co-authored-by: DefTruth <31974251+DefTruth@users.noreply.github.com>
---
.../vision/ocr/PP-OCRv3/android/.gitignore | 20 +
.../vision/ocr/PP-OCRv3/android/README.md | 86 +
.../ocr/PP-OCRv3/android/app/build.gradle | 125 +
.../PP-OCRv3/android/app/proguard-rules.pro | 21 +
.../fastdeploy/ExampleInstrumentedTest.java | 0
.../android/app/src/main/AndroidManifest.xml | 30 +
.../src/main/assets/labels/ppocr_keys_v1.txt | 6623 +++++++++++++++++
.../app/examples/ocr/OcrMainActivity.java | 500 ++
.../app/examples/ocr/OcrSettingsActivity.java | 198 +
.../baidu/paddle/fastdeploy/app/ui/Utils.java | 0
.../app/ui/layout/ActionBarLayout.java | 0
.../ui/view/AppCompatPreferenceActivity.java | 0
.../app/ui/view/CameraSurfaceView.java | 2 +-
.../app/ui/view/ResultListView.java | 0
.../ui/view/adapter/BaseResultAdapter.java | 0
.../app/ui/view/model/BaseResultModel.java | 0
.../res/drawable-v24/action_button_layer.xml | 14 +
.../src/main/res/drawable-v24/album_btn.xml | 7 +
.../drawable-v24/ic_launcher_foreground.xml | 34 +
.../res/drawable-v24/realtime_start_btn.xml | 7 +
.../res/drawable-v24/realtime_stop_btn.xml | 7 +
.../result_page_border_section_bk.xml | 12 +
.../res/drawable-v24/round_corner_btn.xml | 10 +
.../seekbar_progress_realtime.xml | 18 +
.../drawable-v24/seekbar_progress_result.xml | 18 +
.../main/res/drawable-v24/seekbar_thumb.xml | 9 +
.../res/drawable-v24/seekbar_thumb_shape.xml | 26 +
.../main/res/drawable-v24/switch_side_btn.xml | 7 +
.../res/drawable-v24/take_picture_btn.xml | 7 +
.../app/src/main/res/drawable-xhdpi/album.png | Bin 0 -> 10284 bytes
.../main/res/drawable-xhdpi/album_pressed.png | Bin 0 -> 9982 bytes
.../src/main/res/drawable-xhdpi/back_btn.png | Bin 0 -> 455 bytes
.../src/main/res/drawable-xhdpi/more_menu.png | Bin 0 -> 414 bytes
.../res/drawable-xhdpi/realtime_start.png | Bin 0 -> 6166 bytes
.../drawable-xhdpi/realtime_start_pressed.png | Bin 0 -> 6113 bytes
.../main/res/drawable-xhdpi/realtime_stop.png | Bin 0 -> 7992 bytes
.../drawable-xhdpi/realtime_stop_pressed.png | Bin 0 -> 8016 bytes
.../src/main/res/drawable-xhdpi/scan_icon.png | Bin 0 -> 1970 bytes
.../res/drawable-xhdpi/seekbar_handle.png | Bin 0 -> 23722 bytes
.../seekbar_progress_dotted.png | Bin 0 -> 944 bytes
.../seekbar_thumb_invisible.png | Bin 0 -> 2864 bytes
.../main/res/drawable-xhdpi/switch_side.png | Bin 0 -> 4873 bytes
.../drawable-xhdpi/switch_side_pressed.png | Bin 0 -> 4883 bytes
.../main/res/drawable-xhdpi/take_picture.png | Bin 0 -> 7514 bytes
.../drawable-xhdpi/take_picture_pressed.png | Bin 0 -> 7549 bytes
.../drawable-xxhdpi-v4/btn_switch_default.png | Bin 0 -> 1523 bytes
.../drawable-xxhdpi-v4/btn_switch_pressed.png | Bin 0 -> 10074 bytes
.../src/main/res/drawable/btn_settings.xml | 6 +
.../res/drawable/btn_settings_default.xml | 13 +
.../res/drawable/btn_settings_pressed.xml | 13 +
.../app/src/main/res/drawable/btn_shutter.xml | 5 +
.../main/res/drawable/btn_shutter_default.xml | 17 +
.../main/res/drawable/btn_shutter_pressed.xml | 17 +
.../app/src/main/res/drawable/btn_switch.xml | 5 +
.../res/drawable/ic_launcher_background.xml | 170 +
.../res/layout-land/ocr_activity_main.xml | 14 +
.../src/main/res/layout/ocr_activity_main.xml | 14 +
.../src/main/res/layout/ocr_camera_page.xml | 160 +
.../src/main/res/layout/ocr_result_page.xml | 160 +
.../main/res/layout/ocr_result_page_item.xml | 0
.../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +
.../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +
.../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes
.../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes
.../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes
.../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes
.../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes
.../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes
.../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes
.../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes
.../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes
.../app/src/main/res/values/arrays.xml | 39 +
.../app/src/main/res/values/colors.xml | 22 +
.../app/src/main/res/values/dimens.xml | 17 +
.../app/src/main/res/values/strings.xml | 51 +
.../app/src/main/res/values/styles.xml | 70 +
.../app/src/main/res/values/values.xml | 17 +
.../app/src/main/res/xml/ocr_settings.xml | 45 +
.../vision/ocr/PP-OCRv3/android/build.gradle | 37 +
.../ocr/PP-OCRv3/android/gradle.properties | 13 +
.../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes
.../gradle/wrapper/gradle-wrapper.properties | 6 +
examples/vision/ocr/PP-OCRv3/android/gradlew | 0
.../vision/ocr/PP-OCRv3/android/gradlew.bat | 89 +
.../ocr/PP-OCRv3/android/local.properties | 8 +
.../ocr/PP-OCRv3/android/settings.gradle | 1 +
java/android/app/build.gradle | 1 +
.../ClassificationMainActivity.java | 20 +-
.../ClassificationSettingsActivity.java | 4 +-
.../detection/DetectionMainActivity.java | 21 +-
.../detection/DetectionSettingsActivity.java | 4 +-
.../examples/facedet/FaceDetMainActivity.java | 19 +-
.../facedet/FaceDetSettingsActivity.java | 4 +-
.../app/examples/ocr/OcrMainActivity.java | 17 +-
.../app/examples/ocr/OcrSettingsActivity.java | 4 +-
.../SegmentationMainActivity.java | 15 +-
.../SegmentationSettingsActivity.java | 4 +-
.../res/layout/classification_camera_page.xml | 6 +-
.../res/layout/classification_result_page.xml | 8 +-
.../main/res/layout/detection_camera_page.xml | 4 +-
.../main/res/layout/detection_result_page.xml | 9 +-
.../res/layout/detection_result_page_item.xml | 26 -
.../main/res/layout/facedet_camera_page.xml | 4 +-
.../main/res/layout/facedet_result_page.xml | 9 +-
.../res/layout/facedet_result_page_item.xml | 26 -
.../src/main/res/layout/ocr_camera_page.xml | 6 +-
.../src/main/res/layout/ocr_result_page.xml | 8 +-
.../res/layout/segmentation_camera_page.xml | 4 +-
.../res/layout/segmentation_result_page.xml | 8 +-
.../layout/segmentation_result_page_item.xml | 26 -
java/android/settings.gradle | 1 +
java/android/ui/.gitignore | 1 +
java/android/ui/build.gradle | 39 +
java/android/ui/consumer-rules.pro | 0
java/android/ui/local.properties | 8 +
java/android/ui/proguard-rules.pro | 21 +
java/android/ui/src/main/AndroidManifest.xml | 4 +
.../com/baidu/paddle/fastdeploy/ui/Utils.java | 313 +
.../fastdeploy/ui/layout/ActionBarLayout.java | 33 +
.../ui/view/AppCompatPreferenceActivity.java | 111 +
.../fastdeploy/ui/view/CameraSurfaceView.java | 353 +
.../fastdeploy/ui/view/ResultListView.java | 43 +
.../ui/view/adapter/BaseResultAdapter.java | 48 +
.../ui/view/model/BaseResultModel.java | 41 +
.../result_page_border_section_bk.xml | 12 +
.../res/layout/base_result_page_item.xml} | 0
.../android/ui/src/main/res/values/colors.xml | 22 +
.../android/ui/src/main/res/values/styles.xml | 70 +
129 files changed, 10005 insertions(+), 172 deletions(-)
create mode 100644 examples/vision/ocr/PP-OCRv3/android/.gitignore
create mode 100644 examples/vision/ocr/PP-OCRv3/android/README.md
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/build.gradle
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/proguard-rules.pro
rename {java => examples/vision/ocr/PP-OCRv3}/android/app/src/androidTest/java/com/baidu/paddle/fastdeploy/ExampleInstrumentedTest.java (100%)
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/AndroidManifest.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/assets/labels/ppocr_keys_v1.txt
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrSettingsActivity.java
rename {java => examples/vision/ocr/PP-OCRv3}/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/Utils.java (100%)
rename {java => examples/vision/ocr/PP-OCRv3}/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/layout/ActionBarLayout.java (100%)
rename {java => examples/vision/ocr/PP-OCRv3}/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/AppCompatPreferenceActivity.java (100%)
rename {java => examples/vision/ocr/PP-OCRv3}/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java (99%)
rename {java => examples/vision/ocr/PP-OCRv3}/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/ResultListView.java (100%)
rename {java => examples/vision/ocr/PP-OCRv3}/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/adapter/BaseResultAdapter.java (100%)
rename {java => examples/vision/ocr/PP-OCRv3}/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/model/BaseResultModel.java (100%)
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/action_button_layer.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/album_btn.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/realtime_start_btn.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/realtime_stop_btn.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/result_page_border_section_bk.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/round_corner_btn.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_progress_realtime.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_progress_result.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_thumb.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_thumb_shape.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/switch_side_btn.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/take_picture_btn.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/album.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/album_pressed.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/back_btn.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/more_menu.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/realtime_start.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/realtime_start_pressed.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/realtime_stop.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/realtime_stop_pressed.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/scan_icon.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/seekbar_handle.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/seekbar_progress_dotted.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/seekbar_thumb_invisible.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/switch_side.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/switch_side_pressed.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/take_picture.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/take_picture_pressed.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xxhdpi-v4/btn_switch_default.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xxhdpi-v4/btn_switch_pressed.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable/btn_settings.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable/btn_settings_default.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable/btn_settings_pressed.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable/btn_shutter.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable/btn_shutter_default.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable/btn_shutter_pressed.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable/btn_switch.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable/ic_launcher_background.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/layout-land/ocr_activity_main.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/layout/ocr_activity_main.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/layout/ocr_camera_page.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/layout/ocr_result_page.xml
rename {java => examples/vision/ocr/PP-OCRv3}/android/app/src/main/res/layout/ocr_result_page_item.xml (100%)
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/values/arrays.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/values/colors.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/values/dimens.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/values/strings.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/values/styles.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/values/values.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/app/src/main/res/xml/ocr_settings.xml
create mode 100644 examples/vision/ocr/PP-OCRv3/android/build.gradle
create mode 100644 examples/vision/ocr/PP-OCRv3/android/gradle.properties
create mode 100644 examples/vision/ocr/PP-OCRv3/android/gradle/wrapper/gradle-wrapper.jar
create mode 100644 examples/vision/ocr/PP-OCRv3/android/gradle/wrapper/gradle-wrapper.properties
create mode 100644 examples/vision/ocr/PP-OCRv3/android/gradlew
create mode 100644 examples/vision/ocr/PP-OCRv3/android/gradlew.bat
create mode 100644 examples/vision/ocr/PP-OCRv3/android/local.properties
create mode 100644 examples/vision/ocr/PP-OCRv3/android/settings.gradle
delete mode 100644 java/android/app/src/main/res/layout/detection_result_page_item.xml
delete mode 100644 java/android/app/src/main/res/layout/facedet_result_page_item.xml
delete mode 100644 java/android/app/src/main/res/layout/segmentation_result_page_item.xml
create mode 100644 java/android/ui/.gitignore
create mode 100644 java/android/ui/build.gradle
create mode 100644 java/android/ui/consumer-rules.pro
create mode 100644 java/android/ui/local.properties
create mode 100644 java/android/ui/proguard-rules.pro
create mode 100644 java/android/ui/src/main/AndroidManifest.xml
create mode 100644 java/android/ui/src/main/java/com/baidu/paddle/fastdeploy/ui/Utils.java
create mode 100644 java/android/ui/src/main/java/com/baidu/paddle/fastdeploy/ui/layout/ActionBarLayout.java
create mode 100644 java/android/ui/src/main/java/com/baidu/paddle/fastdeploy/ui/view/AppCompatPreferenceActivity.java
create mode 100644 java/android/ui/src/main/java/com/baidu/paddle/fastdeploy/ui/view/CameraSurfaceView.java
create mode 100644 java/android/ui/src/main/java/com/baidu/paddle/fastdeploy/ui/view/ResultListView.java
create mode 100644 java/android/ui/src/main/java/com/baidu/paddle/fastdeploy/ui/view/adapter/BaseResultAdapter.java
create mode 100644 java/android/ui/src/main/java/com/baidu/paddle/fastdeploy/ui/view/model/BaseResultModel.java
create mode 100644 java/android/ui/src/main/res/drawable-v24/result_page_border_section_bk.xml
rename java/android/{app/src/main/res/layout/classification_result_page_item.xml => ui/src/main/res/layout/base_result_page_item.xml} (100%)
create mode 100644 java/android/ui/src/main/res/values/colors.xml
create mode 100644 java/android/ui/src/main/res/values/styles.xml
diff --git a/examples/vision/ocr/PP-OCRv3/android/.gitignore b/examples/vision/ocr/PP-OCRv3/android/.gitignore
new file mode 100644
index 0000000000..f6eba672f0
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/.gitignore
@@ -0,0 +1,20 @@
+.DS_Store
+.idea
+.gradle
+.cxx
+cache
+build
+app/cache
+app/libs/fastdeploy*
+app/.cxx
+app/build
+app/src/main/assets/models/*
+app/.gradle
+app/.idea
+fastdeploy/cache
+fastdeploy/libs/fastdeploy*
+fastdeploy/.cxx
+fastdeploy/build
+fastdeploy/src/main/assets/models/*
+fastdeploy/.gradle
+fastdeploy/.idea
diff --git a/examples/vision/ocr/PP-OCRv3/android/README.md b/examples/vision/ocr/PP-OCRv3/android/README.md
new file mode 100644
index 0000000000..97a6a2e37b
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/README.md
@@ -0,0 +1,86 @@
+# OCR文字识别 Android Demo 使用文档
+
+在 Android 上实现实时的OCR文字识别功能,此 Demo 有很好的的易用性和开放性,如在 Demo 中跑自己训练好的模型等。
+
+## 环境准备
+
+1. 在本地环境安装好 Android Studio 工具,详细安装方法请见[Android Stuido 官网](https://developer.android.com/studio)。
+2. 准备一部 Android 手机,并开启 USB 调试模式。开启方法: `手机设置 -> 查找开发者选项 -> 打开开发者选项和 USB 调试模式`
+
+## 部署步骤
+
+1. OCR文字识别 Demo 位于 `fastdeploy/examples/vision/ocr/PP-OCRv3/android` 目录
+2. 用 Android Studio 打开 PP-OCRv3/android 工程
+3. 手机连接电脑,打开 USB 调试和文件传输模式,并在 Android Studio 上连接自己的手机设备(手机需要开启允许从 USB 安装软件权限)
+
+
+
+
+
+> **注意:**
+>> 如果您在导入项目、编译或者运行过程中遇到 NDK 配置错误的提示,请打开 ` File > Project Structure > SDK Location`,修改 `Andriod SDK location` 为您本机配置的 SDK 所在路径。
+
+4. 点击 Run 按钮,自动编译 APP 并安装到手机。(该过程会自动下载预编译的 FastDeploy Android 库 以及 模型文件,需要联网)
+ 成功后效果如下,图一:APP 安装到手机;图二: APP 打开后的效果,会自动识别图片中的物体并标记;图三:APP设置选项,点击右上角的设置图片,可以设置不同选项进行体验。
+
+| APP 图标 | APP 效果 | APP设置项
+ | --- | --- | --- |
+|  |  |  |
+
+### PP-OCRv2 & PP-OCRv3 Java API 说明
+
+- 模型初始化 API: 模型初始化API包含两种方式,方式一是通过构造函数直接初始化;方式二是,通过调用init函数,在合适的程序节点进行初始化。 PP-OCR初始化参数说明如下:
+ - modelFile: String, paddle格式的模型文件路径,如 model.pdmodel
+ - paramFile: String, paddle格式的参数文件路径,如 model.pdiparams
+ - labelFile: String, 可选参数,表示label标签文件所在路径,用于可视化,如 ppocr_keys_v1.txt,每一行包含一个label
+ - option: RuntimeOption,可选参数,模型初始化option。如果不传入该参数则会使用默认的运行时选项。
+ 与其他模型不同的是,PP-OCRv2 和 PP-OCRv3 包含 DBDetector、Classifier和Recognizer等基础模型,以及PPOCRv2和PPOCRv3等pipeline类型。
+```java
+// 构造函数: constructor w/o label file
+public DBDetector(String modelFile, String paramsFile);
+public DBDetector(String modelFile, String paramsFile, RuntimeOption option);
+public Classifier(String modelFile, String paramsFile);
+public Classifier(String modelFile, String paramsFile, RuntimeOption option);
+public Recognizer(String modelFile, String paramsFile, String labelPath);
+public Recognizer(String modelFile, String paramsFile, String labelPath, RuntimeOption option);
+public PPOCRv2(); // 空构造函数,之后可以调用init初始化
+// Constructor w/o classifier
+public PPOCRv2(DBDetector detModel, Recognizer recModel);
+public PPOCRv2(DBDetector detModel, Classifier clsModel, Recognizer recModel);
+public PPOCRv3(); // 空构造函数,之后可以调用init初始化
+// Constructor w/o classifier
+public PPOCRv3(DBDetector detModel, Recognizer recModel);
+public PPOCRv3(DBDetector detModel, Classifier clsModel, Recognizer recModel);
+```
+- 模型预测 API:模型预测API包含直接预测的API以及带可视化功能的API。直接预测是指,不保存图片以及不渲染结果到Bitmap上,仅预测推理结果。预测并且可视化是指,预测结果以及可视化,并将可视化后的图片保存到指定的途径,以及将可视化结果渲染在Bitmap(目前支持ARGB8888格式的Bitmap), 后续可将该Bitmap在camera中进行显示。
+```java
+// 直接预测:不保存图片以及不渲染结果到Bitmap上
+public OCRResult predict(Bitmap ARGB8888Bitmap);
+// 预测并且可视化:预测结果以及可视化,并将可视化后的图片保存到指定的途径,以及将可视化结果渲染在Bitmap上
+public OCRResult predict(Bitmap ARGB8888Bitmap, String savedImagePath);
+public OCRResult predict(Bitmap ARGB8888Bitmap, boolean rendering); // 只渲染 不保存图片
+```
+- 模型资源释放 API:调用 release() API 可以释放模型资源,返回true表示释放成功,false表示失败;调用 initialized() 可以判断模型是否初始化成功,true表示初始化成功,false表示失败。
+```java
+public boolean release(); // 释放native资源
+public boolean initialized(); // 检查是否初始化成功
+```
+
+## 替换 FastDeploy SDK和模型
+替换FastDeploy预测库和模型的步骤非常简单。预测库所在的位置为 `app/libs/fastdeploy-android-sdk-xxx.aar`,其中 `xxx` 表示当前您使用的预测库版本号。模型所在的位置为,`app/src/main/assets/models`。
+- 替换FastDeploy Android SDK: 下载或编译最新的FastDeploy Android SDK,解压缩后放在 `app/libs` 目录下;详细配置文档可参考:
+ - [在 Android 中使用 FastDeploy Java SDK](../../../../../java/android/)
+
+- 替换OCR模型的步骤:
+ - 将您的OCR模型放在 `app/src/main/assets/models` 目录下;
+ - 修改 `app/src/main/res/values/strings.xml` 中模型路径的默认值,如:
+```xml
+
+models
+labels/ppocr_keys_v1.txt
+```
+
+## 更多参考文档
+如果您想知道更多的FastDeploy Java API文档以及如何通过JNI来接入FastDeploy C++ API感兴趣,可以参考以下内容:
+- [在 Android 中使用 FastDeploy Java SDK](../../../../../java/android/)
+- [在 Android 中使用 FastDeploy C++ SDK](../../../../../docs/cn/faq/use_cpp_sdk_on_android.md)
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/build.gradle b/examples/vision/ocr/PP-OCRv3/android/app/build.gradle
new file mode 100644
index 0000000000..de19b87c0d
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/build.gradle
@@ -0,0 +1,125 @@
+import java.security.MessageDigest
+
+apply plugin: 'com.android.application'
+
+android {
+ compileSdk 28
+
+ defaultConfig {
+ applicationId 'com.baidu.paddle.fastdeploy.app.examples'
+ minSdkVersion 15
+ //noinspection ExpiredTargetSdkVersion
+ targetSdkVersion 28
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+}
+
+dependencies {
+ implementation fileTree(include: ['*.aar'], dir: 'libs')
+ implementation 'com.android.support:appcompat-v7:28.0.0'
+ //noinspection GradleDependency
+ implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+ implementation 'com.android.support:design:28.0.0'
+ implementation 'org.jetbrains:annotations:15.0'
+ //noinspection GradleDependency
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'com.android.support.test:runner:1.0.2'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+}
+
+def FD_MODEL = [
+ [
+ 'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/ch_PP-OCRv3_det_infer.tgz',
+ 'dest': 'src/main/assets/models'
+ ],
+ [
+ 'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/ch_ppocr_mobile_v2.0_cls_infer.tgz',
+ 'dest': 'src/main/assets/models'
+ ],
+ [
+ 'src' : 'https://bj.bcebos.com/paddlehub/fastdeploy/ch_PP-OCRv3_rec_infer.tgz',
+ 'dest': 'src/main/assets/models'
+ ]
+]
+
+def FD_JAVA_SDK = [
+ [
+ 'src' : 'https://bj.bcebos.com/fastdeploy/test/fastdeploy-android-sdk-latest-dev.aar',
+ 'dest': 'libs'
+ ]
+]
+
+task downloadAndExtractModels(type: DefaultTask) {
+ doFirst {
+ println "Downloading and extracting fastdeploy models ..."
+ }
+ doLast {
+ String cachePath = "cache"
+ if (!file("${cachePath}").exists()) {
+ mkdir "${cachePath}"
+ }
+ FD_MODEL.eachWithIndex { model, index ->
+ MessageDigest messageDigest = MessageDigest.getInstance('MD5')
+ messageDigest.update(model.src.bytes)
+ String[] modelPaths = model.src.split("/")
+ String modelName = modelPaths[modelPaths.length - 1]
+ // Download the target model if not exists
+ boolean copyFiles = !file("${model.dest}").exists()
+ if (!file("${cachePath}/${modelName}").exists()) {
+ println "Downloading ${model.src} -> ${cachePath}/${modelName}"
+ ant.get(src: model.src, dest: file("${cachePath}/${modelName}"))
+ copyFiles = true
+ }
+ if (copyFiles) {
+ println "Coping ${cachePath}/${modelName} -> ${model.dest}"
+ copy {
+ from tarTree("${cachePath}/${modelName}")
+ into "${model.dest}"
+ }
+ }
+ }
+ }
+}
+
+task downloadAndExtractSDKs(type: DefaultTask) {
+ doFirst {
+ println "Downloading and extracting fastdeploy android java sdk ..."
+ }
+ doLast {
+ String cachePath = "cache"
+ if (!file("${cachePath}").exists()) {
+ mkdir "${cachePath}"
+ }
+ FD_JAVA_SDK.eachWithIndex { sdk, index ->
+ String[] sdkPaths = sdk.src.split("/")
+ String sdkName = sdkPaths[sdkPaths.length - 1]
+ // Download the target SDK if not exists
+ boolean copyFiles = !file("${sdk.dest}/${sdkName}").exists()
+ if (!file("${cachePath}/${sdkName}").exists()) {
+ println "Downloading ${sdk.src} -> ${cachePath}/${sdkName}"
+ ant.get(src: sdk.src, dest: file("${cachePath}/${sdkName}"))
+ copyFiles = true
+ }
+ if (copyFiles) {
+ println "Coping ${cachePath}/${sdkName} -> ${sdk.dest}/${sdkName}"
+ copy {
+ from "${cachePath}/${sdkName}"
+ into "${sdk.dest}"
+ }
+ }
+ }
+ }
+}
+
+preBuild.dependsOn downloadAndExtractSDKs
+preBuild.dependsOn downloadAndExtractModels
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/proguard-rules.pro b/examples/vision/ocr/PP-OCRv3/android/app/proguard-rules.pro
new file mode 100644
index 0000000000..481bb43481
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/java/android/app/src/androidTest/java/com/baidu/paddle/fastdeploy/ExampleInstrumentedTest.java b/examples/vision/ocr/PP-OCRv3/android/app/src/androidTest/java/com/baidu/paddle/fastdeploy/ExampleInstrumentedTest.java
similarity index 100%
rename from java/android/app/src/androidTest/java/com/baidu/paddle/fastdeploy/ExampleInstrumentedTest.java
rename to examples/vision/ocr/PP-OCRv3/android/app/src/androidTest/java/com/baidu/paddle/fastdeploy/ExampleInstrumentedTest.java
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/AndroidManifest.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..8493c0379f
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/assets/labels/ppocr_keys_v1.txt b/examples/vision/ocr/PP-OCRv3/android/app/src/main/assets/labels/ppocr_keys_v1.txt
new file mode 100644
index 0000000000..b75af21303
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/assets/labels/ppocr_keys_v1.txt
@@ -0,0 +1,6623 @@
+'
+疗
+绚
+诚
+娇
+溜
+题
+贿
+者
+廖
+更
+纳
+加
+奉
+公
+一
+就
+汴
+计
+与
+路
+房
+原
+妇
+2
+0
+8
+-
+7
+其
+>
+:
+]
+,
+,
+骑
+刈
+全
+消
+昏
+傈
+安
+久
+钟
+嗅
+不
+影
+处
+驽
+蜿
+资
+关
+椤
+地
+瘸
+专
+问
+忖
+票
+嫉
+炎
+韵
+要
+月
+田
+节
+陂
+鄙
+捌
+备
+拳
+伺
+眼
+网
+盎
+大
+傍
+心
+东
+愉
+汇
+蹿
+科
+每
+业
+里
+航
+晏
+字
+平
+录
+先
+1
+3
+彤
+鲶
+产
+稍
+督
+腴
+有
+象
+岳
+注
+绍
+在
+泺
+文
+定
+核
+名
+水
+过
+理
+让
+偷
+率
+等
+这
+发
+”
+为
+含
+肥
+酉
+相
+鄱
+七
+编
+猥
+锛
+日
+镀
+蒂
+掰
+倒
+辆
+栾
+栗
+综
+涩
+州
+雌
+滑
+馀
+了
+机
+块
+司
+宰
+甙
+兴
+矽
+抚
+保
+用
+沧
+秩
+如
+收
+息
+滥
+页
+疑
+埠
+!
+!
+姥
+异
+橹
+钇
+向
+下
+跄
+的
+椴
+沫
+国
+绥
+獠
+报
+开
+民
+蜇
+何
+分
+凇
+长
+讥
+藏
+掏
+施
+羽
+中
+讲
+派
+嘟
+人
+提
+浼
+间
+世
+而
+古
+多
+倪
+唇
+饯
+控
+庚
+首
+赛
+蜓
+味
+断
+制
+觉
+技
+替
+艰
+溢
+潮
+夕
+钺
+外
+摘
+枋
+动
+双
+单
+啮
+户
+枇
+确
+锦
+曜
+杜
+或
+能
+效
+霜
+盒
+然
+侗
+电
+晁
+放
+步
+鹃
+新
+杖
+蜂
+吒
+濂
+瞬
+评
+总
+隍
+对
+独
+合
+也
+是
+府
+青
+天
+诲
+墙
+组
+滴
+级
+邀
+帘
+示
+已
+时
+骸
+仄
+泅
+和
+遨
+店
+雇
+疫
+持
+巍
+踮
+境
+只
+亨
+目
+鉴
+崤
+闲
+体
+泄
+杂
+作
+般
+轰
+化
+解
+迂
+诿
+蛭
+璀
+腾
+告
+版
+服
+省
+师
+小
+规
+程
+线
+海
+办
+引
+二
+桧
+牌
+砺
+洄
+裴
+修
+图
+痫
+胡
+许
+犊
+事
+郛
+基
+柴
+呼
+食
+研
+奶
+律
+蛋
+因
+葆
+察
+戏
+褒
+戒
+再
+李
+骁
+工
+貂
+油
+鹅
+章
+啄
+休
+场
+给
+睡
+纷
+豆
+器
+捎
+说
+敏
+学
+会
+浒
+设
+诊
+格
+廓
+查
+来
+霓
+室
+溆
+¢
+诡
+寥
+焕
+舜
+柒
+狐
+回
+戟
+砾
+厄
+实
+翩
+尿
+五
+入
+径
+惭
+喹
+股
+宇
+篝
+|
+;
+美
+期
+云
+九
+祺
+扮
+靠
+锝
+槌
+系
+企
+酰
+阊
+暂
+蚕
+忻
+豁
+本
+羹
+执
+条
+钦
+H
+獒
+限
+进
+季
+楦
+于
+芘
+玖
+铋
+茯
+未
+答
+粘
+括
+样
+精
+欠
+矢
+甥
+帷
+嵩
+扣
+令
+仔
+风
+皈
+行
+支
+部
+蓉
+刮
+站
+蜡
+救
+钊
+汗
+松
+嫌
+成
+可
+.
+鹤
+院
+从
+交
+政
+怕
+活
+调
+球
+局
+验
+髌
+第
+韫
+谗
+串
+到
+圆
+年
+米
+/
+*
+友
+忿
+检
+区
+看
+自
+敢
+刃
+个
+兹
+弄
+流
+留
+同
+没
+齿
+星
+聆
+轼
+湖
+什
+三
+建
+蛔
+儿
+椋
+汕
+震
+颧
+鲤
+跟
+力
+情
+璺
+铨
+陪
+务
+指
+族
+训
+滦
+鄣
+濮
+扒
+商
+箱
+十
+召
+慷
+辗
+所
+莞
+管
+护
+臭
+横
+硒
+嗓
+接
+侦
+六
+露
+党
+馋
+驾
+剖
+高
+侬
+妪
+幂
+猗
+绺
+骐
+央
+酐
+孝
+筝
+课
+徇
+缰
+门
+男
+西
+项
+句
+谙
+瞒
+秃
+篇
+教
+碲
+罚
+声
+呐
+景
+前
+富
+嘴
+鳌
+稀
+免
+朋
+啬
+睐
+去
+赈
+鱼
+住
+肩
+愕
+速
+旁
+波
+厅
+健
+茼
+厥
+鲟
+谅
+投
+攸
+炔
+数
+方
+击
+呋
+谈
+绩
+别
+愫
+僚
+躬
+鹧
+胪
+炳
+招
+喇
+膨
+泵
+蹦
+毛
+结
+5
+4
+谱
+识
+陕
+粽
+婚
+拟
+构
+且
+搜
+任
+潘
+比
+郢
+妨
+醪
+陀
+桔
+碘
+扎
+选
+哈
+骷
+楷
+亿
+明
+缆
+脯
+监
+睫
+逻
+婵
+共
+赴
+淝
+凡
+惦
+及
+达
+揖
+谩
+澹
+减
+焰
+蛹
+番
+祁
+柏
+员
+禄
+怡
+峤
+龙
+白
+叽
+生
+闯
+起
+细
+装
+谕
+竟
+聚
+钙
+上
+导
+渊
+按
+艾
+辘
+挡
+耒
+盹
+饪
+臀
+记
+邮
+蕙
+受
+各
+医
+搂
+普
+滇
+朗
+茸
+带
+翻
+酚
+(
+光
+堤
+墟
+蔷
+万
+幻
+〓
+瑙
+辈
+昧
+盏
+亘
+蛀
+吉
+铰
+请
+子
+假
+闻
+税
+井
+诩
+哨
+嫂
+好
+面
+琐
+校
+馊
+鬣
+缂
+营
+访
+炖
+占
+农
+缀
+否
+经
+钚
+棵
+趟
+张
+亟
+吏
+茶
+谨
+捻
+论
+迸
+堂
+玉
+信
+吧
+瞠
+乡
+姬
+寺
+咬
+溏
+苄
+皿
+意
+赉
+宝
+尔
+钰
+艺
+特
+唳
+踉
+都
+荣
+倚
+登
+荐
+丧
+奇
+涵
+批
+炭
+近
+符
+傩
+感
+道
+着
+菊
+虹
+仲
+众
+懈
+濯
+颞
+眺
+南
+释
+北
+缝
+标
+既
+茗
+整
+撼
+迤
+贲
+挎
+耱
+拒
+某
+妍
+卫
+哇
+英
+矶
+藩
+治
+他
+元
+领
+膜
+遮
+穗
+蛾
+飞
+荒
+棺
+劫
+么
+市
+火
+温
+拈
+棚
+洼
+转
+果
+奕
+卸
+迪
+伸
+泳
+斗
+邡
+侄
+涨
+屯
+萋
+胭
+氡
+崮
+枞
+惧
+冒
+彩
+斜
+手
+豚
+随
+旭
+淑
+妞
+形
+菌
+吲
+沱
+争
+驯
+歹
+挟
+兆
+柱
+传
+至
+包
+内
+响
+临
+红
+功
+弩
+衡
+寂
+禁
+老
+棍
+耆
+渍
+织
+害
+氵
+渑
+布
+载
+靥
+嗬
+虽
+苹
+咨
+娄
+库
+雉
+榜
+帜
+嘲
+套
+瑚
+亲
+簸
+欧
+边
+6
+腿
+旮
+抛
+吹
+瞳
+得
+镓
+梗
+厨
+继
+漾
+愣
+憨
+士
+策
+窑
+抑
+躯
+襟
+脏
+参
+贸
+言
+干
+绸
+鳄
+穷
+藜
+音
+折
+详
+)
+举
+悍
+甸
+癌
+黎
+谴
+死
+罩
+迁
+寒
+驷
+袖
+媒
+蒋
+掘
+模
+纠
+恣
+观
+祖
+蛆
+碍
+位
+稿
+主
+澧
+跌
+筏
+京
+锏
+帝
+贴
+证
+糠
+才
+黄
+鲸
+略
+炯
+饱
+四
+出
+园
+犀
+牧
+容
+汉
+杆
+浈
+汰
+瑷
+造
+虫
+瘩
+怪
+驴
+济
+应
+花
+沣
+谔
+夙
+旅
+价
+矿
+以
+考
+s
+u
+呦
+晒
+巡
+茅
+准
+肟
+瓴
+詹
+仟
+褂
+译
+桌
+混
+宁
+怦
+郑
+抿
+些
+余
+鄂
+饴
+攒
+珑
+群
+阖
+岔
+琨
+藓
+预
+环
+洮
+岌
+宀
+杲
+瀵
+最
+常
+囡
+周
+踊
+女
+鼓
+袭
+喉
+简
+范
+薯
+遐
+疏
+粱
+黜
+禧
+法
+箔
+斤
+遥
+汝
+奥
+直
+贞
+撑
+置
+绱
+集
+她
+馅
+逗
+钧
+橱
+魉
+[
+恙
+躁
+唤
+9
+旺
+膘
+待
+脾
+惫
+购
+吗
+依
+盲
+度
+瘿
+蠖
+俾
+之
+镗
+拇
+鲵
+厝
+簧
+续
+款
+展
+啃
+表
+剔
+品
+钻
+腭
+损
+清
+锶
+统
+涌
+寸
+滨
+贪
+链
+吠
+冈
+伎
+迥
+咏
+吁
+览
+防
+迅
+失
+汾
+阔
+逵
+绀
+蔑
+列
+川
+凭
+努
+熨
+揪
+利
+俱
+绉
+抢
+鸨
+我
+即
+责
+膦
+易
+毓
+鹊
+刹
+玷
+岿
+空
+嘞
+绊
+排
+术
+估
+锷
+违
+们
+苟
+铜
+播
+肘
+件
+烫
+审
+鲂
+广
+像
+铌
+惰
+铟
+巳
+胍
+鲍
+康
+憧
+色
+恢
+想
+拷
+尤
+疳
+知
+S
+Y
+F
+D
+A
+峄
+裕
+帮
+握
+搔
+氐
+氘
+难
+墒
+沮
+雨
+叁
+缥
+悴
+藐
+湫
+娟
+苑
+稠
+颛
+簇
+后
+阕
+闭
+蕤
+缚
+怎
+佞
+码
+嘤
+蔡
+痊
+舱
+螯
+帕
+赫
+昵
+升
+烬
+岫
+、
+疵
+蜻
+髁
+蕨
+隶
+烛
+械
+丑
+盂
+梁
+强
+鲛
+由
+拘
+揉
+劭
+龟
+撤
+钩
+呕
+孛
+费
+妻
+漂
+求
+阑
+崖
+秤
+甘
+通
+深
+补
+赃
+坎
+床
+啪
+承
+吼
+量
+暇
+钼
+烨
+阂
+擎
+脱
+逮
+称
+P
+神
+属
+矗
+华
+届
+狍
+葑
+汹
+育
+患
+窒
+蛰
+佼
+静
+槎
+运
+鳗
+庆
+逝
+曼
+疱
+克
+代
+官
+此
+麸
+耧
+蚌
+晟
+例
+础
+榛
+副
+测
+唰
+缢
+迹
+灬
+霁
+身
+岁
+赭
+扛
+又
+菡
+乜
+雾
+板
+读
+陷
+徉
+贯
+郁
+虑
+变
+钓
+菜
+圾
+现
+琢
+式
+乐
+维
+渔
+浜
+左
+吾
+脑
+钡
+警
+T
+啵
+拴
+偌
+漱
+湿
+硕
+止
+骼
+魄
+积
+燥
+联
+踢
+玛
+则
+窿
+见
+振
+畿
+送
+班
+钽
+您
+赵
+刨
+印
+讨
+踝
+籍
+谡
+舌
+崧
+汽
+蔽
+沪
+酥
+绒
+怖
+财
+帖
+肱
+私
+莎
+勋
+羔
+霸
+励
+哼
+帐
+将
+帅
+渠
+纪
+婴
+娩
+岭
+厘
+滕
+吻
+伤
+坝
+冠
+戊
+隆
+瘁
+介
+涧
+物
+黍
+并
+姗
+奢
+蹑
+掣
+垸
+锴
+命
+箍
+捉
+病
+辖
+琰
+眭
+迩
+艘
+绌
+繁
+寅
+若
+毋
+思
+诉
+类
+诈
+燮
+轲
+酮
+狂
+重
+反
+职
+筱
+县
+委
+磕
+绣
+奖
+晋
+濉
+志
+徽
+肠
+呈
+獐
+坻
+口
+片
+碰
+几
+村
+柿
+劳
+料
+获
+亩
+惕
+晕
+厌
+号
+罢
+池
+正
+鏖
+煨
+家
+棕
+复
+尝
+懋
+蜥
+锅
+岛
+扰
+队
+坠
+瘾
+钬
+@
+卧
+疣
+镇
+譬
+冰
+彷
+频
+黯
+据
+垄
+采
+八
+缪
+瘫
+型
+熹
+砰
+楠
+襁
+箐
+但
+嘶
+绳
+啤
+拍
+盥
+穆
+傲
+洗
+盯
+塘
+怔
+筛
+丿
+台
+恒
+喂
+葛
+永
+¥
+烟
+酒
+桦
+书
+砂
+蚝
+缉
+态
+瀚
+袄
+圳
+轻
+蛛
+超
+榧
+遛
+姒
+奘
+铮
+右
+荽
+望
+偻
+卡
+丶
+氰
+附
+做
+革
+索
+戚
+坨
+桷
+唁
+垅
+榻
+岐
+偎
+坛
+莨
+山
+殊
+微
+骇
+陈
+爨
+推
+嗝
+驹
+澡
+藁
+呤
+卤
+嘻
+糅
+逛
+侵
+郓
+酌
+德
+摇
+※
+鬃
+被
+慨
+殡
+羸
+昌
+泡
+戛
+鞋
+河
+宪
+沿
+玲
+鲨
+翅
+哽
+源
+铅
+语
+照
+邯
+址
+荃
+佬
+顺
+鸳
+町
+霭
+睾
+瓢
+夸
+椁
+晓
+酿
+痈
+咔
+侏
+券
+噎
+湍
+签
+嚷
+离
+午
+尚
+社
+锤
+背
+孟
+使
+浪
+缦
+潍
+鞅
+军
+姹
+驶
+笑
+鳟
+鲁
+》
+孽
+钜
+绿
+洱
+礴
+焯
+椰
+颖
+囔
+乌
+孔
+巴
+互
+性
+椽
+哞
+聘
+昨
+早
+暮
+胶
+炀
+隧
+低
+彗
+昝
+铁
+呓
+氽
+藉
+喔
+癖
+瑗
+姨
+权
+胱
+韦
+堑
+蜜
+酋
+楝
+砝
+毁
+靓
+歙
+锲
+究
+屋
+喳
+骨
+辨
+碑
+武
+鸠
+宫
+辜
+烊
+适
+坡
+殃
+培
+佩
+供
+走
+蜈
+迟
+翼
+况
+姣
+凛
+浔
+吃
+飘
+债
+犟
+金
+促
+苛
+崇
+坂
+莳
+畔
+绂
+兵
+蠕
+斋
+根
+砍
+亢
+欢
+恬
+崔
+剁
+餐
+榫
+快
+扶
+‖
+濒
+缠
+鳜
+当
+彭
+驭
+浦
+篮
+昀
+锆
+秸
+钳
+弋
+娣
+瞑
+夷
+龛
+苫
+拱
+致
+%
+嵊
+障
+隐
+弑
+初
+娓
+抉
+汩
+累
+蓖
+"
+唬
+助
+苓
+昙
+押
+毙
+破
+城
+郧
+逢
+嚏
+獭
+瞻
+溱
+婿
+赊
+跨
+恼
+璧
+萃
+姻
+貉
+灵
+炉
+密
+氛
+陶
+砸
+谬
+衔
+点
+琛
+沛
+枳
+层
+岱
+诺
+脍
+榈
+埂
+征
+冷
+裁
+打
+蹴
+素
+瘘
+逞
+蛐
+聊
+激
+腱
+萘
+踵
+飒
+蓟
+吆
+取
+咙
+簋
+涓
+矩
+曝
+挺
+揣
+座
+你
+史
+舵
+焱
+尘
+苏
+笈
+脚
+溉
+榨
+诵
+樊
+邓
+焊
+义
+庶
+儋
+蟋
+蒲
+赦
+呷
+杞
+诠
+豪
+还
+试
+颓
+茉
+太
+除
+紫
+逃
+痴
+草
+充
+鳕
+珉
+祗
+墨
+渭
+烩
+蘸
+慕
+璇
+镶
+穴
+嵘
+恶
+骂
+险
+绋
+幕
+碉
+肺
+戳
+刘
+潞
+秣
+纾
+潜
+銮
+洛
+须
+罘
+销
+瘪
+汞
+兮
+屉
+r
+林
+厕
+质
+探
+划
+狸
+殚
+善
+煊
+烹
+〒
+锈
+逯
+宸
+辍
+泱
+柚
+袍
+远
+蹋
+嶙
+绝
+峥
+娥
+缍
+雀
+徵
+认
+镱
+谷
+=
+贩
+勉
+撩
+鄯
+斐
+洋
+非
+祚
+泾
+诒
+饿
+撬
+威
+晷
+搭
+芍
+锥
+笺
+蓦
+候
+琊
+档
+礁
+沼
+卵
+荠
+忑
+朝
+凹
+瑞
+头
+仪
+弧
+孵
+畏
+铆
+突
+衲
+车
+浩
+气
+茂
+悖
+厢
+枕
+酝
+戴
+湾
+邹
+飚
+攘
+锂
+写
+宵
+翁
+岷
+无
+喜
+丈
+挑
+嗟
+绛
+殉
+议
+槽
+具
+醇
+淞
+笃
+郴
+阅
+饼
+底
+壕
+砚
+弈
+询
+缕
+庹
+翟
+零
+筷
+暨
+舟
+闺
+甯
+撞
+麂
+茌
+蔼
+很
+珲
+捕
+棠
+角
+阉
+媛
+娲
+诽
+剿
+尉
+爵
+睬
+韩
+诰
+匣
+危
+糍
+镯
+立
+浏
+阳
+少
+盆
+舔
+擘
+匪
+申
+尬
+铣
+旯
+抖
+赘
+瓯
+居
+ˇ
+哮
+游
+锭
+茏
+歌
+坏
+甚
+秒
+舞
+沙
+仗
+劲
+潺
+阿
+燧
+郭
+嗖
+霏
+忠
+材
+奂
+耐
+跺
+砀
+输
+岖
+媳
+氟
+极
+摆
+灿
+今
+扔
+腻
+枝
+奎
+药
+熄
+吨
+话
+q
+额
+慑
+嘌
+协
+喀
+壳
+埭
+视
+著
+於
+愧
+陲
+翌
+峁
+颅
+佛
+腹
+聋
+侯
+咎
+叟
+秀
+颇
+存
+较
+罪
+哄
+岗
+扫
+栏
+钾
+羌
+己
+璨
+枭
+霉
+煌
+涸
+衿
+键
+镝
+益
+岢
+奏
+连
+夯
+睿
+冥
+均
+糖
+狞
+蹊
+稻
+爸
+刿
+胥
+煜
+丽
+肿
+璃
+掸
+跚
+灾
+垂
+樾
+濑
+乎
+莲
+窄
+犹
+撮
+战
+馄
+软
+络
+显
+鸢
+胸
+宾
+妲
+恕
+埔
+蝌
+份
+遇
+巧
+瞟
+粒
+恰
+剥
+桡
+博
+讯
+凯
+堇
+阶
+滤
+卖
+斌
+骚
+彬
+兑
+磺
+樱
+舷
+两
+娱
+福
+仃
+差
+找
+桁
+÷
+净
+把
+阴
+污
+戬
+雷
+碓
+蕲
+楚
+罡
+焖
+抽
+妫
+咒
+仑
+闱
+尽
+邑
+菁
+爱
+贷
+沥
+鞑
+牡
+嗉
+崴
+骤
+塌
+嗦
+订
+拮
+滓
+捡
+锻
+次
+坪
+杩
+臃
+箬
+融
+珂
+鹗
+宗
+枚
+降
+鸬
+妯
+阄
+堰
+盐
+毅
+必
+杨
+崃
+俺
+甬
+状
+莘
+货
+耸
+菱
+腼
+铸
+唏
+痤
+孚
+澳
+懒
+溅
+翘
+疙
+杷
+淼
+缙
+骰
+喊
+悉
+砻
+坷
+艇
+赁
+界
+谤
+纣
+宴
+晃
+茹
+归
+饭
+梢
+铡
+街
+抄
+肼
+鬟
+苯
+颂
+撷
+戈
+炒
+咆
+茭
+瘙
+负
+仰
+客
+琉
+铢
+封
+卑
+珥
+椿
+镧
+窨
+鬲
+寿
+御
+袤
+铃
+萎
+砖
+餮
+脒
+裳
+肪
+孕
+嫣
+馗
+嵇
+恳
+氯
+江
+石
+褶
+冢
+祸
+阻
+狈
+羞
+银
+靳
+透
+咳
+叼
+敷
+芷
+啥
+它
+瓤
+兰
+痘
+懊
+逑
+肌
+往
+捺
+坊
+甩
+呻
+〃
+沦
+忘
+膻
+祟
+菅
+剧
+崆
+智
+坯
+臧
+霍
+墅
+攻
+眯
+倘
+拢
+骠
+铐
+庭
+岙
+瓠
+′
+缺
+泥
+迢
+捶
+?
+?
+郏
+喙
+掷
+沌
+纯
+秘
+种
+听
+绘
+固
+螨
+团
+香
+盗
+妒
+埚
+蓝
+拖
+旱
+荞
+铀
+血
+遏
+汲
+辰
+叩
+拽
+幅
+硬
+惶
+桀
+漠
+措
+泼
+唑
+齐
+肾
+念
+酱
+虚
+屁
+耶
+旗
+砦
+闵
+婉
+馆
+拭
+绅
+韧
+忏
+窝
+醋
+葺
+顾
+辞
+倜
+堆
+辋
+逆
+玟
+贱
+疾
+董
+惘
+倌
+锕
+淘
+嘀
+莽
+俭
+笏
+绑
+鲷
+杈
+择
+蟀
+粥
+嗯
+驰
+逾
+案
+谪
+褓
+胫
+哩
+昕
+颚
+鲢
+绠
+躺
+鹄
+崂
+儒
+俨
+丝
+尕
+泌
+啊
+萸
+彰
+幺
+吟
+骄
+苣
+弦
+脊
+瑰
+〈
+诛
+镁
+析
+闪
+剪
+侧
+哟
+框
+螃
+守
+嬗
+燕
+狭
+铈
+缮
+概
+迳
+痧
+鲲
+俯
+售
+笼
+痣
+扉
+挖
+满
+咋
+援
+邱
+扇
+歪
+便
+玑
+绦
+峡
+蛇
+叨
+〖
+泽
+胃
+斓
+喋
+怂
+坟
+猪
+该
+蚬
+炕
+弥
+赞
+棣
+晔
+娠
+挲
+狡
+创
+疖
+铕
+镭
+稷
+挫
+弭
+啾
+翔
+粉
+履
+苘
+哦
+楼
+秕
+铂
+土
+锣
+瘟
+挣
+栉
+习
+享
+桢
+袅
+磨
+桂
+谦
+延
+坚
+蔚
+噗
+署
+谟
+猬
+钎
+恐
+嬉
+雒
+倦
+衅
+亏
+璩
+睹
+刻
+殿
+王
+算
+雕
+麻
+丘
+柯
+骆
+丸
+塍
+谚
+添
+鲈
+垓
+桎
+蚯
+芥
+予
+飕
+镦
+谌
+窗
+醚
+菀
+亮
+搪
+莺
+蒿
+羁
+足
+J
+真
+轶
+悬
+衷
+靛
+翊
+掩
+哒
+炅
+掐
+冼
+妮
+l
+谐
+稚
+荆
+擒
+犯
+陵
+虏
+浓
+崽
+刍
+陌
+傻
+孜
+千
+靖
+演
+矜
+钕
+煽
+杰
+酗
+渗
+伞
+栋
+俗
+泫
+戍
+罕
+沾
+疽
+灏
+煦
+芬
+磴
+叱
+阱
+榉
+湃
+蜀
+叉
+醒
+彪
+租
+郡
+篷
+屎
+良
+垢
+隗
+弱
+陨
+峪
+砷
+掴
+颁
+胎
+雯
+绵
+贬
+沐
+撵
+隘
+篙
+暖
+曹
+陡
+栓
+填
+臼
+彦
+瓶
+琪
+潼
+哪
+鸡
+摩
+啦
+俟
+锋
+域
+耻
+蔫
+疯
+纹
+撇
+毒
+绶
+痛
+酯
+忍
+爪
+赳
+歆
+嘹
+辕
+烈
+册
+朴
+钱
+吮
+毯
+癜
+娃
+谀
+邵
+厮
+炽
+璞
+邃
+丐
+追
+词
+瓒
+忆
+轧
+芫
+谯
+喷
+弟
+半
+冕
+裙
+掖
+墉
+绮
+寝
+苔
+势
+顷
+褥
+切
+衮
+君
+佳
+嫒
+蚩
+霞
+佚
+洙
+逊
+镖
+暹
+唛
+&
+殒
+顶
+碗
+獗
+轭
+铺
+蛊
+废
+恹
+汨
+崩
+珍
+那
+杵
+曲
+纺
+夏
+薰
+傀
+闳
+淬
+姘
+舀
+拧
+卷
+楂
+恍
+讪
+厩
+寮
+篪
+赓
+乘
+灭
+盅
+鞣
+沟
+慎
+挂
+饺
+鼾
+杳
+树
+缨
+丛
+絮
+娌
+臻
+嗳
+篡
+侩
+述
+衰
+矛
+圈
+蚜
+匕
+筹
+匿
+濞
+晨
+叶
+骋
+郝
+挚
+蚴
+滞
+增
+侍
+描
+瓣
+吖
+嫦
+蟒
+匾
+圣
+赌
+毡
+癞
+恺
+百
+曳
+需
+篓
+肮
+庖
+帏
+卿
+驿
+遗
+蹬
+鬓
+骡
+歉
+芎
+胳
+屐
+禽
+烦
+晌
+寄
+媾
+狄
+翡
+苒
+船
+廉
+终
+痞
+殇
+々
+畦
+饶
+改
+拆
+悻
+萄
+£
+瓿
+乃
+訾
+桅
+匮
+溧
+拥
+纱
+铍
+骗
+蕃
+龋
+缬
+父
+佐
+疚
+栎
+醍
+掳
+蓄
+x
+惆
+颜
+鲆
+榆
+〔
+猎
+敌
+暴
+谥
+鲫
+贾
+罗
+玻
+缄
+扦
+芪
+癣
+落
+徒
+臾
+恿
+猩
+托
+邴
+肄
+牵
+春
+陛
+耀
+刊
+拓
+蓓
+邳
+堕
+寇
+枉
+淌
+啡
+湄
+兽
+酷
+萼
+碚
+濠
+萤
+夹
+旬
+戮
+梭
+琥
+椭
+昔
+勺
+蜊
+绐
+晚
+孺
+僵
+宣
+摄
+冽
+旨
+萌
+忙
+蚤
+眉
+噼
+蟑
+付
+契
+瓜
+悼
+颡
+壁
+曾
+窕
+颢
+澎
+仿
+俑
+浑
+嵌
+浣
+乍
+碌
+褪
+乱
+蔟
+隙
+玩
+剐
+葫
+箫
+纲
+围
+伐
+决
+伙
+漩
+瑟
+刑
+肓
+镳
+缓
+蹭
+氨
+皓
+典
+畲
+坍
+铑
+檐
+塑
+洞
+倬
+储
+胴
+淳
+戾
+吐
+灼
+惺
+妙
+毕
+珐
+缈
+虱
+盖
+羰
+鸿
+磅
+谓
+髅
+娴
+苴
+唷
+蚣
+霹
+抨
+贤
+唠
+犬
+誓
+逍
+庠
+逼
+麓
+籼
+釉
+呜
+碧
+秧
+氩
+摔
+霄
+穸
+纨
+辟
+妈
+映
+完
+牛
+缴
+嗷
+炊
+恩
+荔
+茆
+掉
+紊
+慌
+莓
+羟
+阙
+萁
+磐
+另
+蕹
+辱
+鳐
+湮
+吡
+吩
+唐
+睦
+垠
+舒
+圜
+冗
+瞿
+溺
+芾
+囱
+匠
+僳
+汐
+菩
+饬
+漓
+黑
+霰
+浸
+濡
+窥
+毂
+蒡
+兢
+驻
+鹉
+芮
+诙
+迫
+雳
+厂
+忐
+臆
+猴
+鸣
+蚪
+栈
+箕
+羡
+渐
+莆
+捍
+眈
+哓
+趴
+蹼
+埕
+嚣
+骛
+宏
+淄
+斑
+噜
+严
+瑛
+垃
+椎
+诱
+压
+庾
+绞
+焘
+廿
+抡
+迄
+棘
+夫
+纬
+锹
+眨
+瞌
+侠
+脐
+竞
+瀑
+孳
+骧
+遁
+姜
+颦
+荪
+滚
+萦
+伪
+逸
+粳
+爬
+锁
+矣
+役
+趣
+洒
+颔
+诏
+逐
+奸
+甭
+惠
+攀
+蹄
+泛
+尼
+拼
+阮
+鹰
+亚
+颈
+惑
+勒
+〉
+际
+肛
+爷
+刚
+钨
+丰
+养
+冶
+鲽
+辉
+蔻
+画
+覆
+皴
+妊
+麦
+返
+醉
+皂
+擀
+〗
+酶
+凑
+粹
+悟
+诀
+硖
+港
+卜
+z
+杀
+涕
+±
+舍
+铠
+抵
+弛
+段
+敝
+镐
+奠
+拂
+轴
+跛
+袱
+e
+t
+沉
+菇
+俎
+薪
+峦
+秭
+蟹
+历
+盟
+菠
+寡
+液
+肢
+喻
+染
+裱
+悱
+抱
+氙
+赤
+捅
+猛
+跑
+氮
+谣
+仁
+尺
+辊
+窍
+烙
+衍
+架
+擦
+倏
+璐
+瑁
+币
+楞
+胖
+夔
+趸
+邛
+惴
+饕
+虔
+蝎
+§
+哉
+贝
+宽
+辫
+炮
+扩
+饲
+籽
+魏
+菟
+锰
+伍
+猝
+末
+琳
+哚
+蛎
+邂
+呀
+姿
+鄞
+却
+歧
+仙
+恸
+椐
+森
+牒
+寤
+袒
+婆
+虢
+雅
+钉
+朵
+贼
+欲
+苞
+寰
+故
+龚
+坭
+嘘
+咫
+礼
+硷
+兀
+睢
+汶
+’
+铲
+烧
+绕
+诃
+浃
+钿
+哺
+柜
+讼
+颊
+璁
+腔
+洽
+咐
+脲
+簌
+筠
+镣
+玮
+鞠
+谁
+兼
+姆
+挥
+梯
+蝴
+谘
+漕
+刷
+躏
+宦
+弼
+b
+垌
+劈
+麟
+莉
+揭
+笙
+渎
+仕
+嗤
+仓
+配
+怏
+抬
+错
+泯
+镊
+孰
+猿
+邪
+仍
+秋
+鼬
+壹
+歇
+吵
+炼
+<
+尧
+射
+柬
+廷
+胧
+霾
+凳
+隋
+肚
+浮
+梦
+祥
+株
+堵
+退
+L
+鹫
+跎
+凶
+毽
+荟
+炫
+栩
+玳
+甜
+沂
+鹿
+顽
+伯
+爹
+赔
+蛴
+徐
+匡
+欣
+狰
+缸
+雹
+蟆
+疤
+默
+沤
+啜
+痂
+衣
+禅
+w
+i
+h
+辽
+葳
+黝
+钗
+停
+沽
+棒
+馨
+颌
+肉
+吴
+硫
+悯
+劾
+娈
+马
+啧
+吊
+悌
+镑
+峭
+帆
+瀣
+涉
+咸
+疸
+滋
+泣
+翦
+拙
+癸
+钥
+蜒
++
+尾
+庄
+凝
+泉
+婢
+渴
+谊
+乞
+陆
+锉
+糊
+鸦
+淮
+I
+B
+N
+晦
+弗
+乔
+庥
+葡
+尻
+席
+橡
+傣
+渣
+拿
+惩
+麋
+斛
+缃
+矮
+蛏
+岘
+鸽
+姐
+膏
+催
+奔
+镒
+喱
+蠡
+摧
+钯
+胤
+柠
+拐
+璋
+鸥
+卢
+荡
+倾
+^
+_
+珀
+逄
+萧
+塾
+掇
+贮
+笆
+聂
+圃
+冲
+嵬
+M
+滔
+笕
+值
+炙
+偶
+蜱
+搐
+梆
+汪
+蔬
+腑
+鸯
+蹇
+敞
+绯
+仨
+祯
+谆
+梧
+糗
+鑫
+啸
+豺
+囹
+猾
+巢
+柄
+瀛
+筑
+踌
+沭
+暗
+苁
+鱿
+蹉
+脂
+蘖
+牢
+热
+木
+吸
+溃
+宠
+序
+泞
+偿
+拜
+檩
+厚
+朐
+毗
+螳
+吞
+媚
+朽
+担
+蝗
+橘
+畴
+祈
+糟
+盱
+隼
+郜
+惜
+珠
+裨
+铵
+焙
+琚
+唯
+咚
+噪
+骊
+丫
+滢
+勤
+棉
+呸
+咣
+淀
+隔
+蕾
+窈
+饨
+挨
+煅
+短
+匙
+粕
+镜
+赣
+撕
+墩
+酬
+馁
+豌
+颐
+抗
+酣
+氓
+佑
+搁
+哭
+递
+耷
+涡
+桃
+贻
+碣
+截
+瘦
+昭
+镌
+蔓
+氚
+甲
+猕
+蕴
+蓬
+散
+拾
+纛
+狼
+猷
+铎
+埋
+旖
+矾
+讳
+囊
+糜
+迈
+粟
+蚂
+紧
+鲳
+瘢
+栽
+稼
+羊
+锄
+斟
+睁
+桥
+瓮
+蹙
+祉
+醺
+鼻
+昱
+剃
+跳
+篱
+跷
+蒜
+翎
+宅
+晖
+嗑
+壑
+峻
+癫
+屏
+狠
+陋
+袜
+途
+憎
+祀
+莹
+滟
+佶
+溥
+臣
+约
+盛
+峰
+磁
+慵
+婪
+拦
+莅
+朕
+鹦
+粲
+裤
+哎
+疡
+嫖
+琵
+窟
+堪
+谛
+嘉
+儡
+鳝
+斩
+郾
+驸
+酊
+妄
+胜
+贺
+徙
+傅
+噌
+钢
+栅
+庇
+恋
+匝
+巯
+邈
+尸
+锚
+粗
+佟
+蛟
+薹
+纵
+蚊
+郅
+绢
+锐
+苗
+俞
+篆
+淆
+膀
+鲜
+煎
+诶
+秽
+寻
+涮
+刺
+怀
+噶
+巨
+褰
+魅
+灶
+灌
+桉
+藕
+谜
+舸
+薄
+搀
+恽
+借
+牯
+痉
+渥
+愿
+亓
+耘
+杠
+柩
+锔
+蚶
+钣
+珈
+喘
+蹒
+幽
+赐
+稗
+晤
+莱
+泔
+扯
+肯
+菪
+裆
+腩
+豉
+疆
+骜
+腐
+倭
+珏
+唔
+粮
+亡
+润
+慰
+伽
+橄
+玄
+誉
+醐
+胆
+龊
+粼
+塬
+陇
+彼
+削
+嗣
+绾
+芽
+妗
+垭
+瘴
+爽
+薏
+寨
+龈
+泠
+弹
+赢
+漪
+猫
+嘧
+涂
+恤
+圭
+茧
+烽
+屑
+痕
+巾
+赖
+荸
+凰
+腮
+畈
+亵
+蹲
+偃
+苇
+澜
+艮
+换
+骺
+烘
+苕
+梓
+颉
+肇
+哗
+悄
+氤
+涠
+葬
+屠
+鹭
+植
+竺
+佯
+诣
+鲇
+瘀
+鲅
+邦
+移
+滁
+冯
+耕
+癔
+戌
+茬
+沁
+巩
+悠
+湘
+洪
+痹
+锟
+循
+谋
+腕
+鳃
+钠
+捞
+焉
+迎
+碱
+伫
+急
+榷
+奈
+邝
+卯
+辄
+皲
+卟
+醛
+畹
+忧
+稳
+雄
+昼
+缩
+阈
+睑
+扌
+耗
+曦
+涅
+捏
+瞧
+邕
+淖
+漉
+铝
+耦
+禹
+湛
+喽
+莼
+琅
+诸
+苎
+纂
+硅
+始
+嗨
+傥
+燃
+臂
+赅
+嘈
+呆
+贵
+屹
+壮
+肋
+亍
+蚀
+卅
+豹
+腆
+邬
+迭
+浊
+}
+童
+螂
+捐
+圩
+勐
+触
+寞
+汊
+壤
+荫
+膺
+渌
+芳
+懿
+遴
+螈
+泰
+蓼
+蛤
+茜
+舅
+枫
+朔
+膝
+眙
+避
+梅
+判
+鹜
+璜
+牍
+缅
+垫
+藻
+黔
+侥
+惚
+懂
+踩
+腰
+腈
+札
+丞
+唾
+慈
+顿
+摹
+荻
+琬
+~
+斧
+沈
+滂
+胁
+胀
+幄
+莜
+Z
+匀
+鄄
+掌
+绰
+茎
+焚
+赋
+萱
+谑
+汁
+铒
+瞎
+夺
+蜗
+野
+娆
+冀
+弯
+篁
+懵
+灞
+隽
+芡
+脘
+俐
+辩
+芯
+掺
+喏
+膈
+蝈
+觐
+悚
+踹
+蔗
+熠
+鼠
+呵
+抓
+橼
+峨
+畜
+缔
+禾
+崭
+弃
+熊
+摒
+凸
+拗
+穹
+蒙
+抒
+祛
+劝
+闫
+扳
+阵
+醌
+踪
+喵
+侣
+搬
+仅
+荧
+赎
+蝾
+琦
+买
+婧
+瞄
+寓
+皎
+冻
+赝
+箩
+莫
+瞰
+郊
+笫
+姝
+筒
+枪
+遣
+煸
+袋
+舆
+痱
+涛
+母
+〇
+启
+践
+耙
+绲
+盘
+遂
+昊
+搞
+槿
+诬
+纰
+泓
+惨
+檬
+亻
+越
+C
+o
+憩
+熵
+祷
+钒
+暧
+塔
+阗
+胰
+咄
+娶
+魔
+琶
+钞
+邻
+扬
+杉
+殴
+咽
+弓
+〆
+髻
+】
+吭
+揽
+霆
+拄
+殖
+脆
+彻
+岩
+芝
+勃
+辣
+剌
+钝
+嘎
+甄
+佘
+皖
+伦
+授
+徕
+憔
+挪
+皇
+庞
+稔
+芜
+踏
+溴
+兖
+卒
+擢
+饥
+鳞
+煲
+‰
+账
+颗
+叻
+斯
+捧
+鳍
+琮
+讹
+蛙
+纽
+谭
+酸
+兔
+莒
+睇
+伟
+觑
+羲
+嗜
+宜
+褐
+旎
+辛
+卦
+诘
+筋
+鎏
+溪
+挛
+熔
+阜
+晰
+鳅
+丢
+奚
+灸
+呱
+献
+陉
+黛
+鸪
+甾
+萨
+疮
+拯
+洲
+疹
+辑
+叙
+恻
+谒
+允
+柔
+烂
+氏
+逅
+漆
+拎
+惋
+扈
+湟
+纭
+啕
+掬
+擞
+哥
+忽
+涤
+鸵
+靡
+郗
+瓷
+扁
+廊
+怨
+雏
+钮
+敦
+E
+懦
+憋
+汀
+拚
+啉
+腌
+岸
+f
+痼
+瞅
+尊
+咀
+眩
+飙
+忌
+仝
+迦
+熬
+毫
+胯
+篑
+茄
+腺
+凄
+舛
+碴
+锵
+诧
+羯
+後
+漏
+汤
+宓
+仞
+蚁
+壶
+谰
+皑
+铄
+棰
+罔
+辅
+晶
+苦
+牟
+闽
+\
+烃
+饮
+聿
+丙
+蛳
+朱
+煤
+涔
+鳖
+犁
+罐
+荼
+砒
+淦
+妤
+黏
+戎
+孑
+婕
+瑾
+戢
+钵
+枣
+捋
+砥
+衩
+狙
+桠
+稣
+阎
+肃
+梏
+诫
+孪
+昶
+婊
+衫
+嗔
+侃
+塞
+蜃
+樵
+峒
+貌
+屿
+欺
+缫
+阐
+栖
+诟
+珞
+荭
+吝
+萍
+嗽
+恂
+啻
+蜴
+磬
+峋
+俸
+豫
+谎
+徊
+镍
+韬
+魇
+晴
+U
+囟
+猜
+蛮
+坐
+囿
+伴
+亭
+肝
+佗
+蝠
+妃
+胞
+滩
+榴
+氖
+垩
+苋
+砣
+扪
+馏
+姓
+轩
+厉
+夥
+侈
+禀
+垒
+岑
+赏
+钛
+辐
+痔
+披
+纸
+碳
+“
+坞
+蠓
+挤
+荥
+沅
+悔
+铧
+帼
+蒌
+蝇
+a
+p
+y
+n
+g
+哀
+浆
+瑶
+凿
+桶
+馈
+皮
+奴
+苜
+佤
+伶
+晗
+铱
+炬
+优
+弊
+氢
+恃
+甫
+攥
+端
+锌
+灰
+稹
+炝
+曙
+邋
+亥
+眶
+碾
+拉
+萝
+绔
+捷
+浍
+腋
+姑
+菖
+凌
+涞
+麽
+锢
+桨
+潢
+绎
+镰
+殆
+锑
+渝
+铬
+困
+绽
+觎
+匈
+糙
+暑
+裹
+鸟
+盔
+肽
+迷
+綦
+『
+亳
+佝
+俘
+钴
+觇
+骥
+仆
+疝
+跪
+婶
+郯
+瀹
+唉
+脖
+踞
+针
+晾
+忒
+扼
+瞩
+叛
+椒
+疟
+嗡
+邗
+肆
+跆
+玫
+忡
+捣
+咧
+唆
+艄
+蘑
+潦
+笛
+阚
+沸
+泻
+掊
+菽
+贫
+斥
+髂
+孢
+镂
+赂
+麝
+鸾
+屡
+衬
+苷
+恪
+叠
+希
+粤
+爻
+喝
+茫
+惬
+郸
+绻
+庸
+撅
+碟
+宄
+妹
+膛
+叮
+饵
+崛
+嗲
+椅
+冤
+搅
+咕
+敛
+尹
+垦
+闷
+蝉
+霎
+勰
+败
+蓑
+泸
+肤
+鹌
+幌
+焦
+浠
+鞍
+刁
+舰
+乙
+竿
+裔
+。
+茵
+函
+伊
+兄
+丨
+娜
+匍
+謇
+莪
+宥
+似
+蝽
+翳
+酪
+翠
+粑
+薇
+祢
+骏
+赠
+叫
+Q
+噤
+噻
+竖
+芗
+莠
+潭
+俊
+羿
+耜
+O
+郫
+趁
+嗪
+囚
+蹶
+芒
+洁
+笋
+鹑
+敲
+硝
+啶
+堡
+渲
+揩
+』
+携
+宿
+遒
+颍
+扭
+棱
+割
+萜
+蔸
+葵
+琴
+捂
+饰
+衙
+耿
+掠
+募
+岂
+窖
+涟
+蔺
+瘤
+柞
+瞪
+怜
+匹
+距
+楔
+炜
+哆
+秦
+缎
+幼
+茁
+绪
+痨
+恨
+楸
+娅
+瓦
+桩
+雪
+嬴
+伏
+榔
+妥
+铿
+拌
+眠
+雍
+缇
+‘
+卓
+搓
+哌
+觞
+噩
+屈
+哧
+髓
+咦
+巅
+娑
+侑
+淫
+膳
+祝
+勾
+姊
+莴
+胄
+疃
+薛
+蜷
+胛
+巷
+芙
+芋
+熙
+闰
+勿
+窃
+狱
+剩
+钏
+幢
+陟
+铛
+慧
+靴
+耍
+k
+浙
+浇
+飨
+惟
+绗
+祜
+澈
+啼
+咪
+磷
+摞
+诅
+郦
+抹
+跃
+壬
+吕
+肖
+琏
+颤
+尴
+剡
+抠
+凋
+赚
+泊
+津
+宕
+殷
+倔
+氲
+漫
+邺
+涎
+怠
+$
+垮
+荬
+遵
+俏
+叹
+噢
+饽
+蜘
+孙
+筵
+疼
+鞭
+羧
+牦
+箭
+潴
+c
+眸
+祭
+髯
+啖
+坳
+愁
+芩
+驮
+倡
+巽
+穰
+沃
+胚
+怒
+凤
+槛
+剂
+趵
+嫁
+v
+邢
+灯
+鄢
+桐
+睽
+檗
+锯
+槟
+婷
+嵋
+圻
+诗
+蕈
+颠
+遭
+痢
+芸
+怯
+馥
+竭
+锗
+徜
+恭
+遍
+籁
+剑
+嘱
+苡
+龄
+僧
+桑
+潸
+弘
+澶
+楹
+悲
+讫
+愤
+腥
+悸
+谍
+椹
+呢
+桓
+葭
+攫
+阀
+翰
+躲
+敖
+柑
+郎
+笨
+橇
+呃
+魁
+燎
+脓
+葩
+磋
+垛
+玺
+狮
+沓
+砜
+蕊
+锺
+罹
+蕉
+翱
+虐
+闾
+巫
+旦
+茱
+嬷
+枯
+鹏
+贡
+芹
+汛
+矫
+绁
+拣
+禺
+佃
+讣
+舫
+惯
+乳
+趋
+疲
+挽
+岚
+虾
+衾
+蠹
+蹂
+飓
+氦
+铖
+孩
+稞
+瑜
+壅
+掀
+勘
+妓
+畅
+髋
+W
+庐
+牲
+蓿
+榕
+练
+垣
+唱
+邸
+菲
+昆
+婺
+穿
+绡
+麒
+蚱
+掂
+愚
+泷
+涪
+漳
+妩
+娉
+榄
+讷
+觅
+旧
+藤
+煮
+呛
+柳
+腓
+叭
+庵
+烷
+阡
+罂
+蜕
+擂
+猖
+咿
+媲
+脉
+【
+沏
+貅
+黠
+熏
+哲
+烁
+坦
+酵
+兜
+×
+潇
+撒
+剽
+珩
+圹
+乾
+摸
+樟
+帽
+嗒
+襄
+魂
+轿
+憬
+锡
+〕
+喃
+皆
+咖
+隅
+脸
+残
+泮
+袂
+鹂
+珊
+囤
+捆
+咤
+误
+徨
+闹
+淙
+芊
+淋
+怆
+囗
+拨
+梳
+渤
+R
+G
+绨
+蚓
+婀
+幡
+狩
+麾
+谢
+唢
+裸
+旌
+伉
+纶
+裂
+驳
+砼
+咛
+澄
+樨
+蹈
+宙
+澍
+倍
+貔
+操
+勇
+蟠
+摈
+砧
+虬
+够
+缁
+悦
+藿
+撸
+艹
+摁
+淹
+豇
+虎
+榭
+ˉ
+吱
+d
+°
+喧
+荀
+踱
+侮
+奋
+偕
+饷
+犍
+惮
+坑
+璎
+徘
+宛
+妆
+袈
+倩
+窦
+昂
+荏
+乖
+K
+怅
+撰
+鳙
+牙
+袁
+酞
+X
+痿
+琼
+闸
+雁
+趾
+荚
+虻
+涝
+《
+杏
+韭
+偈
+烤
+绫
+鞘
+卉
+症
+遢
+蓥
+诋
+杭
+荨
+匆
+竣
+簪
+辙
+敕
+虞
+丹
+缭
+咩
+黟
+m
+淤
+瑕
+咂
+铉
+硼
+茨
+嶂
+痒
+畸
+敬
+涿
+粪
+窘
+熟
+叔
+嫔
+盾
+忱
+裘
+憾
+梵
+赡
+珙
+咯
+娘
+庙
+溯
+胺
+葱
+痪
+摊
+荷
+卞
+乒
+髦
+寐
+铭
+坩
+胗
+枷
+爆
+溟
+嚼
+羚
+砬
+轨
+惊
+挠
+罄
+竽
+菏
+氧
+浅
+楣
+盼
+枢
+炸
+阆
+杯
+谏
+噬
+淇
+渺
+俪
+秆
+墓
+泪
+跻
+砌
+痰
+垡
+渡
+耽
+釜
+讶
+鳎
+煞
+呗
+韶
+舶
+绷
+鹳
+缜
+旷
+铊
+皱
+龌
+檀
+霖
+奄
+槐
+艳
+蝶
+旋
+哝
+赶
+骞
+蚧
+腊
+盈
+丁
+`
+蜚
+矸
+蝙
+睨
+嚓
+僻
+鬼
+醴
+夜
+彝
+磊
+笔
+拔
+栀
+糕
+厦
+邰
+纫
+逭
+纤
+眦
+膊
+馍
+躇
+烯
+蘼
+冬
+诤
+暄
+骶
+哑
+瘠
+」
+臊
+丕
+愈
+咱
+螺
+擅
+跋
+搏
+硪
+谄
+笠
+淡
+嘿
+骅
+谧
+鼎
+皋
+姚
+歼
+蠢
+驼
+耳
+胬
+挝
+涯
+狗
+蒽
+孓
+犷
+凉
+芦
+箴
+铤
+孤
+嘛
+坤
+V
+茴
+朦
+挞
+尖
+橙
+诞
+搴
+碇
+洵
+浚
+帚
+蜍
+漯
+柘
+嚎
+讽
+芭
+荤
+咻
+祠
+秉
+跖
+埃
+吓
+糯
+眷
+馒
+惹
+娼
+鲑
+嫩
+讴
+轮
+瞥
+靶
+褚
+乏
+缤
+宋
+帧
+删
+驱
+碎
+扑
+俩
+俄
+偏
+涣
+竹
+噱
+皙
+佰
+渚
+唧
+斡
+#
+镉
+刀
+崎
+筐
+佣
+夭
+贰
+肴
+峙
+哔
+艿
+匐
+牺
+镛
+缘
+仡
+嫡
+劣
+枸
+堀
+梨
+簿
+鸭
+蒸
+亦
+稽
+浴
+{
+衢
+束
+槲
+j
+阁
+揍
+疥
+棋
+潋
+聪
+窜
+乓
+睛
+插
+冉
+阪
+苍
+搽
+「
+蟾
+螟
+幸
+仇
+樽
+撂
+慢
+跤
+幔
+俚
+淅
+覃
+觊
+溶
+妖
+帛
+侨
+曰
+妾
+泗
+·
+:
+瀘
+風
+Ë
+(
+)
+∶
+紅
+紗
+瑭
+雲
+頭
+鶏
+財
+許
+•
+¥
+樂
+焗
+麗
+—
+;
+滙
+東
+榮
+繪
+興
+…
+門
+業
+π
+楊
+國
+顧
+é
+盤
+寳
+Λ
+龍
+鳳
+島
+誌
+緣
+結
+銭
+萬
+勝
+祎
+璟
+優
+歡
+臨
+時
+購
+=
+★
+藍
+昇
+鐵
+觀
+勅
+農
+聲
+畫
+兿
+術
+發
+劉
+記
+專
+耑
+園
+書
+壴
+種
+Ο
+●
+褀
+號
+銀
+匯
+敟
+锘
+葉
+橪
+廣
+進
+蒄
+鑽
+阝
+祙
+貢
+鍋
+豊
+夬
+喆
+團
+閣
+開
+燁
+賓
+館
+酡
+沔
+順
++
+硚
+劵
+饸
+陽
+車
+湓
+復
+萊
+氣
+軒
+華
+堃
+迮
+纟
+戶
+馬
+學
+裡
+電
+嶽
+獨
+マ
+シ
+サ
+ジ
+燘
+袪
+環
+❤
+臺
+灣
+専
+賣
+孖
+聖
+攝
+線
+▪
+α
+傢
+俬
+夢
+達
+莊
+喬
+貝
+薩
+劍
+羅
+壓
+棛
+饦
+尃
+璈
+囍
+醫
+G
+I
+A
+#
+N
+鷄
+髙
+嬰
+啓
+約
+隹
+潔
+賴
+藝
+~
+寶
+籣
+麺
+
+嶺
+√
+義
+網
+峩
+長
+∧
+魚
+機
+構
+②
+鳯
+偉
+L
+B
+㙟
+畵
+鴿
+'
+詩
+溝
+嚞
+屌
+藔
+佧
+玥
+蘭
+織
+1
+3
+9
+0
+7
+點
+砭
+鴨
+鋪
+銘
+廳
+弍
+‧
+創
+湯
+坶
+℃
+卩
+骝
+&
+烜
+荘
+當
+潤
+扞
+係
+懷
+碶
+钅
+蚨
+讠
+☆
+叢
+爲
+埗
+涫
+塗
+→
+楽
+現
+鯨
+愛
+瑪
+鈺
+忄
+悶
+藥
+飾
+樓
+視
+孬
+ㆍ
+燚
+苪
+師
+①
+丼
+锽
+│
+韓
+標
+è
+兒
+閏
+匋
+張
+漢
+Ü
+髪
+會
+閑
+檔
+習
+裝
+の
+峯
+菘
+輝
+И
+雞
+釣
+億
+浐
+K
+O
+R
+8
+H
+E
+P
+T
+W
+D
+S
+C
+M
+F
+姌
+饹
+»
+晞
+廰
+ä
+嵯
+鷹
+負
+飲
+絲
+冚
+楗
+澤
+綫
+區
+❋
+←
+質
+靑
+揚
+③
+滬
+統
+産
+協
+﹑
+乸
+畐
+經
+運
+際
+洺
+岽
+為
+粵
+諾
+崋
+豐
+碁
+ɔ
+V
+2
+6
+齋
+誠
+訂
+´
+勑
+雙
+陳
+無
+í
+泩
+媄
+夌
+刂
+i
+c
+t
+o
+r
+a
+嘢
+耄
+燴
+暃
+壽
+媽
+靈
+抻
+體
+唻
+É
+冮
+甹
+鎮
+錦
+ʌ
+蜛
+蠄
+尓
+駕
+戀
+飬
+逹
+倫
+貴
+極
+Я
+Й
+寬
+磚
+嶪
+郎
+職
+|
+間
+n
+d
+剎
+伈
+課
+飛
+橋
+瘊
+№
+譜
+骓
+圗
+滘
+縣
+粿
+咅
+養
+濤
+彳
+®
+%
+Ⅱ
+啰
+㴪
+見
+矞
+薬
+糁
+邨
+鲮
+顔
+罱
+З
+選
+話
+贏
+氪
+俵
+競
+瑩
+繡
+枱
+β
+綉
+á
+獅
+爾
+™
+麵
+戋
+淩
+徳
+個
+劇
+場
+務
+簡
+寵
+h
+實
+膠
+轱
+圖
+築
+嘣
+樹
+㸃
+營
+耵
+孫
+饃
+鄺
+飯
+麯
+遠
+輸
+坫
+孃
+乚
+閃
+鏢
+㎡
+題
+廠
+關
+↑
+爺
+將
+軍
+連
+篦
+覌
+參
+箸
+-
+窠
+棽
+寕
+夀
+爰
+歐
+呙
+閥
+頡
+熱
+雎
+垟
+裟
+凬
+勁
+帑
+馕
+夆
+疌
+枼
+馮
+貨
+蒤
+樸
+彧
+旸
+靜
+龢
+暢
+㐱
+鳥
+珺
+鏡
+灡
+爭
+堷
+廚
+Ó
+騰
+診
+┅
+蘇
+褔
+凱
+頂
+豕
+亞
+帥
+嘬
+⊥
+仺
+桖
+複
+饣
+絡
+穂
+顏
+棟
+納
+▏
+濟
+親
+設
+計
+攵
+埌
+烺
+ò
+頤
+燦
+蓮
+撻
+節
+講
+濱
+濃
+娽
+洳
+朿
+燈
+鈴
+護
+膚
+铔
+過
+補
+Z
+U
+5
+4
+坋
+闿
+䖝
+餘
+缐
+铞
+貿
+铪
+桼
+趙
+鍊
+[
+㐂
+垚
+菓
+揸
+捲
+鐘
+滏
+𣇉
+爍
+輪
+燜
+鴻
+鮮
+動
+鹞
+鷗
+丄
+慶
+鉌
+翥
+飮
+腸
+⇋
+漁
+覺
+來
+熘
+昴
+翏
+鲱
+圧
+鄉
+萭
+頔
+爐
+嫚
+г
+貭
+類
+聯
+幛
+輕
+訓
+鑒
+夋
+锨
+芃
+珣
+䝉
+扙
+嵐
+銷
+處
+ㄱ
+語
+誘
+苝
+歸
+儀
+燒
+楿
+內
+粢
+葒
+奧
+麥
+礻
+滿
+蠔
+穵
+瞭
+態
+鱬
+榞
+硂
+鄭
+黃
+煙
+祐
+奓
+逺
+*
+瑄
+獲
+聞
+薦
+讀
+這
+樣
+決
+問
+啟
+們
+執
+説
+轉
+單
+隨
+唘
+帶
+倉
+庫
+還
+贈
+尙
+皺
+■
+餅
+產
+○
+∈
+報
+狀
+楓
+賠
+琯
+嗮
+禮
+`
+傳
+>
+≤
+嗞
+Φ
+≥
+換
+咭
+∣
+↓
+曬
+ε
+応
+寫
+″
+終
+様
+純
+費
+療
+聨
+凍
+壐
+郵
+ü
+黒
+∫
+製
+塊
+調
+軽
+確
+撃
+級
+馴
+Ⅲ
+涇
+繹
+數
+碼
+證
+狒
+処
+劑
+<
+晧
+賀
+衆
+]
+櫥
+兩
+陰
+絶
+對
+鯉
+憶
+◎
+p
+e
+Y
+蕒
+煖
+頓
+測
+試
+鼽
+僑
+碩
+妝
+帯
+≈
+鐡
+舖
+權
+喫
+倆
+ˋ
+該
+悅
+ā
+俫
+.
+f
+s
+b
+m
+k
+g
+u
+j
+貼
+淨
+濕
+針
+適
+備
+l
+/
+給
+謢
+強
+觸
+衛
+與
+⊙
+$
+緯
+變
+⑴
+⑵
+⑶
+㎏
+殺
+∩
+幚
+─
+價
+▲
+離
+ú
+ó
+飄
+烏
+関
+閟
+﹝
+﹞
+邏
+輯
+鍵
+驗
+訣
+導
+歷
+屆
+層
+▼
+儱
+錄
+熳
+ē
+艦
+吋
+錶
+辧
+飼
+顯
+④
+禦
+販
+気
+対
+枰
+閩
+紀
+幹
+瞓
+貊
+淚
+△
+眞
+墊
+Ω
+獻
+褲
+縫
+緑
+亜
+鉅
+餠
+{
+}
+◆
+蘆
+薈
+█
+◇
+溫
+彈
+晳
+粧
+犸
+穩
+訊
+崬
+凖
+熥
+П
+舊
+條
+紋
+圍
+Ⅳ
+筆
+尷
+難
+雜
+錯
+綁
+識
+頰
+鎖
+艶
+□
+殁
+殼
+⑧
+├
+▕
+鵬
+ǐ
+ō
+ǒ
+糝
+綱
+▎
+μ
+盜
+饅
+醬
+籤
+蓋
+釀
+鹽
+據
+à
+ɡ
+辦
+◥
+彐
+┌
+婦
+獸
+鲩
+伱
+ī
+蒟
+蒻
+齊
+袆
+腦
+寧
+凈
+妳
+煥
+詢
+偽
+謹
+啫
+鯽
+騷
+鱸
+損
+傷
+鎻
+髮
+買
+冏
+儥
+両
+﹢
+∞
+載
+喰
+z
+羙
+悵
+燙
+曉
+員
+組
+徹
+艷
+痠
+鋼
+鼙
+縮
+細
+嚒
+爯
+≠
+維
+"
+鱻
+壇
+厍
+帰
+浥
+犇
+薡
+軎
+²
+應
+醜
+刪
+緻
+鶴
+賜
+噁
+軌
+尨
+镔
+鷺
+槗
+彌
+葚
+濛
+請
+溇
+緹
+賢
+訪
+獴
+瑅
+資
+縤
+陣
+蕟
+栢
+韻
+祼
+恁
+伢
+謝
+劃
+涑
+總
+衖
+踺
+砋
+凉
+籃
+駿
+苼
+瘋
+昽
+紡
+驊
+腎
+﹗
+響
+杋
+剛
+嚴
+禪
+歓
+槍
+傘
+檸
+檫
+炣
+勢
+鏜
+鎢
+銑
+尐
+減
+奪
+惡
+θ
+僮
+婭
+臘
+ū
+ì
+殻
+鉄
+∑
+蛲
+焼
+緖
+續
+紹
+懮
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java
new file mode 100644
index 0000000000..9ce3b38765
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java
@@ -0,0 +1,500 @@
+package com.baidu.paddle.fastdeploy.app.examples.ocr;
+
+import static com.baidu.paddle.fastdeploy.app.ui.Utils.decodeBitmap;
+import static com.baidu.paddle.fastdeploy.app.ui.Utils.getRealPathFromURI;
+
+import android.Manifest;
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.preference.PreferenceManager;
+import android.support.annotation.NonNull;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import com.baidu.paddle.fastdeploy.RuntimeOption;
+import com.baidu.paddle.fastdeploy.app.examples.R;
+import com.baidu.paddle.fastdeploy.app.ui.view.CameraSurfaceView;
+import com.baidu.paddle.fastdeploy.app.ui.view.ResultListView;
+import com.baidu.paddle.fastdeploy.app.ui.Utils;
+import com.baidu.paddle.fastdeploy.app.ui.view.adapter.BaseResultAdapter;
+import com.baidu.paddle.fastdeploy.app.ui.view.model.BaseResultModel;
+import com.baidu.paddle.fastdeploy.pipeline.PPOCRv3;
+import com.baidu.paddle.fastdeploy.vision.OCRResult;
+import com.baidu.paddle.fastdeploy.vision.Visualize;
+import com.baidu.paddle.fastdeploy.vision.ocr.Classifier;
+import com.baidu.paddle.fastdeploy.vision.ocr.DBDetector;
+import com.baidu.paddle.fastdeploy.vision.ocr.Recognizer;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class OcrMainActivity extends Activity implements View.OnClickListener, CameraSurfaceView.OnTextureChangedListener {
+ private static final String TAG = OcrMainActivity.class.getSimpleName();
+
+ CameraSurfaceView svPreview;
+ TextView tvStatus;
+ ImageButton btnSwitch;
+ ImageButton btnShutter;
+ ImageButton btnSettings;
+ ImageView realtimeToggleButton;
+ boolean isRealtimeStatusRunning = false;
+ ImageView backInPreview;
+ private ImageView albumSelectButton;
+ private View cameraPageView;
+ private ViewGroup resultPageView;
+ private ImageView resultImage;
+ private ImageView backInResult;
+ private SeekBar confidenceSeekbar;
+ private TextView seekbarText;
+ private float resultNum = 1.0f;
+ private ResultListView resultView;
+ private Bitmap picBitmap;
+ private Bitmap shutterBitmap;
+ private Bitmap originPicBitmap;
+ private Bitmap originShutterBitmap;
+ private boolean isShutterBitmapCopied = false;
+
+ public static final int TYPE_UNKNOWN = -1;
+ public static final int BTN_SHUTTER = 0;
+ public static final int ALBUM_SELECT = 1;
+ public static final int REALTIME_DETECT = 2;
+ private static int TYPE = REALTIME_DETECT;
+
+ private static final int REQUEST_PERMISSION_CODE_STORAGE = 101;
+ private static final int INTENT_CODE_PICK_IMAGE = 100;
+ private static final int TIME_SLEEP_INTERVAL = 50; // ms
+
+ long timeElapsed = 0;
+ long frameCounter = 0;
+
+ // Call 'init' and 'release' manually later
+ PPOCRv3 predictor = new PPOCRv3();
+
+ private String[] texts;
+ private float[] recScores;
+ private boolean initialized;
+ private List results = new ArrayList<>();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Fullscreen
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
+
+ setContentView(R.layout.ocr_activity_main);
+
+ // Clear all setting items to avoid app crashing due to the incorrect settings
+ initSettings();
+
+ // Check and request CAMERA and WRITE_EXTERNAL_STORAGE permissions
+ if (!checkAllPermissions()) {
+ requestAllPermissions();
+ }
+
+ // Init the camera preview and UI components
+ initView();
+ }
+
+ @SuppressLint("NonConstantResourceId")
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btn_switch:
+ svPreview.switchCamera();
+ break;
+ case R.id.btn_shutter:
+ TYPE = BTN_SHUTTER;
+ shutterAndPauseCamera();
+ resultView.setAdapter(null);
+ break;
+ case R.id.btn_settings:
+ startActivity(new Intent(OcrMainActivity.this, OcrSettingsActivity.class));
+ break;
+ case R.id.realtime_toggle_btn:
+ toggleRealtimeStyle();
+ break;
+ case R.id.back_in_preview:
+ finish();
+ break;
+ case R.id.iv_select:
+ TYPE = ALBUM_SELECT;
+ // Judge whether authority has been granted.
+ if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
+ // If this permission was requested before the application but the user refused the request, this method will return true.
+ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE_STORAGE);
+ } else {
+ Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.setType("image/*");
+ startActivityForResult(intent, INTENT_CODE_PICK_IMAGE);
+ }
+ resultView.setAdapter(null);
+ break;
+ case R.id.back_in_result:
+ back();
+ break;
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ super.onBackPressed();
+ back();
+ }
+
+ private void back() {
+ resultPageView.setVisibility(View.GONE);
+ cameraPageView.setVisibility(View.VISIBLE);
+ TYPE = REALTIME_DETECT;
+ isShutterBitmapCopied = false;
+ svPreview.onResume();
+ results.clear();
+ if (texts != null) {
+ texts = null;
+ }
+ if (recScores != null) {
+ recScores = null;
+ }
+ }
+
+ private void shutterAndPauseCamera() {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ // Sleep some times to ensure picture has been correctly shut.
+ Thread.sleep(TIME_SLEEP_INTERVAL * 10); // 500ms
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ runOnUiThread(new Runnable() {
+ @SuppressLint("SetTextI18n")
+ public void run() {
+ // These code will run in main thread.
+ svPreview.onPause();
+ cameraPageView.setVisibility(View.GONE);
+ resultPageView.setVisibility(View.VISIBLE);
+ seekbarText.setText(resultNum + "");
+ confidenceSeekbar.setProgress((int) (resultNum * 100));
+ if (shutterBitmap != null && !shutterBitmap.isRecycled()) {
+ resultImage.setImageBitmap(shutterBitmap);
+ } else {
+ new AlertDialog.Builder(OcrMainActivity.this)
+ .setTitle("Empty Result!")
+ .setMessage("Current picture is empty, please shutting it again!")
+ .setCancelable(true)
+ .show();
+ }
+ }
+ });
+
+ }
+ }).start();
+ }
+
+ private void copyBitmapFromCamera(Bitmap ARGB8888ImageBitmap) {
+ if (isShutterBitmapCopied || ARGB8888ImageBitmap == null) {
+ return;
+ }
+ if (!ARGB8888ImageBitmap.isRecycled()) {
+ synchronized (this) {
+ shutterBitmap = ARGB8888ImageBitmap.copy(Bitmap.Config.ARGB_8888, true);
+ originShutterBitmap = ARGB8888ImageBitmap.copy(Bitmap.Config.ARGB_8888, true);
+ }
+ SystemClock.sleep(TIME_SLEEP_INTERVAL);
+ isShutterBitmapCopied = true;
+ }
+ }
+
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == INTENT_CODE_PICK_IMAGE) {
+ if (resultCode == Activity.RESULT_OK) {
+ cameraPageView.setVisibility(View.GONE);
+ resultPageView.setVisibility(View.VISIBLE);
+ seekbarText.setText(resultNum + "");
+ confidenceSeekbar.setProgress((int) (resultNum * 100));
+ Uri uri = data.getData();
+ String path = getRealPathFromURI(this, uri);
+ picBitmap = decodeBitmap(path, 720, 1280);
+ originPicBitmap = picBitmap.copy(Bitmap.Config.ARGB_8888, true);
+ resultImage.setImageBitmap(picBitmap);
+ }
+ }
+ }
+
+ private void toggleRealtimeStyle() {
+ if (isRealtimeStatusRunning) {
+ isRealtimeStatusRunning = false;
+ realtimeToggleButton.setImageResource(R.drawable.realtime_stop_btn);
+ svPreview.setOnTextureChangedListener(this);
+ tvStatus.setVisibility(View.VISIBLE);
+ } else {
+ isRealtimeStatusRunning = true;
+ realtimeToggleButton.setImageResource(R.drawable.realtime_start_btn);
+ tvStatus.setVisibility(View.GONE);
+ isShutterBitmapCopied = false;
+ svPreview.setOnTextureChangedListener(new CameraSurfaceView.OnTextureChangedListener() {
+ @Override
+ public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) {
+ if (TYPE == BTN_SHUTTER) {
+ copyBitmapFromCamera(ARGB8888ImageBitmap);
+ }
+ return false;
+ }
+ });
+ }
+ }
+
+ @Override
+ public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) {
+ if (TYPE == BTN_SHUTTER) {
+ copyBitmapFromCamera(ARGB8888ImageBitmap);
+ return false;
+ }
+
+ boolean modified = false;
+
+ long tc = System.currentTimeMillis();
+ OCRResult result = predictor.predict(ARGB8888ImageBitmap);
+ timeElapsed += (System.currentTimeMillis() - tc);
+
+ Visualize.visOcr(ARGB8888ImageBitmap, result);
+ modified = result.initialized();
+
+ frameCounter++;
+ if (frameCounter >= 30) {
+ final int fps = (int) (1000 / (timeElapsed / 30));
+ runOnUiThread(new Runnable() {
+ @SuppressLint("SetTextI18n")
+ public void run() {
+ tvStatus.setText(Integer.toString(fps) + "fps");
+ }
+ });
+ frameCounter = 0;
+ timeElapsed = 0;
+ }
+ return modified;
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ // Reload settings and re-initialize the predictor
+ checkAndUpdateSettings();
+ // Open camera until the permissions have been granted
+ if (!checkAllPermissions()) {
+ svPreview.disableCamera();
+ } else {
+ svPreview.enableCamera();
+ }
+ svPreview.onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ svPreview.onPause();
+ }
+
+ @Override
+ protected void onDestroy() {
+ if (predictor != null) {
+ predictor.release();
+ }
+ super.onDestroy();
+ }
+
+ public void initView() {
+ TYPE = REALTIME_DETECT;
+ svPreview = (CameraSurfaceView) findViewById(R.id.sv_preview);
+ svPreview.setOnTextureChangedListener(this);
+ tvStatus = (TextView) findViewById(R.id.tv_status);
+ btnSwitch = (ImageButton) findViewById(R.id.btn_switch);
+ btnSwitch.setOnClickListener(this);
+ btnShutter = (ImageButton) findViewById(R.id.btn_shutter);
+ btnShutter.setOnClickListener(this);
+ btnSettings = (ImageButton) findViewById(R.id.btn_settings);
+ btnSettings.setOnClickListener(this);
+ realtimeToggleButton = findViewById(R.id.realtime_toggle_btn);
+ realtimeToggleButton.setOnClickListener(this);
+ backInPreview = findViewById(R.id.back_in_preview);
+ backInPreview.setOnClickListener(this);
+ albumSelectButton = findViewById(R.id.iv_select);
+ albumSelectButton.setOnClickListener(this);
+ cameraPageView = findViewById(R.id.camera_page);
+ resultPageView = findViewById(R.id.result_page);
+ resultImage = findViewById(R.id.result_image);
+ backInResult = findViewById(R.id.back_in_result);
+ backInResult.setOnClickListener(this);
+ confidenceSeekbar = findViewById(R.id.confidence_seekbar);
+ seekbarText = findViewById(R.id.seekbar_text);
+ resultView = findViewById(R.id.result_list_view);
+
+ confidenceSeekbar.setMax(100);
+ confidenceSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ float resultConfidence = seekBar.getProgress() / 100f;
+ BigDecimal bd = new BigDecimal(resultConfidence);
+ resultNum = bd.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue();
+ seekbarText.setText(resultNum + "");
+ confidenceSeekbar.setProgress((int) (resultNum * 100));
+ results.clear();
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (TYPE == ALBUM_SELECT) {
+ SystemClock.sleep(TIME_SLEEP_INTERVAL * 10);
+ detail(picBitmap);
+ picBitmap = originPicBitmap.copy(Bitmap.Config.ARGB_8888, true);
+ } else {
+ SystemClock.sleep(TIME_SLEEP_INTERVAL * 10);
+ detail(shutterBitmap);
+ shutterBitmap = originShutterBitmap.copy(Bitmap.Config.ARGB_8888, true);
+ }
+ }
+ });
+ }
+ });
+ }
+
+ private void detail(Bitmap bitmap) {
+ OCRResult result = predictor.predict(bitmap, true);
+
+ texts = result.mText;
+ recScores = result.mRecScores;
+
+ initialized = result.initialized();
+ if (initialized) {
+ for (int i = 0; i < texts.length; i++) {
+ if (recScores[i] > resultNum) {
+ results.add(new BaseResultModel(i + 1, texts[i], recScores[i]));
+ }
+ }
+ }
+ BaseResultAdapter adapter = new BaseResultAdapter(getBaseContext(), R.layout.ocr_result_page_item, results);
+ resultView.setAdapter(adapter);
+ resultView.invalidate();
+
+ resultImage.setImageBitmap(bitmap);
+ resultNum = 1.0f;
+ }
+
+ @SuppressLint("ApplySharedPref")
+ public void initSettings() {
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.clear();
+ editor.commit();
+ OcrSettingsActivity.resetSettings();
+ }
+
+ public void checkAndUpdateSettings() {
+ if (OcrSettingsActivity.checkAndUpdateSettings(this)) {
+ String realModelDir = getCacheDir() + "/" + OcrSettingsActivity.modelDir;
+ String detModelName = "ch_PP-OCRv3_det_infer";
+ // String detModelName = "ch_ppocr_mobile_v2.0_det_infer";
+ String clsModelName = "ch_ppocr_mobile_v2.0_cls_infer";
+ // String recModelName = "ch_ppocr_mobile_v2.0_rec_infer";
+ String recModelName = "ch_PP-OCRv3_rec_infer";
+ String realDetModelDir = realModelDir + "/" + detModelName;
+ String realClsModelDir = realModelDir + "/" + clsModelName;
+ String realRecModelDir = realModelDir + "/" + recModelName;
+ String srcDetModelDir = OcrSettingsActivity.modelDir + "/" + detModelName;
+ String srcClsModelDir = OcrSettingsActivity.modelDir + "/" + clsModelName;
+ String srcRecModelDir = OcrSettingsActivity.modelDir + "/" + recModelName;
+ Utils.copyDirectoryFromAssets(this, srcDetModelDir, realDetModelDir);
+ Utils.copyDirectoryFromAssets(this, srcClsModelDir, realClsModelDir);
+ Utils.copyDirectoryFromAssets(this, srcRecModelDir, realRecModelDir);
+ String realLabelPath = getCacheDir() + "/" + OcrSettingsActivity.labelPath;
+ Utils.copyFileFromAssets(this, OcrSettingsActivity.labelPath, realLabelPath);
+
+ String detModelFile = realDetModelDir + "/" + "inference.pdmodel";
+ String detParamsFile = realDetModelDir + "/" + "inference.pdiparams";
+ String clsModelFile = realClsModelDir + "/" + "inference.pdmodel";
+ String clsParamsFile = realClsModelDir + "/" + "inference.pdiparams";
+ String recModelFile = realRecModelDir + "/" + "inference.pdmodel";
+ String recParamsFile = realRecModelDir + "/" + "inference.pdiparams";
+ String recLabelFilePath = realLabelPath; // ppocr_keys_v1.txt
+ RuntimeOption detOption = new RuntimeOption();
+ RuntimeOption clsOption = new RuntimeOption();
+ RuntimeOption recOption = new RuntimeOption();
+ detOption.setCpuThreadNum(OcrSettingsActivity.cpuThreadNum);
+ clsOption.setCpuThreadNum(OcrSettingsActivity.cpuThreadNum);
+ recOption.setCpuThreadNum(OcrSettingsActivity.cpuThreadNum);
+ detOption.setLitePowerMode(OcrSettingsActivity.cpuPowerMode);
+ clsOption.setLitePowerMode(OcrSettingsActivity.cpuPowerMode);
+ recOption.setLitePowerMode(OcrSettingsActivity.cpuPowerMode);
+ if (Boolean.parseBoolean(OcrSettingsActivity.enableLiteFp16)) {
+ detOption.enableLiteFp16();
+ clsOption.enableLiteFp16();
+ recOption.enableLiteFp16();
+ }
+ DBDetector detModel = new DBDetector(detModelFile, detParamsFile, detOption);
+ Classifier clsModel = new Classifier(clsModelFile, clsParamsFile, clsOption);
+ Recognizer recModel = new Recognizer(recModelFile, recParamsFile, recLabelFilePath, recOption);
+ predictor.init(detModel, clsModel, recModel);
+
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+ @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) {
+ new AlertDialog.Builder(OcrMainActivity.this)
+ .setTitle("Permission denied")
+ .setMessage("Click to force quit the app, then open Settings->Apps & notifications->Target " +
+ "App->Permissions to grant all of the permissions.")
+ .setCancelable(false)
+ .setPositiveButton("Exit", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ OcrMainActivity.this.finish();
+ }
+ }).show();
+ }
+ }
+
+ private void requestAllPermissions() {
+ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA}, 0);
+ }
+
+ private boolean checkAllPermissions() {
+ return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
+ && ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
+ }
+}
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrSettingsActivity.java b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrSettingsActivity.java
new file mode 100644
index 0000000000..6f8c45ff4f
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrSettingsActivity.java
@@ -0,0 +1,198 @@
+package com.baidu.paddle.fastdeploy.app.examples.ocr;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.EditTextPreference;
+import android.preference.ListPreference;
+import android.preference.PreferenceManager;
+import android.support.v7.app.ActionBar;
+
+import com.baidu.paddle.fastdeploy.app.examples.R;
+import com.baidu.paddle.fastdeploy.app.ui.Utils;
+import com.baidu.paddle.fastdeploy.app.ui.view.AppCompatPreferenceActivity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class OcrSettingsActivity extends AppCompatPreferenceActivity implements
+ SharedPreferences.OnSharedPreferenceChangeListener {
+ private static final String TAG = OcrSettingsActivity.class.getSimpleName();
+
+ static public int selectedModelIdx = -1;
+ static public String modelDir = "";
+ static public String labelPath = "";
+ static public int cpuThreadNum = 2;
+ static public String cpuPowerMode = "";
+ static public float scoreThreshold = 0.4f;
+ static public String enableLiteFp16 = "true";
+
+ ListPreference lpChoosePreInstalledModel = null;
+ EditTextPreference etModelDir = null;
+ EditTextPreference etLabelPath = null;
+ ListPreference lpCPUThreadNum = null;
+ ListPreference lpCPUPowerMode = null;
+ EditTextPreference etScoreThreshold = null;
+ ListPreference lpEnableLiteFp16 = null;
+
+ List preInstalledModelDirs = null;
+ List preInstalledLabelPaths = null;
+ List preInstalledCPUThreadNums = null;
+ List preInstalledCPUPowerModes = null;
+ List preInstalledScoreThresholds = null;
+ List preInstalledEnableLiteFp16s = null;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.ocr_settings);
+ ActionBar supportActionBar = getSupportActionBar();
+ if (supportActionBar != null) {
+ supportActionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ // Initialize pre-installed models
+ preInstalledModelDirs = new ArrayList();
+ preInstalledLabelPaths = new ArrayList();
+ preInstalledCPUThreadNums = new ArrayList();
+ preInstalledCPUPowerModes = new ArrayList();
+ preInstalledScoreThresholds = new ArrayList();
+ preInstalledEnableLiteFp16s = new ArrayList();
+ preInstalledModelDirs.add(getString(R.string.OCR_MODEL_DIR_DEFAULT));
+ preInstalledLabelPaths.add(getString(R.string.OCR_REC_LABEL_DEFAULT));
+ preInstalledCPUThreadNums.add(getString(R.string.CPU_THREAD_NUM_DEFAULT));
+ preInstalledCPUPowerModes.add(getString(R.string.CPU_POWER_MODE_DEFAULT));
+ preInstalledScoreThresholds.add(getString(R.string.SCORE_THRESHOLD_DEFAULT));
+ preInstalledEnableLiteFp16s.add(getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
+
+ // Setup UI components
+ lpChoosePreInstalledModel =
+ (ListPreference) findPreference(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY));
+ String[] preInstalledModelNames = new String[preInstalledModelDirs.size()];
+ for (int i = 0; i < preInstalledModelDirs.size(); i++) {
+ preInstalledModelNames[i] = preInstalledModelDirs.get(i).substring(preInstalledModelDirs.get(i).lastIndexOf("/") + 1);
+ }
+ lpChoosePreInstalledModel.setEntries(preInstalledModelNames);
+ lpChoosePreInstalledModel.setEntryValues(preInstalledModelDirs.toArray(new String[preInstalledModelDirs.size()]));
+ lpCPUThreadNum = (ListPreference) findPreference(getString(R.string.CPU_THREAD_NUM_KEY));
+ lpCPUPowerMode = (ListPreference) findPreference(getString(R.string.CPU_POWER_MODE_KEY));
+ etModelDir = (EditTextPreference) findPreference(getString(R.string.MODEL_DIR_KEY));
+ etModelDir.setTitle("Model dir (SDCard: " + Utils.getSDCardDirectory() + ")");
+ etLabelPath = (EditTextPreference) findPreference(getString(R.string.LABEL_PATH_KEY));
+ etLabelPath.setTitle("Label path (SDCard: " + Utils.getSDCardDirectory() + ")");
+ etScoreThreshold = (EditTextPreference) findPreference(getString(R.string.SCORE_THRESHOLD_KEY));
+ lpEnableLiteFp16 = (ListPreference) findPreference(getString(R.string.ENABLE_LITE_FP16_MODE_KEY));
+ }
+
+ @SuppressLint("ApplySharedPref")
+ private void reloadSettingsAndUpdateUI() {
+ SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
+
+ String selected_model_dir = sharedPreferences.getString(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY),
+ getString(R.string.OCR_MODEL_DIR_DEFAULT));
+ int selected_model_idx = lpChoosePreInstalledModel.findIndexOfValue(selected_model_dir);
+ if (selected_model_idx >= 0 && selected_model_idx < preInstalledModelDirs.size() && selected_model_idx != selectedModelIdx) {
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putString(getString(R.string.MODEL_DIR_KEY), preInstalledModelDirs.get(selected_model_idx));
+ editor.putString(getString(R.string.LABEL_PATH_KEY), preInstalledLabelPaths.get(selected_model_idx));
+ editor.putString(getString(R.string.CPU_THREAD_NUM_KEY), preInstalledCPUThreadNums.get(selected_model_idx));
+ editor.putString(getString(R.string.CPU_POWER_MODE_KEY), preInstalledCPUPowerModes.get(selected_model_idx));
+ editor.putString(getString(R.string.SCORE_THRESHOLD_KEY), preInstalledScoreThresholds.get(selected_model_idx));
+ editor.putString(getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT), preInstalledEnableLiteFp16s.get(selected_model_idx));
+ editor.commit();
+ lpChoosePreInstalledModel.setSummary(selected_model_dir);
+ selectedModelIdx = selected_model_idx;
+ }
+
+ String model_dir = sharedPreferences.getString(getString(R.string.MODEL_DIR_KEY),
+ getString(R.string.OCR_MODEL_DIR_DEFAULT));
+ String label_path = sharedPreferences.getString(getString(R.string.LABEL_PATH_KEY),
+ getString(R.string.OCR_REC_LABEL_DEFAULT));
+ String cpu_thread_num = sharedPreferences.getString(getString(R.string.CPU_THREAD_NUM_KEY),
+ getString(R.string.CPU_THREAD_NUM_DEFAULT));
+ String cpu_power_mode = sharedPreferences.getString(getString(R.string.CPU_POWER_MODE_KEY),
+ getString(R.string.CPU_POWER_MODE_DEFAULT));
+ String score_threshold = sharedPreferences.getString(getString(R.string.SCORE_THRESHOLD_KEY),
+ getString(R.string.SCORE_THRESHOLD_DEFAULT));
+ String enable_lite_fp16 = sharedPreferences.getString(getString(R.string.ENABLE_LITE_FP16_MODE_KEY),
+ getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
+
+ etModelDir.setSummary(model_dir);
+ etLabelPath.setSummary(label_path);
+ lpCPUThreadNum.setValue(cpu_thread_num);
+ lpCPUThreadNum.setSummary(cpu_thread_num);
+ lpCPUPowerMode.setValue(cpu_power_mode);
+ lpCPUPowerMode.setSummary(cpu_power_mode);
+ etScoreThreshold.setSummary(score_threshold);
+ etScoreThreshold.setText(score_threshold);
+ lpEnableLiteFp16.setValue(enable_lite_fp16);
+ lpEnableLiteFp16.setSummary(enable_lite_fp16);
+
+ }
+
+ static boolean checkAndUpdateSettings(Context ctx) {
+ boolean settingsChanged = false;
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(ctx);
+
+ String model_dir = sharedPreferences.getString(ctx.getString(R.string.MODEL_DIR_KEY),
+ ctx.getString(R.string.OCR_MODEL_DIR_DEFAULT));
+ settingsChanged |= !modelDir.equalsIgnoreCase(model_dir);
+ modelDir = model_dir;
+
+ String label_path = sharedPreferences.getString(ctx.getString(R.string.LABEL_PATH_KEY),
+ ctx.getString(R.string.OCR_REC_LABEL_DEFAULT));
+ settingsChanged |= !labelPath.equalsIgnoreCase(label_path);
+ labelPath = label_path;
+
+ String cpu_thread_num = sharedPreferences.getString(ctx.getString(R.string.CPU_THREAD_NUM_KEY),
+ ctx.getString(R.string.CPU_THREAD_NUM_DEFAULT));
+ settingsChanged |= cpuThreadNum != Integer.parseInt(cpu_thread_num);
+ cpuThreadNum = Integer.parseInt(cpu_thread_num);
+
+ String cpu_power_mode = sharedPreferences.getString(ctx.getString(R.string.CPU_POWER_MODE_KEY),
+ ctx.getString(R.string.CPU_POWER_MODE_DEFAULT));
+ settingsChanged |= !cpuPowerMode.equalsIgnoreCase(cpu_power_mode);
+ cpuPowerMode = cpu_power_mode;
+
+ String score_threshold = sharedPreferences.getString(ctx.getString(R.string.SCORE_THRESHOLD_KEY),
+ ctx.getString(R.string.SCORE_THRESHOLD_DEFAULT));
+ settingsChanged |= scoreThreshold != Float.parseFloat(score_threshold);
+ scoreThreshold = Float.parseFloat(score_threshold);
+
+ String enable_lite_fp16 = sharedPreferences.getString(ctx.getString(R.string.ENABLE_LITE_FP16_MODE_KEY),
+ ctx.getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
+ settingsChanged |= !enableLiteFp16.equalsIgnoreCase(enable_lite_fp16);
+ enableLiteFp16 = enable_lite_fp16;
+
+ return settingsChanged;
+ }
+
+ static void resetSettings() {
+ selectedModelIdx = -1;
+ modelDir = "";
+ labelPath = "";
+ cpuThreadNum = 2;
+ cpuPowerMode = "";
+ scoreThreshold = 0.4f;
+ enableLiteFp16 = "true";
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ reloadSettingsAndUpdateUI();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ reloadSettingsAndUpdateUI();
+ }
+}
diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/Utils.java b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/Utils.java
similarity index 100%
rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/Utils.java
rename to examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/Utils.java
diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/layout/ActionBarLayout.java b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/layout/ActionBarLayout.java
similarity index 100%
rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/layout/ActionBarLayout.java
rename to examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/layout/ActionBarLayout.java
diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/AppCompatPreferenceActivity.java b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/AppCompatPreferenceActivity.java
similarity index 100%
rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/AppCompatPreferenceActivity.java
rename to examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/AppCompatPreferenceActivity.java
diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java
similarity index 99%
rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java
rename to examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java
index 14217181d3..e90874c627 100644
--- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java
@@ -12,6 +12,7 @@
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLUtils;
import android.opengl.Matrix;
+import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
@@ -305,7 +306,6 @@ public void openCamera() {
boolean rotate = degree == 90 || degree == 270;
textureWidth = rotate ? previewSize.height : previewSize.width;
textureHeight = rotate ? previewSize.width : previewSize.height;
-
// Destroy FBO and draw textures
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glDeleteFramebuffers(1, fbo, 0);
diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/ResultListView.java b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/ResultListView.java
similarity index 100%
rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/ResultListView.java
rename to examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/ResultListView.java
diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/adapter/BaseResultAdapter.java b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/adapter/BaseResultAdapter.java
similarity index 100%
rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/adapter/BaseResultAdapter.java
rename to examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/adapter/BaseResultAdapter.java
diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/model/BaseResultModel.java b/examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/model/BaseResultModel.java
similarity index 100%
rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/model/BaseResultModel.java
rename to examples/vision/ocr/PP-OCRv3/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/model/BaseResultModel.java
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/action_button_layer.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/action_button_layer.xml
new file mode 100644
index 0000000000..a0d2e76bfa
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/action_button_layer.xml
@@ -0,0 +1,14 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/album_btn.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/album_btn.xml
new file mode 100644
index 0000000000..26d01c5841
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/album_btn.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000000..1f6bb29060
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/realtime_start_btn.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/realtime_start_btn.xml
new file mode 100644
index 0000000000..6641344530
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/realtime_start_btn.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/realtime_stop_btn.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/realtime_stop_btn.xml
new file mode 100644
index 0000000000..8869a1b2bf
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/realtime_stop_btn.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/result_page_border_section_bk.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/result_page_border_section_bk.xml
new file mode 100644
index 0000000000..bd068f169f
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/result_page_border_section_bk.xml
@@ -0,0 +1,12 @@
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/round_corner_btn.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/round_corner_btn.xml
new file mode 100644
index 0000000000..c5dcc45d56
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/round_corner_btn.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_progress_realtime.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_progress_realtime.xml
new file mode 100644
index 0000000000..b349d15a6a
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_progress_realtime.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_progress_result.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_progress_result.xml
new file mode 100644
index 0000000000..17cb68ed80
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_progress_result.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_thumb.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_thumb.xml
new file mode 100644
index 0000000000..96bd95e0a1
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_thumb.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_thumb_shape.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_thumb_shape.xml
new file mode 100644
index 0000000000..26d033b6df
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/seekbar_thumb_shape.xml
@@ -0,0 +1,26 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/switch_side_btn.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/switch_side_btn.xml
new file mode 100644
index 0000000000..b9b2edfb6a
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/switch_side_btn.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/take_picture_btn.xml b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/take_picture_btn.xml
new file mode 100644
index 0000000000..4966675c35
--- /dev/null
+++ b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-v24/take_picture_btn.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/album.png b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/album.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a6fdedaee3cce52cf376ecb9977ea750a6014df
GIT binary patch
literal 10284
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
literal 0
HcmV?d00001
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/album_pressed.png b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/album_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa873424ebb9921081bbb9618875fc410bf9c84d
GIT binary patch
literal 9982
zcmYLvcRW>p{QohtbID%U4cRkWk#6J)xrDBjz4zWD<(h?y?2=2yCF9!JghJO0nPn?0
zJNceI-|yr1`{Um8$2pICU+?#Mzh1BBc*Q-`)ug3jrvdPd!y-Cn?8k*a`h%++qaMvRfV!m_U_-HT&!_&2WSO9uICNeqPgsHi9c
zEr;AqX}0^BGQHwF5o6t%Nbc1j3!bL{OOnq;nEys(E1aI&UQ%
zh|Bu$_wQe9I$}j|&v91qg;AzQtkua|jkkMmai$Hw9A`U!ybh#%`8ZJ&
ztCE7&C69bdzlY{rePahhuS)?Z5LozKmkV5m5b|Lszgl4&M4gisDB)dp0-)4NmXFJ^
zaqG8%#u3(o`;%QWQ4z)@aEfXeG3nFge*ahRIsHO0QC*QzeKaeA4G#;O>7eCCI3?Si
z`43xh>%MT6wuiO)5AD$Fci^oJ4GjU^t3x>v1`lOr^vhj<8t;`s>|yYQ8_*FU(chDu
zH}YExXe=!$St}MZt@rI+ZTn7CW8E9yrt!A(b)X2qIet3gDSkba9dNHS6qcu@rSS_|3hwpm~PBaClp~C9}E4zJtiefZDYn`3Yy)IVutd
zvD)td18L``BuxOe$mRR=Lpl^Cl>Mhl|?Oj4S59mo<7
z$}_Jw;$k14shm1sRuv^kNRFke2NSZ7oBB*PB{B{VUby(c?iFP
zJ8%xjUjE+RUeepQZ=Z$wAe|6$es~)oJ44Uo7Jdor$8OPM$|DaM7P;D*Aie^XY(<+`dW~E
zUzr%NeEt^-ky1$3>SW*rzOg@F66@~nR(%j<`LXt$QMrrCh%yhrDr!MR5>5e;KqA}_
zQO3ohR9ESFdlb?Ai;n(`r&q|yA#<|yqNK*__)#JJT^zmcrleSAFpiqE5@oNw|=7P7Pgwj9GJu2J~
z;ZuWMmTm!y_&ANj65R$y0#o0sC4p1SoI`aaePKL0lei-%=jN9SFrT|%XMRj{P~@OY
z+`1CnY$k^Ah%~WYNy^E(RqQ8wo~ZQ0KSlBM1Uh)@Lzl1sB=_UrBG=SH7a~|7b6-BI
zoeFvp3hx=a&eX*nbJ~3xAb$Gv=?EJKN6Ss6XgyIT$N~;?W@b$;6d+2YR)onU=~xip
z;`wMu(!qo%<>6b=KXRETZrf?60>qQ7&(fs-U?$JHwUkSytLT9geEZhSDy4MB9GL&@nxoIRc7rID4tQOIa6YKA%1>N*Hc9L7ted^liMPhlS;>H
zvH?-*XgA8SfN(NkKF65V1;YJKcbqqP`8~ZykQr{N}3Rhh%6F-j>
z!dCkJTtgI`Ql*ZEkwQj{5N@7a549G;nRmkq3_9mG%7VDvg|diyjxP=r{&x8-!ub$a
z&5XKJGGjU3RGPdK*^5C7p`D>Q{tMBnX}^erpzuiU?N>(&iBh+Zlscp}VV
zdIw_r4qC6f;Mt9pg-tX6J$W50rDuHNKf`hO119y{$Z?`nz6Tj-3y;Jm5#8zi^Iza0
zUKWM_Df@)3rC88mg6c<;P5GvUD*rtee=g|M(oKvUJO+S;W>a~XlKc>yzLba$G1PrW
zTYOrxl7N!W!F0|9@>`uhRzn2IhPWv^wlPBVbVaZag@L%#W+{b=10&w$%yguOH*28Q
z3>Ms`OFCHa+wNVSnGYey15SJ;+GJqDj40cy*j9aG)c$xkR%pk1w7)au>9QGdmHRlV
zz4mdfEbU9dx4oHMOp2w6#J+VVnQ5Ap`wPBOBvnd7tHkb9&|JH@0~Otcjnwi?b^Bb%?+hqQ^kc=w6Nw|p??$wjq>M>);$p0_kIFZvZAI4xAq4JmM=L*u?9r%S&DV6FxW
zGv9yD)1>WkamLrhNW@o0xxRd7dNk}~jol|YlR8HN5+_?_ZMOwbH~!LW9M($BjvEG+
zoNLTJkJdjCa8NNss}GYhH}B?)!;tG@ppQzq$8`eJem=@L8g&oxeSE6_1;ZJ
zg~&|?)8Jws;`{WZ<=v8Xl~mUzihPj$_fDrBu^5RfKzUi&wt!n=kXEhqr@y#b@FXBI
zW2W=hXeYtm=O*hHdVd$&A8XQ*c`9bxxH
z06s+p6~BFo4s1dW_FnL%3#A}yO4c5#+h@hN2#jO5GroXz(^3Oo|16-wI>nmk{{T*&
z@l_7nzeEt@hO+Dm%>E@Y&;o0$Zy!V5sB~Wut|%JmBQ^`mM4!YA7Q+w6z)XBE;dEKOs
z!1GruU{l|LF7L@5QFMF$+})LIX>X`|R6fBHlz*(P&EHmvzdfB=&*#EOZCE}bo4>Xf
zXXKjjXMfdKF`E%eK;rq0x@t)SoN;;7g(my{0vw#2+gv<6?YZdH!B_j2z+xy)mSsiA
z^a@H1G2jzYKlBCdxMF7dRFMdV{b9gWY0f=Mzh?+Sg6bGWMz|LVQA<8_`2gZ&%KH2|
z`ov`8EdRjvhv@L}g#mhfE5ll~0{?g1weEoE$49`k=vky@-K2}?IwFMNZ;e$@`}-Jw@$2XUlPsbTWF3Fk|FAYIz{
z4uzLgOXDm>e3v&*maa03TBRCXL>{cOXD;{|ISzhA_T=Ly@i&fC9dQc;C7t~=PSVbO
zNt%Y4`+S8WNm7|8A~>QHQ0tQtC`{^m<>%$Qa*V@AVp3&(`t)54_%}}mZ$>m2b<$v|
zd4JvMkr9PE;tpvtPuWD!Hfn!N@spNy^cJag!^DEvKa_wcblUcOqoboEg+tEOu}&8k
z%BL-~Kn%#6B61){k|h5?iymCAvP1df$B$PuG&KWIR1yQICs9q-w&-t~IMdbW7+4MUvKW!FKgVgdvB
z$_G)nRn)uUpA~DKwSNt8ha$yvo~n@)ycxX9Bd(&0LG#ThTs`4=eUVcVc>XLkdrqYX
zeV^U9Lr>}uV-@&fNR*!NDN$$D52ymKn`A#
z0I|I~S0EQd`bK8i!#OyRoi5a~NJDC_Penr?}PwInQzkc1w
zgKop|l`4zSN;`36lJa0(fDu-i
z6a%XTk&JHTEq~nMrp_gqC*=SV>Xv*7uZNVzgQA>K^5lbXED5V<$Ntu?j>k%?#^z!_A7vSwV-HNbgEH@eanR
z@G5-xuiKILg-%ZrUUa(76lC_wyM4w;=rC#>6pNhM;AC6S25r~-El`Fu7@38ybu3P}
z2-)gr(mS4^tk31zZ_DEF+PBm>?jf=T{(&QYxbM9**CRj8o)^McaqR@lloK$f()+G>
zvylS}kX&%*0wA!806LPqNO%h+IBW)IR=u7N?wzmuK9^sm9%D#A)54UHE<==(N@bM1
zztrG4*;_kbP?z1LYOY+@;?~ppUcKqM!F%rO2Xe6B4pyJd
zA0o`k4qV(*aor!NlpH7D=aSM{#Apd3UMSV_Yws?#lc<70FEo$f&zG
zq#VXf2D4TEuP}gYFf3N-ths48X{(NoQ179x$ry9W+A-IyAtxsfR+w=G09ORl_9RMT
zAXpvocMk+C5nPaqoxnj~LHa#c?D%uvMtpt(#yita=!NiE+hr!)x8d20Y29S`zq&*t
zM$g|Hl8D~VO<2m$&wtzC3Sump*bELAA^tTh3$`2dkP&$7xL{mD^+zFOxQ7SPN7wVC
z#P33?IQ-uyDv$SsiZGUBk(9=%r|czl%S=DYf{?zywhD@3+;fRnj@_9(zdmV}sxQiK
zRjK8Z5Y2KE@`1NzA43bS068jJEH1bzq3w4qYEnWg4ZvayGu`18)RqlOP?d>*L|9O|
z33Dv;14|)EU!!x-CkyGwO1wOh?csp!a^+?iIxwu{7F5cM;RHAF#{gZI_4n>yE?gY(GT)%{od$=92@*D2h`$
zk{;m%Wf=Ec%vluKn0l(`hcu&%SZ(KP3s^c*BjK1&`V{rd4ZF)5t6rjzK1O_3>^v
zhR8ZSR-UH&5l9&8$^1lZ*EAU}tXr{j;fEl#5{FbPYq`F144?dVV`E|K@GKkDR)$Ua
z>&b$9<138HMQ)AM2HhK{q32#q_}&OxUi!J7R_i)l^DKc`Y#B)>aicJR-Nt(E?7M5q
z)NwMC=>gKEfOGgwF=p`F9RJU#drm3&?-$Rt$tl(*!z?(xJUn&|a
z!ehE4K*gw@Yfx4}0OEn29vMX)+|io_JFd~i^!$eqH|HXiUSOI8pkCIHmy@e^JU{yR
zU{+3t!iy7jTj7xv{0|Ejqto#~`=b!nwrb;XIXB+0I;$(TudmMnA9jA^Kvg`Iy9xJT
zvSB_;4!8+ot5!(Jgy?fY-)VB*o>)kAp1MU9n3;MBS1RfGDuIoDW6_0U)h@_OpU?eO
zV5OZ&NrB9I6Pk2f{{x9Xlwah3iz$Yp(aAD>p%P?9S+$;Fy_=0X!Stk>41}w3@1$Sg
zJ;2K4m98$kaJ<6{%Zb1LY*e{&J}?F2H&+z!O{xmB&jENMzZF53b1=wfdvumN?Mp+Z8Uq#l(h<0s|p$Wd~1#>Q#MUPg6(t+{sgsNf8V
z7zJvGBD%x?MbM+n%VkpTnwyh5o#WJd&CbDLIu>91=kC>8zuP$j7o$R*W#5u|alBn&
z0X%6+eu*x#avlXU{`%#{BPlB>xm$z4?n?r#(2W>+!eQSld+E0~7{p>486c{dcRtn1
zbMNrs4vz*xgjI#ozDK>y`{X+}+*%#XL~(sKRCR
zdA-g#BWdRwD^~BscpdY5vxk5}7HL=;KD
zsGK;2%Oi2g^7sMD)~D^jBsVTHT1pJ{KF?se(O>7*=K0@XShLJq2i~!5F63Yp&@s)n
zVWCiuKB2{q3*CG8S@BR%L=5X%{$t|e;$md$=g%;7d5XQ=?~3^TqE?4N=abR{{zB>`
zDY22k<(H=0(?2F$+g#KFZ=jHwOzQjemjcvA76}keXSA;yD~agiBBHt%vfn;WcpJ5;hDQ1WqoI7
z=Vi0QNd68#0)C%Rc{rFIY1S~l?Kj7P!FJIan1Z=tc
zK+f@*(G=|;4AI+?{zA$FIPwCb(G)FpeD^)rJ8O{j|&Ll@jFVceS
zgb(j98V<@eS9YdrKg#X(7YwS^stK)(0h0PEVQm`ltt6?Sko=kv)>xl(9CPtw&-+?oMwZF&69(=&;ivxn*wDCT5ldiunPs-txiwk8h(LlbYY>ruB60a-Z)n4r^<+_aruO_Vlkt7>(i9neuh)OVA$aB$!sYM
zi^=sy8(d8v8X`WZ9CWWZDxr&BOq8VAsb12rnzEF}7j=gNR^;kvO~@VvwY?=MaZE%H
z$AJn(IBZ$@Mb}y^tWbj0X8yKf$8@TlGHn}QzTYGFNzr^3)!!AQ%XVx<011%DI!Y#cdKtXDq-{DlNn|y5R
zh%;^>GeaEAj`q-6{`R!GNi*jV%N(MY>zQAKEhQjsH~aXG^s~$QK`@p8g0a}9wsCLC
zd$8|}tl<+VLq6<`N#^mO#kI2-N|6z3)i}}jvh|F^#y&89gzP2A?>7C@(6?<9n`SiPnjB;3
zJr)P`hIR$d{WHku_iPZQO`9zyw3ED8CVB$9&FAZ5Y$H@J*JVEmZz%&Rg?I}a?4Bqb
zB!;Rqcg52L()I<<{ffvM;WK+fF)G?Zr<#8qskcR2)c0`ZGm$6q7)nlr-o@c?AbCh_zWA2Mt~^%>f=);8S4<)U=@$7f1VoTh@;;SzrR
zSWzkkwVN&UJI_*~vWe^9qP
zjQYT|E%Y>Xe%>M+zj-EU$Z_s3HB<%JBgJAS>~nsCJZ>s5|Kq@C8&k85#vqVjhe`mU
z0!D+iq`LB3T)7k9M$P!MaAfFpBb(2s^}p-o*C6ddT>NYQUv;=4@?J=Uo`K+;vu~Q5
znNsgBw4wBs7=2=o9q018n^;f&=X0=E9k6Q);+oB&9QjLo@tGi^t~?NB=YX=p=j~
zyLI%{CdB{Ow}C37+6jq<6#Y@(5;AANvvBfk;Pm;p%k
zA+(BgT??Ob#7QLAzGqT1sxTo;Io=Fps@9si^fjak)YwgMyVzI2e%fi7A-*aGR?!%+
z+W*XRCgX)OK~8@RuIe}hV3BN`?CjZSWshL8I3vjIp=ATH9J%X!Q!6tI8fsc&ADE$q
zFIa7kT6+9x($I4vdZ;O9GOJ}!3uArW8ZY`jiyag^rR=-f5r|W7V9~f7)|WX;Q&J?9
zLFONnA7G6$3c*Y;sQ;0Lg-;`Uy+#hmUGUlUZyLz&|9(Ad)MMw3_gw12|EunIF~MUR
z1*ye#k$5tNlF7xzMW3VX>Fz3{db_$j1|B6MK8olGg0QtL1+00H)hCY0OUn=ijUqFX
z$bCD}tpsUeR5OW~WoSO1U!s4ZkMMdkRFlqpe}cHut`4#%jKz#yt(Q@Yp}%skgzQlc
zfw}Z{UQ!#s&bdj)@x>K%zueZUr*HG1Vg@cpMy*gM#l>y^Dk!>e=}sf4i>!%+R;~bx
z?56fw)W>|p6e4z}iD83)J!#J@U1gDonB)X8W$5XzQB?cwI3`BWi`n82g9j-i0FFH3>
zL!9yh@5M<$`$Y(QJ9|7?hlp?R?x#D*YT1QiL6cvasl!H@$3AlbK*vMY=Pu7HcBH|D=6Ido$!wPu6(HQw)fA=f{PVLIjuN+yXyhUk7>
zd@dzm>GSBmOJ0_4Wi#gYDflk5D2v*3K}U;Mmb421$SeNM0z`*bn@fkWhW+Pm(Uq1a!~du8XhRiQG*saxO}AxJGSumpg{fi|F&|3HjA7*G*zA7}#*9rpiO|N(6!9H;
zP7qqaLz`?8bpEXNdyogM0&!|xvdfJ|xdzt@r#NgHErO?);L@we)-Cl+V{N)JjB`
zapFw?A2H=ruCi=Y;m!o=GAugWE;AYocEHc7@phuidGqAV24?(G2Va;wU=`K2qpAxp
zXApErCzBvrsL@UUy@9&nNySI^;NL1RsJzUXrhgGCq#aS4U+E8efnM)w{Lxz(s(ltJ
z){z{G4&(}%5qSB>6nDr=dB*=MRap)8l238)d*wFS=RLmji5gv%vl^R9X0+L)V)8dR
zc2Cs{lo#0-hREG_&**3At0k6b((f2k(oU7RQ%2_5tb}yK3pd?M>|$
zv-5tR+X(?G1;=umA4Hth<@*ms`(j3@e1dK{Yi2
zMAjN`P9?Pj?6e6c6}by-j{gO+IPVw|FfSO)8SFn!??YfSCZ&eIN++CWm(j|n=O8eW
zXHW7&2ZH8*-m*z-VRkxW`iogCzE@<@*T&oE6oK`Yf=E4d-AXeVq9h@M?6C3hEGQ@`
zHIJ1U5P^^J2J33B|GN2kjSwomFEo9H(-g8ho*Jyrw}41v>Mcw)-P2YPlq>^NmDkHOHYZaOTdIeR_Am#Z
zI$_c5j_h2w@0x^#WBlYc-?TqCZQ;fGk+?&juwcbT8%=F*;g;xyxSNwAu2cP!BJw?1
z<5}feP+FC_4qI>G!4ZY%0#T#~lkA|Bx2!4zuwW#z&g%V|4O^Njm84x
zOD5_sN{WV>fD=8YM2l`tJ9?{GvFs2h;K`y&6q>Ohi0B4!*Al!3P~ZeIcncq}H)Spc
zaa@VaQ5k7zGAh57|2o2|#g|j97`XS`svm0gUeujH#7w7_4G7<7SC1g)h{9QRJ#k5qPw
zQMf);dafxYW@wrW)2W{h@yhGuoX$xav}M7612Ig52w|NxUllchB>ex5*5pNXMM&Hq
zL!0*`bmw?%ZfrC;eaaA1ZnpYnPV#bKzzpv^!3#Eoh_xv2YJ)|r^#s=y9+7iGF$#6D`ri{5JK48_P6N?Ad8&Yzg&S9!X_F@
zJf5T@17&6Hd!^Y-0LDI=5!+^zMAmviVal60qR7mElc)Oz@ISneTMq?(^+IEk4lls-
z_4S0-frzWX!o8lIXI3Y3H9dJbr`nN?(=OzA%)TV(zjR4%e>W_%VikXZEZa}=&;LoO
zOV|jSuV428yM;au?=w-Xk}lp{!2o3&`f_%-B?1}+G}$XO+#?4kM>!t9GvV?JX$51K
zJT7(AzzK8szRza+DRX!L>vO%Je0c30+~A3C}uA=>4pdXse19vo-`
NwC?G`E7hMw{|}{%Ewlgt
literal 0
HcmV?d00001
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/back_btn.png b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/back_btn.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff121e85f5614dfd022f39627028af825a46d683
GIT binary patch
literal 455
zcmV;&0XY7NP)Px$fk{L`R7ee_)juf2aTv$(yX$hI{E2}ivam=p$Rx_3WKfbxN~EM@k(5%BO-WfU
zWl@q%HpwItU5P~`e@e=q$e-iq{oFle{yooApZi!ouPf;*5^-D*1ZCuuOqv~5>
zrA!dR1lbdTyC*fFAx1H>N#tHgV`xMM43|aVK1sV3na&VF@JshukwHbI#;r&f<8Or)
ztVj#Mn<8sgqz>RwksUf78e&vIt`s?>^DIaa!;~UtbcqGYWq6>-4P9kH>^Eu$f78R5Cr_+ovj*@l7te|F0k6$6}HucYmJGEE%xis4oBj002ovPDHLkV1m`y!3qEX
literal 0
HcmV?d00001
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/more_menu.png b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/more_menu.png
new file mode 100644
index 0000000000000000000000000000000000000000..edf9f3ccced5afeb71d9516d93ea19f26c7d9984
GIT binary patch
literal 414
zcmV;P0b%}$P)0`;fA>{1X_Il!ymh=^7u{{Rl_|GL>6mPM;1WY$RjBH$w
zWyNH^^e|SD$^D5?A`~MKi>Dn*gkl6@@w7vUP>et<-f}zi4a_uOC8db_zyJUM07*qo
IM6N<$f|TdAY5)KL
literal 0
HcmV?d00001
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/realtime_start.png b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/realtime_start.png
new file mode 100644
index 0000000000000000000000000000000000000000..94ab0817247bfa462d539237441cdc5795f1fdb0
GIT binary patch
literal 6166
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
literal 0
HcmV?d00001
diff --git a/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/realtime_start_pressed.png b/examples/vision/ocr/PP-OCRv3/android/app/src/main/res/drawable-xhdpi/realtime_start_pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..feef0fea62a15ab72af6556cae2811f9e5f1e3c5
GIT binary patch
literal 6113
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 M6(*
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