java图片识别(文字、字母、数字)

tess4j 实现

一、依赖文件

       
            net.sourceforge.tess4j
            tess4j
            4.1.1
        

二、所需语言库,下载chi_sim、eng、num语言库,然后在项目目录下新建tessdata文件夹,将语言库放入该文件夹中

下载:tess4源码包

tessdata下默认为英语库,中文库下载地址:中文包下载地址

其他库的下载地址:其他语言包下载地址
 

java图片识别(文字、字母、数字)_第1张图片

三、代码部分

ITesseract instance = new Tesseract();
        //如果未将tessdata放在根目录下需要指定绝对路径
        //instance.setDatapath("the absolute path of tessdata");
        
        //如果需要识别英文之外的语种,需要指定识别语种,并且需要将对应的语言包放进项目中
//        instance.setLanguage("chi_sim");
		instance.setDatapath("tessdata");
		instance.setLanguage("chi_sim");//chi_sim代表中文库
        
        // 指定识别图片
        File imgDir = new File("E:\\tesseract-ocr-setup-3.02.02\\Tesseract-OCR\\4.png");
        long startTime = System.currentTimeMillis();
        String ocrResult = instance.doOCR(imgDir);
        
        // 输出识别结果
        System.out.println("OCR Result: \n" + ocrResult + "\n 耗时:" + (System.currentTimeMillis() - startTime) + "ms");

运行发现虽然可以,但结果还是不太理想;再来看看百度的图像识别吧!

百度AI图像识别,这里是驾照接口

一、接口地址:百度AI驾照图像识别

二、百度云需要的key

这里解释一下,百度云需要app_key 和 secret_key 两种key来生成access_token权限码之后,才可以用access_token权限码来调用接口的,所以:这里用代码生成如下;

三、代码

生成access_token部分:

package com.test.util;


import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

/**
 * 获取token类
 */
public class AuthService {

	public static void main(String[] args) {
		getAuth();
	}
	
    /**
     * 获取权限token
     * @return 返回示例:
     * {
     * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
     * "expires_in": 2592000
     * }
     */
    public static String getAuth() {
        // 官网获取的 API Key 更新为你注册的
        String clientId = "LXrztEOzQxfef66DLIDQYpIG";
        // 官网获取的 Secret Key 更新为你注册的
        String clientSecret = "gbDodnochc8jYjlAHADDgyyas9mrlmkF";
        return getAuth(clientId, clientSecret);
    }

    /**
     * 获取API访问token
     * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
     * @param ak - 百度云官网获取的 API Key
     * @param sk - 百度云官网获取的 Securet Key
     * @return assess_token 示例:
     * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
     */
    public static String getAuth(String ak, String sk) {
        // 获取token地址
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + ak
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + sk;
        try {
            URL realUrl = new URL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 获取所有响应头字段
            Map> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.err.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
            /**
             * 返回结果示例
             */
            System.err.println("result:" + result);
            JSONObject jsonObject = new JSONObject(result);
            String access_token = jsonObject.getString("access_token");
            return access_token;
        } catch (Exception e) {
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        }
        return null;
    }

}

运行上面代码之后会如下结果:

result:{"refresh_token":"25.2784108987f5e58b2a325dc26281cbe8.315360000.1873420544.282335-15742445","expires_in":2592000,"session_key":"9mzdWEMXafJyxlmw5TbtYHTPuJZ0fSTFCUUdxlVVIBA8qGx4TT0EMmWOyRI\/eDIE0xCc5XmzU+TeKmVKyU4wN\/G1DT64cg==","access_token":"24.c39f93139e47c06bc1a41077f6e5cd25.2592000.1560652544.282335-15742445","scope":"vis-ocr_\u5b9a\u989d\u53d1\u7968\u8bc6\u522b brain_ocr_quota_invoice public vis-ocr_ocr brain_ocr_scope brain_ocr_general brain_ocr_general_basic brain_ocr_general_enhanced vis-ocr_business_license brain_ocr_webimage brain_all_scope brain_ocr_idcard brain_ocr_driving_license brain_ocr_vehicle_license vis-ocr_plate_number brain_solution brain_ocr_plate_number brain_ocr_accurate brain_ocr_accurate_basic brain_ocr_receipt brain_ocr_business_license brain_solution_iocr brain_ocr_handwriting brain_ocr_passport brain_ocr_vat_invoice brain_numbers brain_ocr_train_ticket brain_ocr_taxi_receipt vis-ocr_\u8f66\u8f86vin\u7801\u8bc6\u522b brain_ocr_vin wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi","session_secret":"4a8251417c5efb628e32292c6eb70679"}
直接取红色标记部分;

调用接口代码:

package com.test.control;

import java.net.URLEncoder;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hhzx.fw.util.Base64Util;
import com.hhzx.fw.util.FileUtil;
import com.hhzx.fw.util.HttpUtil;

@Controller
public class ImgController {

	@ResponseBody
	@RequestMapping(value="ocr",method=RequestMethod.POST)
	public JSONObject test(@RequestPart(name = "file",required = false)MultipartFile  file) {
		// 请求url
        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license";//https://aip.baidubce.com/rest/2.0/ocr/v1/idcard,https://aip.baidubce.com/rest/2.0/ocr/v1/driving_license
        String result = "";
        JSONObject parseObject = null;
        try {
            // 本地文件路径
            String filePath = "E:\\tesseract-ocr-setup-3.02.02\\Tesseract-OCR\\mg.jpg";
        	byte[] imgData = file.getBytes();
//            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "image=" + imgParam;
//            String param = "image=" + imgParam+"&id_card_side=front";

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = "24.c1f518235a1ae659aec477e7cf0aa00f.2592000.1560479812.282335-15742445";
            result = HttpUtil.post(url, accessToken, param);
            parseObject = JSONArray.parseObject(result);
            
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
		
		return parseObject;
	}
}

pom添加依赖:
       

         
            com.baidu.aip
            java-sdk
            4.4.1
        
        
            com.alibaba
            fastjson
            1.2.4
        

ok,按照正常程序走的话就可以看到结果了,注意,这里调用的是驾驶证接口地址,所以照片必须为驾驶证件照,功能强大,横竖拍照都可以完美解析识别,百度AI图像识别,必须赞。。。

好了,有疑问或更好意见请留言。

 

 

 

你可能感兴趣的:(java,后台理论,java图片识别(文字,字母,数字))