HarmonyOS 鸿蒙Next中textRecognition文字识别问题
HarmonyOS 鸿蒙Next中textRecognition文字识别问题 怎么才能让canvas或组件截图的image.PixelMap进行textRecognition 文字识别
5 回复
直接传canvas或组件截图的image.PixelMap不行,它直接返回一个全是空字符的TextRecognitionResult,识别不了文字信息,
【背景知识】
textRecognition:通用文字识别服务提供图像信息转换为字符信息的能力。
Canvas:提供画布组件,用于自定义绘制图形。
【参考方案】:
可参考涂抹识别文字并复制示例,基于textRecognition和Canvas实现了将图片涂抹区域中的文字识别出来,基于Pasteboard实现复制功能。
- 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)
- 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;
}
- 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进行文字识别:
- 使用
@ohos.multimedia.image模块获取PixelMap对象。 - 调用
@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中配置。


