HarmonyOS鸿蒙Next中卡证识别控件CardRecognition支持非平整放置证件的识别

HarmonyOS鸿蒙Next中卡证识别控件CardRecognition支持非平整放置证件的识别 要求卡证识别时,需要卡证放置平整。但实际用户使用时,可能会处于非平整放置的场景。

卡证识别控件CardRecognition非平整放置证件的识别。

3 回复

参考下这个demo:

import { textRecognition } from '@kit.CoreVisionKit';
import { image } from '@kit.ImageKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { picker, fileIo } from '@kit.CoreFileKit';
import { CardRecognition, CallbackParam, CardType } from '@kit.VisionKit'
import fs, { ReadOptions } from '@ohos.file.fs';
import { common } from '@kit.AbilityKit';
import { buffer } from '@kit.ArkTS';
import { router, window } from '@kit.ArkUI';

const TAG: string = 'CardRecognitionPage'

@Entry
@Component
struct Index {

 private imageSource: image.ImageSource | undefined = undefined;

 @State chooseImage1: PixelMap | undefined = undefined;

 @State chooseImage2: PixelMap | undefined = undefined;

 @State dataValues: string = '';

 @State isShowCard: boolean = false;

 build() {
  Column() {

   Button("index2").onClick(() => {
    router.pushUrl({
     url:"pages/Index2"
    })
   })

   if (this.isShowCard) {
    CardRecognition({
     // 此处选择身份证类型作为示例
     supportType: CardType.CARD_ID,
     callback: (async (params: CallbackParam) => {
      this.isShowCard=false;
      let file = fs.openSync(params.cardInfo?.back.cardImageUri, fs.OpenMode.READ_ONLY)
      let imageSource = image.createImageSource(file.fd)
      this.chooseImage1 = await imageSource.createPixelMap()
      let file2 = fs.openSync(params.cardInfo?.front.cardImageUri, fs.OpenMode.READ_ONLY)
      let imageSource2 = image.createImageSource(file2.fd)
      this.chooseImage2 = await imageSource2.createPixelMap()
     })
    })
   }

   Image(this.chooseImage1)
    .objectFit(ImageFit.Fill)
    .height('30%')

   Image(this.chooseImage2)
    .objectFit(ImageFit.Fill)
    .height('30%')

   Text(this.dataValues)
    .copyOption(CopyOptions.LocalDevice)
    .height('15%')
    .margin(10)
    .width('60%')

   Button('选择图片')
    .type(ButtonType.Capsule)
    .fontColor(Color.White)
    .alignSelf(ItemAlign.Center)
    .width('80%')
    .margin(10)
    .onClick(() => {
     // 拉起图库,获取图片资源
     this.selectImage();
    })

   Button('开始识别')
    .type(ButtonType.Capsule)
    .fontColor(Color.White)
    .alignSelf(ItemAlign.Center)
    .width('80%')
    .margin(10)
    .onClick(async () => {
     this.textRecognitionTest();
    })

   Button("开始识别").onClick(() => {
    this.isShowCard=true
   })

   Button("保存一个文件").onClick(() => {
    this.readWriteFileWithStream();
   })
  }
  .width('100%')
  .height('100%')
  .justifyContent(FlexAlign.Center)
 }

 context = getContext(this) as common.UIAbilityContext;

 filesDir = this.context.filesDir;

 async readWriteFileWithStream(): Promise<void> {
  // 新建并打开文件
  let file = fs.openSync(this.filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  // 写入一段内容至文件
  let writeLen = fs.writeSync(file.fd, "Try to write str.");
  console.info("The length of str is: " + writeLen);
  // 从文件读取一段内容
  let arrayBuffer = new ArrayBuffer(1024);
  let readOptions: ReadOptions = {
   offset: 0,
   length: arrayBuffer.byteLength
  };
  let readLen = fs.readSync(file.fd, arrayBuffer, readOptions);
  let buf = buffer.from(arrayBuffer, 0, readLen);
  console.info("the content of file: " + buf.toString());
  // 关闭文件
  fs.closeSync(file);
 }

 private async textRecognitionTest() {
  if (!this.chooseImage1) {
   return
  }
  // 调用文本识别接口
  let visionInfo: textRecognition.VisionInfo = {
   pixelMap: this.chooseImage1
  };
  let textConfiguration: textRecognition.TextRecognitionConfiguration = {
   isDirectionDetectionSupported: false
  };
  textRecognition.recognizeText(visionInfo, textConfiguration,
   (error: BusinessError, data: textRecognition.TextRecognitionResult) => {
    // 识别成功,获取对应的结果
    if (error.code == 0) {
     let recognitionString = JSON.stringify(data);
     hilog.info(0x0000, 'testTag', "textRecognition data is " + recognitionString);
     // 将结果更新到Text中显示
     this.dataValues = JSON.stringify(recognitionString);
    }
    if (this.chooseImage1 && this.imageSource) {
     this.chooseImage1.release();
     this.imageSource.release();
    }
   });
 }

 private copyFile(uri:string){
  fs.open(uri,(err:BusinessError,file:fs.File)=>{
  })
 }

 private async selectImage() {
  let uri = await this.openPhoto();
  if (uri === undefined) {
   hilog.info(0x0000, 'OCRDemo', "uri is undefined");
   return
  }
  this.copyFile(uri)
  this.loadImage(uri);
 }

 private openPhoto(): Promise<string> {
  return new Promise<string>((resolve, reject) => {
   let photoPicker = new picker.PhotoViewPicker();
   photoPicker.select({
    MIMEType: picker.PhotoViewMIMETypes.IMAGE_TYPE, maxSelectNumber: 1
   }).then((res: picker.PhotoSelectResult) => {
    resolve(res.photoUris[0]);
   }).catch((e: BusinessError) => {
    hilog.error(0x0000, 'OCRDemo', `get photo image uri failed:${JSON.stringify(e)}`);
    resolve('');
   })
  })
 }

 private loadImage(name: string) {
  setTimeout(async () => {
   let f = await fileIo.open(name, fileIo.OpenMode.READ_ONLY);
   this.imageSource = image.createImageSource(f.fd);
   this.chooseImage1 = await this.imageSource.createPixelMap();
   hilog.info(0x0000, 'OCRDemo', `this.chooseImage===${JSON.stringify(this.chooseImage1)}`);
  }, 100)
 }
}

更多关于HarmonyOS鸿蒙Next中卡证识别控件CardRecognition支持非平整放置证件的识别的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,CardRecognition控件支持非平整放置证件的识别功能。该控件通过先进的图像处理技术和机器学习算法,能够有效识别那些放置在非平整表面上的证件,如弯曲、折叠或倾斜的证件。这一功能提升了用户体验,减少了因证件放置不当而导致的识别失败率。CardRecognition控件通过实时分析证件图像的几何形状和特征点,自动调整和校正图像,确保识别的准确性和稳定性。此功能在金融、安防、交通等领域的智能终端设备中具有广泛应用价值。

在HarmonyOS鸿蒙Next中,CardRecognition控件经过优化,支持对非平整放置的证件进行识别。它通过先进的图像处理算法和AI技术,能够有效校正因证件弯曲、倾斜或褶皱导致的图像失真,确保识别的准确性和稳定性。开发者只需简单集成该控件,即可在应用中实现高效、可靠的卡证识别功能,提升用户体验。

回到顶部