HarmonyOS 鸿蒙Next中textRecognition文字识别问题

HarmonyOS 鸿蒙Next中textRecognition文字识别问题 怎么才能让canvas或组件截图的image.PixelMap进行textRecognition 文字识别

5 回复

可以将pixelMap作为参数传入文本识别接口textRecognition.recognizeText,将图片中的文字提取出来并展示。

示例代码:

// 调用文本识别接口
let visionInfo: textRecognition.VisionInfo = {
  pixelMap: yourImageInfo
};
textRecognition.recognizeText(visionInfo, (error: BusinessError, data: textRecognition.TextRecognitionResult) => {
  if (error.code !== 0) {
    hilog.error(0x0000, 'OCRDemo', `Failed to recognize text. Code: ${error.code}, message: ${error.message}`);
    return;
  }
  // 识别成功,获取对应的结果
  let recognitionString = data.toString();
  hilog.info(0x0000, 'OCRDemo', `Succeeded in recognizing text:${recognitionString}`);

  if(yourImageInfo && imageSource) {
    yourImageInfo.release();
    imageSource.release();
  }
});

更多关于HarmonyOS 鸿蒙Next中textRecognition文字识别问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


直接传canvas或组件截图的image.PixelMap不行,它直接返回一个全是空字符的TextRecognitionResult,识别不了文字信息,

【背景知识】

textRecognition:通用文字识别服务提供图像信息转换为字符信息的能力。

Canvas:提供画布组件,用于自定义绘制图形。

【参考方案】:

可参考涂抹识别文字并复制示例,基于textRecognitionCanvas实现了将图片涂抹区域中的文字识别出来,基于Pasteboard实现复制功能。

  1. setTimeout():当手指按下时,开始新的路径,当移动到触摸点位置时,将当前点加入erasePathList,用于后续计算边界框。在计算所画过的路径时,遍历所有路径点,找出最小和最大X/Y值,用于后续的图像裁剪。
setTimeout(() => {
  // 遍历erasePathList找到用户绘制路径的最小和最大 X、Y 坐标
  this.erasePathList.forEach((path: ErasePath) => { 
    minX = Math.min(minX, path.x);
    maxX = Math.max(maxX, path.x);
    minY = Math.min(minY, path.y);
    maxY = Math.max(maxY, path.y);
  })

  minX -= PATH_LINE_WIDTH / 2
  minY -= PATH_LINE_WIDTH / 2
  maxX += PATH_LINE_WIDTH / 2
  maxY += PATH_LINE_WIDTH / 2
  this.cropImage(minX, minY, maxX, maxY);
  // 切换到正常绘制模式
  this.context.globalCompositeOperation = 'source-over';
}, 0)
  1. cropImage():调用crop函数,根据所画过路径的边界的四个点将涂抹路径裁剪出并保存在imagePixelMap中。
async cropImage(minX: number, minY: number, maxX: number, maxY: number) {
  let pixelMap = await this.getPixelMap();
  await pixelMap.crop({
    x: minX * this.ratio,
    y: minY * this.ratio,
    size: { width: (maxX - minX) * this.ratio, height: (maxY - minY) * this.ratio }
  });
  this.imagePixelMap = pixelMap
  this.textRecognitionTest()
  return pixelMap;
}
  1. textRecognitionTest():通过recognizeText函数将裁剪出的图片中的文字识别出来。
textRecognitionTest() {
  textRecognition.recognizeText(visionInfo, textConfiguration)
    .then((data: textRecognition.TextRecognitionResult) => {
      // 识别成功,获取对应的结果
      // 将结果更新到Text中显示
      this.dataValues.push(data.value);
     })
}

鸿蒙Next的文字识别功能基于系统提供的AI框架实现,支持静态图片和动态视频流的文字提取。通过@ohos.ai.textRecognition模块调用识别接口,可返回文字内容及位置信息。需在module.json5中声明ohos.permission.READ_IMAGEVIDEO权限。目前支持中英文及数字识别,识别精度取决于图像质量和文字清晰度。

在HarmonyOS Next中,可以通过以下步骤对canvas或组件截图生成的PixelMap进行文字识别:

  1. 使用@ohos.multimedia.image模块获取PixelMap对象。
  2. 调用@ohos.ai.textRecognition的文字识别接口,传入PixelMap进行识别。

示例代码:

import textRecognition from '@ohos.ai.textRecognition';
import image from '@ohos.multimedia.image';

// 假设pixelMap是从canvas或截图获取的
async function recognizeText(pixelMap: image.PixelMap) {
  try {
    const textRecognitionResult = await textRecognition.textRecognition(pixelMap);
    console.log('识别结果: ', textRecognitionResult.text);
  } catch (error) {
    console.error('识别失败: ', error);
  }
}

注意:需要申请ohos.permission.MEDIA权限,并在module.json5中配置。

回到顶部