本示例介绍如何使用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 java.util.*;
    
    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/scan");
    
            // 设置待检测图片, 一张图片一个task,最多支持100张图片同时检测,即需要构建100个task
            // 多张图片同时检测时,处理的时间由最后一个处理完的图片决定。因此通常情况下批量检测的平均rt比单张检测的要长, 一次批量提交的图片数越多,rt被拉长的概率越高
            // 这里以单张图片检测作为示例, 如果是批量图片检测,请自行构建多个task
            // 本地图片相对于互联网图片链接来说,多了一个上传步骤,上传后取返回的链接进行检测
            ClientUploader clientUploader = ClientUploader.getImageClientUploader(profile, false);
            String url = null;
            try{
                url = clientUploader.uploadFile("C:/Users/card.png");
            }catch (Exception e){
                System.out.println("upload file to server fail.");
            }
    
            // 构建请求参数
            // 参数示例:
            // {
            //   "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参数
            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());
            }
        }
    }
  • 上传图片url进行检测:
    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.profile.DefaultProfile;
    import java.util.*;
    
    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/scan");
    
            // 构建请求参数
            // 参数示例:
            // {
            //   "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","https://img.alicdn.com/tfs/TB1urBOQFXXXXbMXFXXXXXXXXXX-1442-257.png");
            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.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.*;
    
    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/scan");
    
            /**
             * 如果您要检测的文件存于本地服务器上,可以通过下述代码片生成url
             * 再将返回的url作为图片地址传递到服务端进行检测
             */
            ClientUploader clientUploader = ClientUploader.getImageClientUploader(profile, false);
            byte[] imageBytes = null;
            String url = null;
            try{
                //这里读取本地文件作为二进制数据,当做输入做为示例, 实际使用中请直接替换成您的图片二进制数据
                imageBytes = FileUtils.readFileToByteArray(new File("/Users/01fb4ab6420b5f34623e13b82b51ef87.jpg"));
                //上传到服务端
                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());
            }
        }
    }
    					

执行结果

以上代码示例正确的返回结果类似如下:
{
    "msg":"OK",
    "code":200,
    "data":[
        {
            "msg":"OK",
            "code":200,
            "dataId":"e4b5fb87-29f3-4459-a027-fb70f6014ca4",
            "extras":{},
            "results":[
                {
                    "bankCardInfo":{
                        "bankCardNum":"6221****1074"
                    },
                    "rate":99.91,
                    "suggestion":"review",
                    "label":"ocr",
                    "scene":"ocr"
                }
            ],
            "taskId":"imgsBbhSQIQFo4CinBIYHITe-1rGJBs",
            "url":"http://***********"
        }
    ],
    "requestId":"BAEC900B-8599-4A71-B7D2-6B5C08B7350C"
}