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

tess4j 实现

一、依赖文件

       <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>4.1.1</version>
        </dependency>

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

下载:tess4源码包

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

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

三、代码部分

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<String, List<String>> 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添加依赖:
       

         <dependency>
            <groupId>com.baidu.aip</groupId>
            <artifactId>java-sdk</artifactId>
            <version>4.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.4</version>
        </dependency>

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

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

 

 

 

Java,UUID(Universally Unique Identifier,通用唯一识别码)通常是用32个十六进制数字表示的,格式为8-4-4-4-12的形式,共36个字符,包括4个短横线。如果你需要生成19位数字的ID,而不包含英文字母,那么你不能直接使用UUID的标准格式,因为UUID本身就是基于十六进制的,必然会包含字母。 但是,你可以对UUID进行处理,将其转换成纯数字形式。比如,你可以将UUID字母转换为相应的数字表示(A-F对应10-15),或者使用UUID数字部分,忽略字母部分。不过,需要注意的是,这样处理后得到的数字可能不再是全球唯一的。 如果你只是想要一个尽量唯一的19位数字ID,你可以使用Java的`Random`类来生成一个随机数字,然后格式化为19位数字。这里是一个简单的示例代码: ```java import java.math.BigInteger; import java.util.Random; public class UniqueIdGenerator { public static String generateNumericId(int length) { Random random = new Random(); // 生成一个随机数,并转化为字符串 BigInteger bigInteger = new BigInteger(130, random); // 将随机数转换为19位的字符串,不足的前面补零 String randomId = bigInteger.toString(10); return String.format("%019d", Long.parseLong(randomId)); } public static void main(String[] args) { // 生成一个19位的数字ID String id = generateNumericId(19); System.out.println("Generated ID: " + id); } } ``` 上面的代码将生成一个随机的数字ID,并保证长度为19位,不足部分前面补零。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焱墩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值