当前位置:   article > 正文

基于PaddleOCR开发uni-app离线身份证识别插件_百度开源paddleocr本地离线识别

百度开源paddleocr本地离线识别

目录

目的

准备工作  

1、HbuilderX

2、Android Studio 并配置 NDK 

3、基于PaddleOCR的离线身份证识别插件

开始

1、在android sudio创建一个项目,并创建一个Module

 2、将ocr插件和uniapp-v8-release.aar引入libs目录下

 3、修改module包下的build.gradle

 4、添加OCRModule.java文件

5、将module打包aar包

6、打开Hbuilder新建一个uni-app项目

 7、修改package.json中的配置

8、在mainifest.json配置中引入我们的原生插件 

9、编写uni-app页面代码

10、制作自定义基座打包并运行到手机上

总结


目的

        之前做了基于PaddleOCR的DBNet多分类文本检测网络之身份证识别,可以得到一个不超过3M大小的模型,通过了解PaddleOCR的端侧部署,我们也可以将身份证检测模型移植到手机中,做成一款uni-app手机端离线身份证识别的应用。

准备工作  

为了不占用过多篇幅,这里不讲解Android studio如何下载和SDK配置,请自行查找资料。

1、HbuilderX

2、Android Studio 并配置 NDK 

请根据 Android Studio 用户指南中的安装及配置 NDK 和 CMake 内容,预先配置好 NDK 。

3、基于PaddleOCR的离线身份证识别插件

插件包结构:

开始

1、在android sudio创建一个项目,并创建一个Module

 2、将ocr插件和uniapp-v8-release.aar引入libs目录下

 3、修改module包下的build.gradle

  1. apply plugin: 'com.android.library'
  2. android {
  3. compileSdkVersion 32
  4. defaultConfig {
  5. minSdkVersion 21
  6. targetSdkVersion 32
  7. versionCode 1
  8. versionName "1.0"
  9. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  10. consumerProguardFiles "consumer-rules.pro"
  11. }
  12. buildTypes {
  13. release {
  14. minifyEnabled false
  15. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  16. }
  17. }
  18. sourceSets {
  19. main {
  20. jniLibs.srcDirs = ['libs']
  21. }
  22. }
  23. repositories {
  24. flatDir {
  25. dirs('libs')
  26. }
  27. }
  28. compileOptions {
  29. sourceCompatibility JavaVersion.VERSION_1_8
  30. targetCompatibility JavaVersion.VERSION_1_8
  31. }
  32. }
  33. dependencies {
  34. implementation fileTree(dir: "libs", include: ["*.jar"])
  35. implementation 'androidx.appcompat:appcompat:1.2.0'
  36. testImplementation 'junit:junit:4.12'
  37. androidTestImplementation 'androidx.test.ext:junit:1.1.3'
  38. androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
  39. compileOnly(name: 'uniapp-v8-release', ext: 'aar')
  40. compileOnly 'com.alibaba:fastjson:1.1.46.android'
  41. implementation(name: 'ocr', ext: 'aar')
  42. }

 4、添加OCRModule.java文件

  1. public class OCRModule extends UniModule {
  2. private final String TYPE_IDCARD = "idcard";
  3. public OCRPredictor ocrPredictor = null;
  4. public UniJSCallback callback = null;
  5. @UniJSMethod(uiThread = true)
  6. public void ocrAsyncFunc(JSONObject options, final UniJSCallback callback) {
  7. Log.d("OCRModule", "ocrAsyncFunc--" + options);
  8. this.callback = callback;
  9. ocrPredictor = OCRPredictor.getInstance(mUniSDKInstance.getContext());
  10. if (TYPE_IDCARD.equals(options.getString("type"))) {
  11. idcard();
  12. } else {
  13. if (options.containsKey("filePath")) {
  14. String filePath = options.getString("filePath");
  15. if (!TextUtils.isEmpty(filePath) && filePath.contains("file://")) {
  16. filePath = filePath.replace("file://", "");
  17. }
  18. ocrPredictor.predictor(filePath, new OnImagePredictorListener() {
  19. @Override
  20. public void success(String result, ArrayList<OCRResultModel> ocrResultModelList, Bitmap bitmap) {
  21. JSONArray jsonArray = new JSONArray();
  22. for (OCRResultModel ocrResultModel : ocrResultModelList) {
  23. JSONObject jsonObject = new JSONObject();
  24. if (!TextUtils.isEmpty(ocrResultModel.getLabel())) {
  25. jsonObject.put("words", ocrResultModel.getLabel());
  26. JSONArray objects = new JSONArray();
  27. for (Point point : ocrResultModel.getPoints()) {
  28. JSONArray points = new JSONArray();
  29. points.add(point.x);
  30. points.add(point.y);
  31. objects.add(points);
  32. }
  33. jsonObject.put("location", objects);
  34. jsonObject.put("score", ocrResultModel.getConfidence());
  35. jsonArray.add(jsonObject);
  36. }
  37. }
  38. String jsonString = jsonArray.toJSONString();
  39. Log.d("OCRModule", "ocrResult--" + result);
  40. Log.d("OCRModule", "ocrResult--" + jsonString);
  41. callback.invoke(jsonString);
  42. }
  43. });
  44. } else if (options.containsKey("base64")) {
  45. String base64 = options.getString("base64");
  46. ocrPredictor.predictorBase64(base64, new OnImagePredictorListener() {
  47. @Override
  48. public void success(String result, ArrayList<OCRResultModel> ocrResultModelList, Bitmap bitmap) {
  49. JSONArray jsonArray = new JSONArray();
  50. for (OCRResultModel ocrResultModel : ocrResultModelList) {
  51. JSONObject jsonObject = new JSONObject();
  52. if (!TextUtils.isEmpty(ocrResultModel.getLabel())) {
  53. jsonObject.put("words", ocrResultModel.getLabel());
  54. JSONArray objects = new JSONArray();
  55. for (Point point : ocrResultModel.getPoints()) {
  56. JSONArray points = new JSONArray();
  57. points.add(point.x);
  58. points.add(point.y);
  59. objects.add(points);
  60. }
  61. jsonObject.put("location", objects);
  62. jsonObject.put("score", ocrResultModel.getConfidence());
  63. jsonArray.add(jsonObject);
  64. }
  65. }
  66. String jsonString = jsonArray.toJSONString();
  67. Log.d("OCRModule", "ocrResult--" + result);
  68. Log.d("OCRModule", "ocrResult--" + jsonString);
  69. callback.invoke(jsonString);
  70. }
  71. });
  72. } else {
  73. this.callback.invoke("");
  74. }
  75. }
  76. }
  77. private static final int REQUEST_CODE_PICK_IMAGE = 200;
  78. private static final int REQUEST_CODE_PICK_IMAGE_FRONT = 201;
  79. private static final int REQUEST_CODE_PICK_IMAGE_BACK = 202;
  80. private static final int REQUEST_CODE_CAMERA = 102;
  81. private void idcard() {
  82. Intent intent = new Intent(mUniSDKInstance.getContext(), CameraActivity.class);
  83. intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD);
  84. ((Activity) mUniSDKInstance.getContext()).startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
  85. }
  86. @Override
  87. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  88. if (REQUEST_CODE_PICK_IMAGE == requestCode) {
  89. if (data != null) {
  90. String result = data.getStringExtra(CameraActivity.KEY_CONTENT_RESULT);
  91. Log.d("OCRModule", "ocrResult--" + result);
  92. this.callback.invoke(result);
  93. } else {
  94. this.callback.invoke("");
  95. }
  96. } else {
  97. super.onActivityResult(requestCode, resultCode, data);
  98. }
  99. }
  100. }

5、将module打包aar包

 

6、打开Hbuilder新建一个uni-app项目

将插件包和我们打的aar包如下放置:

注:这里ocr_module_support-release.aar改名为TomatoOCR.aar,改不改名无所谓。

 

 7、修改package.json中的配置

注意:name名是我们的插件名,class是我们编写的识别入口的类

        "plugins": [
                {
                    "type": "module",
                    "name": "YY-TomatoOCR",
                    "class": "com.tomato.ocr.OCRModule"
                }
            ],

  1. {
  2. "name": "YY-TomatoOCR",
  3. "id": "YY-TomatoOCR",
  4. "version": "1.0.3",
  5. "description": "离线版文字识别",
  6. "_dp_type": "nativeplugin",
  7. "_dp_nativeplugin": {
  8. "android": {
  9. "plugins": [
  10. {
  11. "type": "module",
  12. "name": "YY-TomatoOCR",
  13. "class": "com.tomato.ocr.OCRModule"
  14. }
  15. ],
  16. "hooksClass": "",
  17. "integrateType": "aar",
  18. "dependencies": [
  19. ],
  20. "excludeDependencies": [],
  21. "compileOptions": {
  22. "sourceCompatibility": "1.8",
  23. "targetCompatibility": "1.8"
  24. },
  25. "abis": [
  26. "armeabi-v7a",
  27. "arm64-v8a"
  28. ],
  29. "minSdkVersion": "21",
  30. "useAndroidX": true,
  31. "permissions": [
  32. "android.permission.CAMERA",
  33. "android.permission.READ_EXTERNAL_STORAGE",
  34. "android.permission.WRITE_EXTERNAL_STORAGE"
  35. ]
  36. }
  37. }
  38. }

8、在mainifest.json配置中引入我们的原生插件 

9、编写uni-app页面代码

  1. <template>
  2. <div>
  3. <button type="primary" @click="takePhoto">拍照OCR识别</button>
  4. <button type="primary" @click="idcard">身份证识别</button>
  5. </div>
  6. </template>
  7. <script>
  8. var ocrModule = uni.requireNativePlugin("YY-TomatoOCR")
  9. // var ocrModule = uni.requireNativePlugin("OCRModule")
  10. const modal = uni.requireNativePlugin('modal');
  11. export default {
  12. onLoad() {},
  13. methods: {
  14. takePhoto() {
  15. uni.chooseImage({
  16. count: 6, //默认9
  17. sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  18. sourceType: ['camera'], //从相册选择
  19. success: function(res) {
  20. console.log(JSON.stringify(res.tempFilePaths));
  21. uni.getImageInfo({
  22. src: res.tempFilePaths[0],
  23. success: function(image) {
  24. // 调用异步方法
  25. ocrModule.ocrAsyncFunc({
  26. 'filePath': image.path
  27. },
  28. (ret) => {
  29. modal.toast({
  30. message: ret,
  31. duration: 30
  32. });
  33. })
  34. }
  35. });
  36. }
  37. });
  38. },
  39. idcard() {
  40. ocrModule.ocrAsyncFunc({
  41. 'type': 'idcard'
  42. },
  43. (ret) => {
  44. modal.toast({
  45. message: ret,
  46. duration: 30
  47. });
  48. })
  49. }
  50. }
  51. }
  52. </script>

10、制作自定义基座打包并运行到手机上

 完毕!!!

总结

         以上就是制作uni-app离线文字识别和身份证识别全流程步骤,当然如果你不会Android开发也没关系,在uni-app的插件市场中已经发布了本插件。

 插件市场地址:本地离线文字识别TomatoOCR - DCloud 插件市场

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/754259
推荐阅读
相关标签
  

闽ICP备14008679号