
文档校正提供了文档翻拍过程的辅助增强功能,包含两个子功能:

如上图中的红点所示,文档检测接口返回了图中相片文档四个顶点相对图像左上角的坐标信息。文档检测结果如下:
{
  "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}
    }"
}
校正上图中深蓝色矩形(文档检测接口返回的文档区域)区域,校正后的效果如下图:
图3 校正完成的文档图片

文档校正提供了setVisionConfiguration()、docDetect()和docRefine()三个函数接口。
void setVisionConfiguration(DocRefineConfiguration docRefineConfiguration);int docDetect(VisionImage image, DocCoordinates result, VisionCallback<DocCoordinates> visionCallBack);其中:
image为待文档检测的输入图片。
如果visionCallback为null,执行同步调用,结果码由方法返回,检测结果由result返回。
如果visionCallback为有效的回调函数,则该函数为异步调用,函数返回时result中的值无效,实际识别结果由回调函数返回。
同步模式调用成功时,该函数返回结果码0。异步模式调用请求发送成功时,该函数返回结果码700。
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() {
    @Override
    public void onServiceConnect() {
        // 定义连接能力引擎成功后的操作。
    }
    @Override
    public void onServiceDisconnect() {
        // 定义连接能力引擎失败后的操作。
    }
};调用VisionManager.init()方法,将此工程的context和已经定义的connectionCallback 作为入参,建立与能力引擎的连接,context应为ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的实例或子类实例。
int result = VisionManager.init(context, connectionCallback);在收到onServiceConnect回调连接服务成功后,实例化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();说明 该类在同步模式下用于存放检测接口docDetect()传出的文档位置结果。
(可选)定义VisionCallback<DocCoordinates>回调。
VisionCallback<DocCoordinates> callback= new VisionCallback<DocCoordinates>() {
    @Override
    public void onResult(DocCoordinates docCoordinates) {
        // 对正确获得的结果进行处理。
    }
    @Override
    public void onError(int i) {
        // 处理错误返回码。
    }
    @Override
    public void onProcessing(float v) {
        // 返回处理进度。
    }
};说明 在异步模式下,该类的onResult()方法用于获得检测的结果docCoordinates(内含检测到的文档坐标);onError()方法用于处理错误返回码;onProcessing()方法用于返回处理进度,目前没有实现此接口的功能。 同步与异步模式区别在于docDetect()的最后一个参数visionCallback是否为空。若非空则为异步模式,此时会忽略自定义的DocCoordinates输入docCoordinates,接口调用结果一律从回调函数visionCallback获得。
实例化ImageResult对象imageResult。
ImageResult imageResult = new ImageResult();说明 该类在同步模式下用于存放校正docRefine()方法传出的图片结果。
(可选)定义VisionCallback<ImageResult>回调。
VisionCallback<ImageResult> callback = new VisionCallback<ImageResult>() {
    @Override
    public void onResult(ImageResult imageResult) {
        // 对正确获得的结果进行处理。
    }
    @Override
    public void onError(int i) {
        // 处理错误返回码。
    }
    @Override
    public 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();说明
如果返回的result不为0,说明当前文档校正能力准备失败,需要处理错误,不再执行以后的动作。在docDetect()和docRefine()方法中会首先调用prepare()启动引擎,如果引擎已经启动则不会再次启动。调用IDocRefine的docDetect()方法:
result = docRefine.docDetect(image, docCoordinates, null); // 同步或者
result = docRefine.docDetect(image, null, callback); // 异步说明
结果码定义如下表:
| 结果码 | 说明 | 
|---|---|
| 0 | 成功 | 
| -1 | 未知错误 | 
| -2 | 不支持的功能或接口 | 
| -3 | 内存分配失败或创建对象失败 | 
| -4 | 所需库加载失败 | 
| -10 | 引擎开关已经关闭 | 
| 101 | 失败 | 
| 102 | 超时 | 
| 200 | 输入参数不合法(图片尺寸错误) | 
| 201 | 输入参数不合法(为空) | 
| 210 | 输入参数合法 | 
| 500 | 服务绑定异常 | 
| 521 | 服务绑定异常断开 | 
| 522 | 服务已连接 | 
| 600 | 模型文件异常 | 
| 601 | 模型文件不存在 | 
| 602 | 模型加载失败 | 
| 700 | 异步调用请求发送成功 | 
| 1001 | 神经网络处理单元错误 | 
调用IDocRefine的docRefine()方法:
result = docRefine.docRefine(image, docCoordinates, imageResult, null); // 同步或者
result = docRefine.docRefine(image, docCoordinates, null, callback); // 异步说明
结果码定义如下表:
| 结果码 | 说明 | 
|---|---|
| 0 | 成功 | 
| -1 | 未知错误 | 
| -2 | 不支持的功能或接口 | 
| -3 | 内存分配失败或创建对象失败 | 
| -4 | 所需库加载失败 | 
| -10 | 引擎开关已经关闭 | 
| 101 | 失败 | 
| 102 | 超时 | 
| 200 | 输入参数不合法(图片尺寸错误) | 
| 201 | 输入参数不合法(为空) | 
| 210 | 输入参数合法 | 
| 500 | 服务绑定异常 | 
| 521 | 服务绑定异常断开 | 
| 522 | 服务已连接 | 
| 600 | 模型文件异常 | 
| 601 | 模型文件不存在 | 
| 602 | 模型加载失败 | 
| 700 | 异步调用请求发送成功 | 
| 1001 | 神经网络处理单元错误 | 
调用IDocRefine的release()方法,释放资源。调用pixelMap的release()方法,释放图片内存。
result = docRefine.release();
if (pixelMap != null) {
    pixelMap.release();
    pixelMap = null;
}说明 不再使用文档校正能力时,调用release()方法释放资源。
调用VisionManager.destroy()方法,断开与能力引擎的连接。
VisionManager.destroy();