HarmonyOS6 - 鸿蒙AI卡证识别实战案例

HarmonyOS6 - 鸿蒙AI卡证识别实战案例

开发环境为:

开发工具:DevEco Studio 6.0.1 Release

API版本是:API21

本文所有代码都已使用模拟器测试成功!

1. 演示

鸿蒙-AI识别身份证号

2. 需求

需求如下:

  1. 用户可以拍照或从图库中选择得到身份证正反面照片,然后自动识别出相关信息,显示到页面中
  2. 用户可以拍照或从图库中选择得到银行卡照片,然后自动识别出卡号等相关信息,显示到页面中

3. 分析

针对以上需求,鸿蒙SDK中的AI能力里,有一个卡证识别控件,该控件提供身份证 (目前仅支持中国大陆二代身份证,且不包含民汉双文身份证)、行驶证、驾驶证、护照、银行卡的结构化识别服务,满足卡证的自动分类功能,系统可自动判断所属卡证类型并返回结构化信息和卡证图片信息。

对于需要填充卡证信息的场景,如身份证、银行卡信息等,可使用卡证识别控件读取OCR(Optical Character Recognition)信息,将结果信息返回后进行填充。支持单独识别正面、反面,或同时进行双面识别。

但是在开发过程中,我们需要注意如下约束和限制:

  • 支持的语种类型:简体中文、英文。
  • 卡证识别暂时只支持中国二代身份证、中国国内银行卡、中国护照、中国驾驶证、中国行驶证(暂不支持中国港澳台地区及海外证件)。
  • 卡证需要保持与真实证件一致的长宽比、没有形变、正向拍摄角度小于30度。
  • 卡证图像清晰、完整。无摩尔纹、无遮挡、无反光、无卡套。
  • 不允许被其他组件或窗口遮挡。

4. 开发

官网参考API文档地址:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/vision-card-recognition

我们可以参考官方API文档进行代码开发,以下我以身份证和银行卡识别为例

1. 身份证正反面识别

页面代码如下:

js 复制代码
import { CardRecognition, CardRecognitionResult, CardSide, CardType, ShootingMode } from '@kit.VisionKit';

/**
 * 身份证人像面,数据模型
 */
export interface CardFrontModel {
  name?: string //姓名
  sex?: string //性别(男)
  nationality?: string //民族
  address?: string //住址
  birth?: string //出生(1991年5月13日)
  idNumber?: string //公民身份号码
  cardImageUri?: string //身份证人像面图片uri(不含背景)
  originalImageUri?: string //身份证人像面图片uri(含背景)
}

/**
 * 身份证国徽面,数据模型
 */
export interface CardBackModel {
  authority?: string //签发机关
  validPeriod?: string //有效期限(2021.05.31-2041.05.31)
  cardImageUri?: string //身份证国徽面图片uri(不含背景)
  originalImageUri?: string //身份证国徽面图片uri(含背景)
}

/**
 * 案例:身份证正反面信息识别
 */
@Entry
@Component
struct Page12 {
  //保存身份证人像面数据的对象
  @State cardFrontModel: CardFrontModel = {};
  //保存身份证国徽面数据的对象
  @State cardBackModel: CardBackModel = {};

  build() {
    Stack({ alignContent: Alignment.Top }) {
      Stack({ alignContent: Alignment.Top }) {
        if (this.cardFrontModel.name) {
          Column({ space: 10 }) {
            Text('身份证正面信息:')
              .fontSize(20)
              .fontWeight(500)
            Column({ space: 10 }) {
              //正面照
              Image(this.cardFrontModel.cardImageUri)
                .objectFit(ImageFit.Contain)
                .width('100%')
                .borderRadius(5)
                .height(160)
              //姓名
              Text('姓名:' + this.cardFrontModel.name)
              Row({ space: 40 }) {
                //性别
                Text('性别:' + this.cardFrontModel.sex)
                //民族
                Text('民族:' + this.cardFrontModel.nationality)
              }
              .width('100%')

              //出生
              Text('出生:' + this.cardFrontModel.birth)
              //住址
              Text('住址:' + this.cardFrontModel.address)
              //公民身份号码
              Text('公民身份号码:' + this.cardFrontModel.idNumber)
            }
            .width('100%')
            .alignItems(HorizontalAlign.Start)

            Text('身份证反面信息:')
              .fontSize(20)
              .fontWeight(500)
              .margin({ top: 15 })
            Column({ space: 10 }) {
              //国徽面
              Image(this.cardBackModel.cardImageUri)
                .objectFit(ImageFit.Contain)
                .width('100%')
                .borderRadius(5)
                .height(160)
              //签发机关
              Text('签发机关:' + this.cardBackModel.authority)
              //有效期限
              Text('有效期限:' + this.cardBackModel.validPeriod)
            }
            .width('100%')
            .alignItems(HorizontalAlign.Start)
          }
          .alignItems(HorizontalAlign.Start)
          .width('100%')
          .padding(20)
        } else {
          Column() {
            Text('暂无数据')
              .fontWeight(800)
              .fontSize(30)
          }
        }
      }
      .size({
        width: '100%',
        height: '100%'
      });

      if (canIUse('SystemCapability.AI.Component.CardRecognition')) {
        CardRecognition({
          supportType: CardType.CARD_ID, //Types of cards
          cardSide: CardSide.DEFAULT, // identify Pages
          cardRecognitionConfig: {
            defaultShootingMode: ShootingMode.MANUAL,
            isPhotoSelectionSupported: true
          },
          callback: ((params: CardRecognitionResult) => {
            if (params.code == 200) {
              this.cardFrontModel = JSON.parse(JSON.stringify(params.cardInfo?.front))
              this.cardBackModel = JSON.parse(JSON.stringify(params.cardInfo?.back))
            }
          })
        });
      }
    }
    .width('100%')
    .height('100%');
  }
}

只需要这一个文件即可,拷贝过去就能使用,用真机访问该页面就可以出现如下效果了:

鸿蒙-AI识别身份证号

2. 银行卡号识别

上面身份证正反面识别没问题之后,其他证件,如银行卡、护照、驾驶证、行驶证等证件就都可以识别了,无非就是改下【CardRecognition】控件中的【supportType】参数即可

supportType参数支持的类型有如下:

页面代码如下:

js 复制代码
import { CardRecognition, CardRecognitionResult, CardSide, CardType, ShootingMode } from '@kit.VisionKit';

/**
 * 银行卡,数据模型
 */
export interface BankModel {
  bankNum?: string //银行卡号
  validPeriod?: string //有效期限
  cardImageUri?: string //银行卡图片uri(不含背景)
  originalImageUri?: string //银行卡图片uri(含背景)
}

/**
 * 案例:银行卡号识别
 */
@Entry
@Component
struct Page13 {
  //保存银行卡数据的对象
  @State bankModel: BankModel = {};

  build() {
    Stack({ alignContent: Alignment.Top }) {
      Stack({ alignContent: Alignment.Top }) {
        if (this.bankModel.bankNum) {
          Column({ space: 10 }) {
            Text('银行卡识别结果:')
              .fontSize(20)
              .fontWeight(500)
            Image(this.bankModel.cardImageUri)
              .objectFit(ImageFit.Contain)
              .width('100%')
              .borderRadius(5)
              .height(160)
            //卡号
            Text('卡号:' + this.bankModel.bankNum)
            Text('有效期限:' + this.bankModel.validPeriod)
          }
          .alignItems(HorizontalAlign.Start)
          .width('100%')
          .padding(20)
        } else {
          Column() {
            Text('暂无数据')
              .fontWeight(800)
              .fontSize(30)
          }
        }
      }
      .size({
        width: '100%',
        height: '100%'
      });

      if (canIUse('SystemCapability.AI.Component.CardRecognition')) {
        CardRecognition({
          supportType: CardType.CARD_BANK, //表示需要识别的卡证类型
          cardSide: CardSide.DEFAULT, //需要识别的卡证页面的枚举值。(DEFAULT:卡证默认面。如身份证为人像面,其他卡证为正面。)
          //cardRecognitionConfig:卡证识别配置项
          cardRecognitionConfig: {
            defaultShootingMode: ShootingMode.MANUAL, //拍摄模式
            isPhotoSelectionSupported: true //是否支持从图库选图。
          },
          //CardRecognitionResult:卡证识别结果返回的参数
          callback: ((params: CardRecognitionResult) => {
            //200:识别成功
            if (params.code == 200) {
              this.bankModel = JSON.parse(JSON.stringify(params.cardInfo?.main))
            }
          })
        });
      }
    }
    .width('100%')
    .height('100%');
  }
}

只需要这一个文件即可,拷贝过去就能使用,用真机访问该页面就可以出现如下效果了:

鸿蒙-AI识别银行卡号

其他证件以此类推,这里我就不再赘述了,大家可以自己换一个证件类似测试即可

注意:

在拍照时,我们只需要对着卡证即可,会自动进行识别区域,还是比较智能的,其他地方好像是需要对着卡证非常正才能识别到,鸿蒙的这个功能感觉更好用一点(个人感觉哈)

最后

  • 希望本文对你有所帮助!
  • 本人如有任何错误或不当之处,请留言指出,谢谢!
相关推荐
熊猫钓鱼>_>几秒前
Flutter app_settings 鸿蒙适配实战:Intent 体系到 Want 的跨越
flutter·华为·harmonyos·openharmony·intent·want
贾伟康3 小时前
【句匠|20】HarmonyOS ArkTS AppGallery 发布复查实战:核对包名、版本、设备、素材和离线声明
harmonyos·arkts·应用上架·appgallery·发布审核
贾伟康3 小时前
【句匠|15】HarmonyOS ArkTS 本地状态持久化实战:让保存、删除和页面返回后的数据即时一致
harmonyos·arkts·数据持久化·appstorage·preferences
lifallen4 小时前
短暂 Agent 与持久化工程:让理解脱离对话
人工智能·学习·ai·重构·ai编程
举个栗子。5 小时前
Marin:开源基础模型研究与开发框架,从数据到模型全链路可复现
人工智能·ai·开源
undsky_5 小时前
【n8n教程】:Email Trigger IMAP节点,实现邮件自动化处理
人工智能·ai·aigc·ai编程
云卷云舒___________5 小时前
OpenAI内测GPT-6 Sol,Claude Fable 5.2泄密,GLM-5.3-CYBERSECURITY 攻防安全模型炸场 | 9月7日 AI日报
ai·openai·claude·anthropic·ai日报·gpt6·glm53
liulilittle6 小时前
为什么需要回程闲置保护?
ai·llm·prompt·agent·tools·subagent·opencode
贾伟康6 小时前
【句匠|16】HarmonyOS ArkTS 多设备布局实战:适配手机、平板和 PC/2in1 的窗口变化
harmonyos·arkts·arkui·响应式布局·多设备适配
小雨青年7 小时前
【HarmonyOS 7 平行视界深度实战】03 购物模式怎么实现连续浏览和左右推挤
华为·harmonyos