本示例介绍如何使用Alibaba Cloud SDK for Java使用异步方式检测图片OCR。
前提条件
在使用本教程之前,请确保已完成以下操作:
- 使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。 请在阿里云控制台中的AccessKey管理页面上创建和查看您的AccessKey。
- 确保您已经安装了Alibaba Cloud SDK for Java,准确的SDK版本号,请参见 阿里云开发工具包(SDK)。
<dependencies> <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.4.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-green --> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-green</artifactId> <version>3.5.1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-oss --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.61</version> </dependency> </dependencies>
- 如果使用本地文件或者二进制文件检测,请下载并在项目工程中引入Extension.Uploader工具类。
代码示例
- 传图片二进制内容进行异步检测:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonResponse; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.green.extension.uploader.ClientUploader; import com.aliyuncs.http.FormatType; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import org.apache.commons.io.FileUtils; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class ImageOCR { public static void main(String[] args) throws Exception { DefaultProfile profile = DefaultProfile.getProfile( "<your-region-id>", // 您的可用区ID "<your-access-key-id>", // 您的AccessKey ID "<your-access-key-secret>"); // 您的AccessKey Secret IAcsClient client = new DefaultAcsClient(profile); CommonRequest request = new CommonRequest(); request.setSysMethod(MethodType.POST); request.setSysDomain("green.cn-hangzhou.aliyuncs.com"); request.setSysVersion("2018-05-09"); request.setSysUriPattern("/green/image/asyncscan"); /** * 如果您要检测的文件存于本地服务器上,可以通过下述代码片生成url * 再将返回的url作为图片地址传递到服务端进行检测 */ ClientUploader clientUploader = ClientUploader.getImageClientUploader(profile, false); byte[] imageBytes = null; String url = null; try{ //这里读取本地文件作为二进制数据,当做输入做为示例, 实际使用中请直接替换成您的图片二进制数据 imageBytes = FileUtils.readFileToByteArray(new File("二进制图片数据")); //上传到服务端 url = clientUploader.uploadBytes(imageBytes); }catch (Exception e){ e.printStackTrace(); } // 构建请求参数 // 参数示例: // { // "scenes": ["ocr"], // "extras": {"card":"bank-card"} // "tasks": [ // { // "dataId": "test2abcdmO$tAON6qYUrtCRgLo-1234di", // "url": "https://img.alicdn.com/tfs/TB1urBOQFXXXXbMXFXXXXXXXXXX-1442-257.png" // } // ] // } Map<String,Object> body = new HashMap<String,Object>(); // 组装tasks参数 ArrayList<Map<String,String>> tasks = new ArrayList<Map<String,String>>(); // 设置待检测图片, 一张图片一个task,最多支持100张图片同时检测,即需要构建100个task // 多张图片同时检测时,处理的时间由最后一个处理完的图片决定。因此通常情况下批量检测的平均rt比单张检测的要长, 一次批量提交的图片数越多,rt被拉长的概率越高 // 这里以单张图片检测作为示例, 如果是批量图片检测,请自行构建多个task // 本地图片相对于互联网图片链接来说,多了一个上传步骤,上传后取返回的链接进行检测 Map<String,String> task = new HashMap<String,String>(); // 数据Id。需要保证在一次请求中所有的Id不重复。 task.put("dataId", UUID.randomUUID().toString()); // 待检测图像的URL。 // 本示例在此处使用了本地图片,如果您使用的是公网可以访问的图片,那么此处直接放图片链接即可 task.put("url",url); tasks.add(task); // 指定检测场景,取值:ocr。 body.put("scenes","ocr"); // 指定检测对象,JSON数组中的每个元素是一个OCR图文检测任务结构体(image表)。最多支持10个元素,即对10张图片进行识别。 body.put("tasks",task); // 若使用卡证信息识别服务,需要指定传入的卡证照片类型 //ocr卡证识别,设置识别卡证类型 Map<String,String> cardExtras = new HashMap<String,String>(); //银行卡识别 cardExtras.put("card", "bank-card"); body.put("extras", cardExtras); // System.out.println(JSON.toJSONString(body,true)); // System.out.println("-----------------------------------------------------"); request.setHttpContent(JSON.toJSONString(body).getBytes("UTF-8"), "UTF-8", FormatType.JSON); // 请务必设置超时时间 request.setSysConnectTimeout(3000); request.setSysReadTimeout(6000); try { CommonResponse response = client.getCommonResponse(request); JSONObject dataJson = JSON.parseObject(response.getData()); System.out.println(JSON.toJSONString(dataJson, true)); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); } } }
- 查询图片异步检测结果:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonResponse; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.http.FormatType; import com.aliyuncs.http.MethodType; import com.aliyuncs.http.ProtocolType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import java.util.ArrayList; public class Test { public static void main(String[] args) throws Exception { IClientProfile profile = DefaultProfile.getProfile( "<your-region-id>", // 您的可用区ID "<your-access-key-id>", // 您的AccessKey ID "<your-access-key-secret>"); // 您的AccessKey Secret IAcsClient client = new DefaultAcsClient(profile); CommonRequest request = new CommonRequest(); // 指定请求方式 request.setSysMethod(MethodType.POST); // 指定请求地址 request.setSysDomain("green.cn-hangzhou.aliyuncs.com"); // 指定请求方法 request.setSysUriPattern("/green/image/results"); // 指定请求版本 request.setSysVersion("2018-05-09"); // 支持HTTP和HTTPS request.setSysProtocol(ProtocolType.HTTPS); ArrayList<String> taskIds = new ArrayList<String>(); // 云盾内容安全服务器返回的,唯一标识该检测任务的ID。 taskIds.add("img35x****Hd-1rGKzS"); request.setHttpContent(JSON.toJSONString(taskIds).getBytes("UTF-8"), "UTF-8", FormatType.JSON); // 请务必设置超时时间 request.setSysConnectTimeout(3000); request.setSysReadTimeout(10000); try { CommonResponse response = client.getCommonResponse(request); JSONObject dataJson = JSON.parseObject(response.getData()); System.out.println(JSON.toJSONString(dataJson, true)); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); } } }
执行结果
- 提交OCR异步识别任务正确的返回结果类似如下:
{ "msg":"OK", "code":200, "data":[ { "msg":"OK", "code":200, "dataId":"3cc3dd4d-61d8-4b22-b85b-319bee09ec40", "taskId":"img35x****Hd-1rGKzS", "url":"http://********pY%3D" } ], "requestId":"23038FAA-B67C-44F8-907A-3B27B9471CA1" }
- 查询异步识别结果正确的返回类似如下:
{ "msg":"OK", "code":200, "data":[ { "msg":"OK", "code":200, "dataId":"9f8d1bde-6517-4e53-babc-903c64cfb899", "extras":{}, "results":[ { "bankCardInfo":{ "bankCardNum":"6221****1074" }, "rate":99.91, "suggestion":"review", "label":"ocr", "scene":"ocr" } ], "taskId":"img2WDF4lI0AqH4Qpsqu$hXwt-1rGJZR", "url":"http://********mI%3D" } ], "requestId":"1FFFD04C-F1BB-4DEB-B9CA-FD061B4DBB43" }
在文档使用中是否遇到以下问题
更多建议
匿名提交