一、基本概念

  • 文档校正提供了文档翻拍过程的辅助增强功能,包含两个子功能:文档检测和文档校验。
  • 文档检测:能够自动识别图片中的文档,返回文档在原图中的位置信息。这里的文档泛指外形方正的事物,比如书本、相片、画框等。
  • 文档校正:能根据文档在原始图片中的位置信息校正文档的拍摄角度,自动将拍摄视角调整到正对文档的角度上。

二、运作机制

① 文档检测
  • 调用文档检测接口,识别图片中的文档,返回文档在原图中的位置信息;
  • 如下图中的红点所示,文档检测接口返回了图中相片文档四个顶点相对图像左上角的坐标信息:

  • 文档检测结果如下,该 JSON 保存了原图中相片文档四个角相对原图左上顶点的坐标信息(单位:像素),其中 resultCode 为返回码:
 {"resultCode":0,"doc":"{\"bottom_left\":{\"x\":17,\"y\":440},\"bottom_right\":{\"x\":589,\"y\":760},\"top_left\":{\"x\":256,\"y\":13},\"top_right\":{\"x\":829,\"y\":332}}"}
② 文档校正
  • 根据文档在原始图片中的位置信息校正文档的拍摄角度(可自定义校正的区域)。
  • 图片中的校正区域:

  • 校正上图中深蓝色矩形(文档检测接口返回的文档区域)区域,校正后的效果如下图:

③ 使用限制
  • 支持处理的图片格式包括 JPEG、JPG、PNG,最终输出的图片仅支持 JPEG 格式。
  • 拍摄时尽量将文档放置在与文档背景色有一定色差的平面上,并尽量让文档充满画面,保持文档边界入镜,以获得最佳效果。
  • 输入图片高和宽最小为 100 像素,最大为 10000 像素。

三、应用场景

  • 将纸质信件等旧文档翻拍成电子版,帮助改善旧文档的翻拍效果。
  • 记录书画展览中的精彩作品,帮助将作品拍摄得更加端正。

四、API 说明

  • 文档校正提供了 setVisionConfiguration()、docDetect() 和 docRefine() 三个函数接口。
  • setVisionConfiguration 是 IDocRefine 接口的成员,通过传入的 DocRefineConfiguration,选择需要调用的文档校正类型:
 void setVisionConfiguration(DocRefineConfiguration docRefineConfiguration);
  • DocRefineConfiguration 的常用设置:
接口 参数名 类型 参数说明
setProcessMode() mode int 进程模式定义:
VisionConfiguration.MODE_IN(同进程调用)
VisionConfiguration.MODE_OUT(跨进程调用)
默认值为VisionConfiguration.MODE_OUT
  • 调用 IDocRefine的docDetect() 方法,获取检测结果:
 int docDetect(VisionImage image, DocCoordinates result, VisionCallback<DocCoordinates> visionCallBack);
  • 说明:
    • image 为待文档检测的输入图片。
    • 如果 visionCallback 为 null,执行同步调用,结果码由方法返回,检测结果由 result 中返回。
    • 如果 visionCallback 为有效的回调函数,则该函数为异步调用,函数返回时 result 中的值无效,实际识别结果由回调函数返回。
    • 同步模式调用成功时,该函数返回结果码 0。异步模式调用请求发送成功时,该函数返回结果码 700。
  • 调用 IDocRefine 的 docRefine() 方法,获取校正结果:
 int docRefine(VisionImage image, DocCoordinates coordinates, ImageResult result,VisionCallback<ImageResult> visionCallBack);
  • 说明:
    • image 为待文档校正的输入图片。
    • 如果 visionCallback 为 null,执行同步调用,结果码由方法返回,校正结果由 result 中返回。
    • 如果 visionCallback 为有效的回调函数,则该函数为异步调用,函数返回时 result 中的值无效,实际识别结果由回调函数返回。
    • 同步模式调用成功时,该函数返回结果码 0。异步模式调用请求发送成功时,该函数返回结果码 700。

五、开发流程

  • 在使用文档校正时,先将相关的类添加至工程:
 import ohos.ai.cv.common.ConnectionCallback;import ohos.ai.cv.common.VisionCallback;import ohos.ai.cv.common.VisionImage;import ohos.ai.cv.common.VisionManager;import ohos.ai.cv.common.ImageResult;import ohos.ai.cv.docrefine.DocCoordinates;import ohos.ai.cv.docrefine.DocRefineConfiguration;import ohos.ai.cv.docrefine.IDocRefine;import ohos.app.Context;import ohos.media.image.PixelMap;
  • 定义 ConnectionCallback 回调,实现连接能力引擎成功与否后的操作:
 ConnectionCallback connectionCallback = new ConnectionCallback() {@Overridepublic void onServiceConnect() {// 定义连接能力引擎成功后的操作。}@Overridepublic void onServiceDisconnect() {// 定义连接能力引擎失败后的操作。}};
  • 调用 VisionManager.init() 方法,将此工程的 context 和已经定义的 connectionCallback 作为入参,建立与能力引擎的连接,context 应为 ohos.aafwk.ability.Ability 或 ohos.aafwk.ability.AbilitySlice 的实例或子类实例:
 int result = VisionManager.init(context, connectionCallback);
  • 实例化 IDocRefine 接口,将此工程的 context 作为入参,context 应为 ohos.aafwk.ability.Ability 或 ohos.aafwk.ability.AbilitySlice 的实例或子类实例:
 IDocRefine docRefine = VisionManager.getDocRefine(context);
  • 实例化 VisionImage 对象 image,并传入待校正图片 pixelMap:
 VisionImage image = VisionImage.fromPixelMap(pixelMap);
  • 实例化 DocCoordinates 对象 docCoordinates:
 DocCoordinates docCoordinates = new DocCoordinates();
  • (可选)定义 VisionCallback 回调:
    • 在异步模式下,该类的 onResult() 方法用于获得检测的结果 docCoordinates(内含检测到的文档坐标);onError() 方法用于处理错误返回码;onProcessing() 方法用于返回处理进度,目前没有实现此接口的功能。
    • 同步与异步模式区别在于 docDetect() 的最后一个参数 visionCallback 是否为空。若非空则为异步模式,此时会忽略自定义的 DocCoordinates 输入 docCoordinates,接口调用结果一律从回调函数visionCallback 获得。
 VisionCallback<DocCoordinates> callback= new VisionCallback<DocCoordinates>() {@Overridepublic void onResult(DocCoordinates docCoordinates) {// 对正确获得的结果进行处理}@Overridepublic void onError(int i) {// 处理错误返回码}@Overridepublic void onProcessing(float v) {// 返回处理进度}};
  • 实例化 ImageResult 对象 imageResult:
 ImageResult imageResult = new ImageResult();
  • (可选)定义 VisionCallback 回调:
    • 在异步模式下,该类的 onResult() 方法用于获得校正的结果 imageResult(内含校正后的图片);onError() 方法用于处理错误返回码;onProcessing() 方法用于返回处理进度,目前没有实现此接口的功能。
    • 同步与异步模式区别在于 docRefine() 的最后一个参数 visionCallback 是否为空。若非空则为异步模式。此时会忽略自定义的 ImageResult 输入 imageResult,接口调用结果一律从回调类 visionCallback 获得。
 VisionCallback<ImageResult> callback = new VisionCallback<ImageResult>() {@Overridepublic void onResult(ImageResult imageResult) {// 对正确获得的结果进行处理}@Overridepublic void onError(int i) {// 处理错误返回码}@Overridepublic void onProcessing(float v) {// 返回处理进度}};
  • 通过 DocRefineConfiguration 配置校正参数,可选择进程调用模式等(推荐使用MODE_IN同进程模式),跨进程模式(MODE_OUT)下调用方与能力引擎处于不同进程;同进程模式(MODE_IN)下,能力引擎在调用方进程中实例化,调用方通过反射的方式调用引擎里的文档校正能力。以同进程调用为例:
 DocRefineConfiguration.Builder builder = new DocRefineConfiguration.Builder();builder.setProcessMode(VisionConfiguration.MODE_IN);DocRefineConfiguration configuration = builder.build();docRefine.setVisionConfiguration(configuration);
  • (可选)调用 IDocRefine的prepare() 方法:
 result = docRefine.prepare();
  • 调用 IDocRefine 的 docDetect() 方法:
    • 同步模式调用完成时,该函数立即返回结果码。
    • 异步模式调用请求发送成功时,该函数返回结果码700。如果返回其他的值,说明异步调用请求不成功,需要先处理错误,回调函数不会被调用。
    • 如果异步模式调用请求发送成功,则检测完成后,相应的回调函数会被自动调用。
    • 如果 onResult() 回调被调用,说明检测成功,相当于同步模式结果码为0的情况。
    • 如果 onError() 方法被调用,说明检测发生了错误,具体的调用结果码将由 onError() 的参数接收。
 result = docRefine.docDetect(image, docCoordinates, null); // 同步// 或者result = docRefine.docDetect(image, null, callback); // 异步
  • 调用 IDocRefine的docRefine() 方法:
    • 同步模式调用完成时,该函数立即返回结果码。
    • 异步模式调用请求发送成功时,该函数返回结果码700。如果返回其他的值,说明异步调用请求不成功,需要先处理错误,回调函数不会被调用。
    • 如果异步模式调用请求发送成功,则校正完成后,相应的回调函数会被自动调用。
    • 如果 onResult() 回调被调用,说明校正成功,相当于同步模式结果码为0的情况。
    • 如果 onError() 方法被调用,说明校正发生了错误,具体的调用结果码将由 onError() 的参数接收。
 result = docRefine.docRefine(image, docCoordinates, imageResult, null); // 同步// 或者result = docRefine.docRefine(image, docCoordinates, null, callback); // 异步
  • 调用 IDocRefine的release() 方法,释放资源,调用 pixelMap 的 release() 方法,释放图片内存:
 result = docRefine.release();if (pixelMap != null) {pixelMap.release();pixelMap = null;}
  • 调用 VisionManager.destroy() 方法,断开与能力引擎的连接:
 VisionManager.destroy();
  • 结果码定义如下表:
结果码 说明
0 成功
-1 未知错误
-2 不支持的功能或接口
-3 内存分配失败或创建对象失败
-4 所需库加载失败
-10 引擎开关已经关闭
101 失败
102 超时
200 输入参数不合法(图片尺寸错误)
201 输入参数不合法(为空)
210 输入参数合法
500 服务绑定异常
521 服务绑定异常断开
522 服务已连接
600 模型文件异常
601 模型文件不存在
602 模型加载失败
700 异步调用请求发送成功
1001 神经网络处理单元错误

HarmonyOS之AI能力·文档检测校正相关推荐

  1. 百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 Baseline

    转自AI Studio,原文链接:百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 Baseline - 飞桨AI Studio 百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 使用Resnet15 ...

  2. 基于边缘检测和透视变换的文档图像校正

    实验任务与要求: 对发生透视变换的文档图像进行几何校正处理,得到规范的文档图像. 几何校正的目的是把发生了透视变换的目标变换为具有真实比例和角度的目标,如下图所示:左图中的地板砖经过透视变换之后,不再 ...

  3. 基于 TensorFlow 在手机端实现文档检测

    手机端运行卷积神经网络的一次实践 - 基于 TensorFlow 和 OpenCV 实现文档检测功能 1. 前言 本文不是神经网络或机器学习的入门教学,而是通过一个真实的产品案例,展示了在手机客户端上 ...

  4. 智能图像处理:基于边缘去除和迭代式内容矫正的复杂文档图像校正

    本文简要介绍ACM MM 2022录用论文"Marior: Margin Removal and Iterative Content Rectification for Document D ...

  5. HarmonyOS之AI能力·通用文字识别技术

    一.通用文字识别技术 通用文字识别的核心技术是 OCR(Optical Character Recognition,光学字符识别). OCR 是一种通过拍照.扫描等光学输入方式,把各种票据.卡证.表格 ...

  6. HarmonyOS之AI能力·语音识别技术

    一.基本概念 语音识别功能提供面向移动终端的语音识别能力.它基于华为智慧引擎(HUAWEI HiAI Engine)中的语音识别引擎,向开发者提供人工智能应用层 API.该技术可以将语音文件.实时语音 ...

  7. HarmonyOS之AI能力·实体识别

    一.简介 实体识别能够从自然语言中提取出具有特定意义的实体,并在此基础上完成搜索等一系列相关操作及功能. 实体识别覆盖范围大,能够满足日常开发中对实体识别的需求,让应用体验更好.识别准确率高,能够准确 ...

  8. HarmonyOS之AI能力·关键字提取

    一.概念 在日常生活中充满了各种各样的信息,这些信息千变万化.文本语言作为信息传递的一种载体,同样面临有用信息和无用信息糅杂在一起的问题.关键字提取帮助用户在众多文本信息中快速提取出关键信息和核心内容 ...

  9. 文档图片校正 计算机软件,一种复杂版面扭曲文档图像快速校正方法.PDF

    第33卷第6期 计算机应用与软件 Vol33No.6 2016年6月 ComputerApplicationsandSoftware Jun.2016 一种复杂版面扭曲文档图像快速校正方法 曾凡锋 ...

最新文章

  1. C++对象模型详解(上)
  2. CoreLink CCI-550的概念介绍
  3. dbcp_c3p0连接mysql8.0.13
  4. linux使用ping命令ping本机,Linux下使用ping命令判断网络的好坏
  5. 【leetcode】41. First Missing Positive
  6. 星战7将映 追忆那些年存储你身边大数据
  7. Bootstrap页面布局17 - BS选项卡
  8. 使用主成分分析进行人脸识别
  9. 项目启动报错ignoring option MaxPermSize=256M;support was removed in 8.0
  10. Bushound数据分析及使用指南
  11. mac 建 android 签名,mac android app 签名工具
  12. 区块链打击食品欺诈:以挪威三文鱼为例
  13. win10 小娜搜索失灵
  14. 1419:SPFA(II)
  15. 1449异常 mysql_mysql异常-UncategorizedSQLException 1449
  16. Linux 工具 | 第1篇:高级流控-TC+HTB+IFB+内核模块
  17. 浏览器指纹:原来我们一直被互联网巨头监视,隐私在网上裸奔、无处可藏
  18. launch计算机上哪个初中,这位妈妈10年夏校经验告诉你:小学初中高中都该如何选择夏校?...
  19. 基于visual c++之windows核心编程代码分析(24)IO控制、内核通信
  20. 银行本、异地,本、跨行存取款手续费大全

热门文章

  1. Linux CENTOS6.5 图形命令互转
  2. 评《认知红利》 谢春霖著
  3. jQuery筛选器常用总结
  4. 虚幻4 ue4 学习笔记pwan篇 1.4 pawn结合UPawnMovementComponent类 移动组件实现 移动球体添加物理碰撞...
  5. 光盘显示容量但读不出文件_软网推荐:文件夹容量属性增强显示
  6. python产品缺陷_基于python从redmine-api中获取项目缺陷数据(1)
  7. ant design vue table 高度自适应_2年Vue项目实战经验汇总!
  8. Java黑皮书课后题第5章:*5.47(商业:检测ISBN-13)ISBN-13是标识书籍的新标准。它使用13位数字d1d2d3~d12d13,d13是校验和。如果校验和为10,则替换为0。求所有数字
  9. 【数据结构】—顺序表的插入、删除、查找操作
  10. JAVA之获取JavaSwing单选框JRadioButton选中的值(内容)