SpringBoot實現(xiàn)圖片識別文字的四種方式小結(jié)
SpringBoot 整合 Tess4J 實現(xiàn)
Tesseract是一個開源的光學(xué)字符識別(OCR)引擎,它可以將圖像中的文字轉(zhuǎn)換為計算機(jī)可讀的文本。支持多種語言和書面語言,并且可以在命令行中執(zhí)行。它是一個流行的開源OCR工具,可以在許多不同的操作系統(tǒng)上運行。
Tess4J是一個基于Tesseract OCR引擎的Java接口,可以用來識別圖像中的文本,說白了,就是封裝了它的API,讓Java可以直接調(diào)用。
1、引入tess4j依賴
<!-- tess4j --> <dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>4.5.4</version> </dependency>
2、yml配置
把訓(xùn)練數(shù)據(jù)的目錄路徑配置在yml里,后續(xù)可以擴(kuò)展到配置中心。
server: port: 8888 # 訓(xùn)練數(shù)據(jù)文件夾的路徑 tess4j: datapath: E:/gitee/OCR/tess4j_data
Tesseract OCR庫通過訓(xùn)練數(shù)據(jù)來學(xué)習(xí)不同語言和字體的特征,以便更好地識別圖片中的文字。
在安裝Tesseract OCR庫時,通常會生成一個包含多個子文件夾的訓(xùn)練數(shù)據(jù)文件夾,其中每個子文件夾都包含了特定語言或字體的訓(xùn)練數(shù)據(jù)。
比如我這里是下載后放到了D盤的tessdata目錄下,如圖所示,其實就是一個.traineddata為后綴的文件,大小約2M多。
訓(xùn)練數(shù)據(jù),官方下載地址:https://digi.bib.uni-mannheim.de/tesseract/
GitHub官網(wǎng)地址:https://github.com/tesseract-o
3、編寫配置類
@Configuration public class TesseractOcrConfig { @Value("${tess4j.dataPath}") private String dataPath; @Bean public Tesseract tesseract() { Tesseract tesseract = new Tesseract(); // 設(shè)置訓(xùn)練數(shù)據(jù)文件夾路徑 tesseract.setDatapath(dataPath); // 設(shè)置為中文簡體 tesseract.setLanguage("chi_sim"); return tesseract; } }
4、編寫業(yè)務(wù)實現(xiàn)類
@Service public class OcrServiceImpl implements OcrService { private final Tesseract tesseract; public OcrServiceImpl(Tesseract tesseract) { this.tesseract = tesseract; } /** * * @param imageFile 要識別的圖片 * @return */ @Override public String recognizeText(MultipartFile imageFile) throws IOException, TesseractException { // 轉(zhuǎn)換 InputStream sbs = new ByteArrayInputStream(imageFile.getBytes()); BufferedImage bufferedImage = ImageIO.read(sbs); // 對圖片進(jìn)行文字識別 return tesseract.doOCR(bufferedImage); } }
5、編寫測試接口
@RestController @RequestMapping("/api") @Slf4j public class OcrController { private final OcrService ocrService; public OcrController(OcrService ocrService) { this.ocrService = ocrService; } @PostMapping(value = "/recognize", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public String recognizeImage(@RequestParam("file") MultipartFile file) throws TesseractException, IOException { log.info(ocrService.recognizeText(file)); // 調(diào)用OcrService中的方法進(jìn)行文字識別 return ocrService.recognizeText(file); } }
postman配置:
效果:
此方法的識別精準(zhǔn)度差,不建議使用。
整合百度智能云實現(xiàn)
官網(wǎng)文檔:https://ai.baidu.com/ai-doc/OCR/dk3iqnq51
1、根據(jù)官方文檔創(chuàng)建應(yīng)用
2、引入依賴
<!--百度ocr--> <dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.16.10</version> </dependency>
3、編寫yml配置文件
server: port: 8090 baidu: APP_ID: #應(yīng)用的appid API_KEY: #你的app_key SECRET_KEY: #你的secret_key
4、創(chuàng)建一個配置類來初始化百度OCR的客戶端
@Setter @Configuration @ConfigurationProperties(prefix = "baidu") public class baiduOcrConfig { private String APP_ID; private String API_KEY; private String SECRET_KEY; @Bean public AipOcr aipOcr() { return new AipOcr(APP_ID, API_KEY, SECRET_KEY); } }
5、編寫controller
@RestController @Slf4j @RequestMapping("/api") public class BaiduOcrController { @Autowired private AipOcr aipOcr; @PostMapping(value = "/process",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public String processImage(@RequestParam("file") MultipartFile file) { HashMap<String, String> options = new HashMap<String, String>(); options.put("detect_direction", "true"); options.put("probability", "true"); try { byte[] imageBytes = file.getBytes(); JSONObject result = aipOcr.basicGeneral(imageBytes, options); // 解析百度OCR的識別結(jié)果 StringBuilder sb = new StringBuilder(); result.getJSONArray("words_result").forEach(item -> { JSONObject word = (JSONObject) item; sb.append(word.getString("words")).append("\n"); }); return sb.toString(); } catch (IOException e) { e.printStackTrace(); return "Error processing image"; } } }
6、使用postm測試
效果:
精準(zhǔn)度很高,推薦使用,而且還有很多的精準(zhǔn)度選擇
常用API:
https://ai.baidu.com/ai-doc/OCR/Nkibizxlf
通用文字識別
官網(wǎng)文檔:https://ai.baidu.com/ai-doc/OCR/Nkibizxlf#%E9%80%9A%E7%94%A8%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB
//image為圖片的二進(jìn)制字節(jié)數(shù)組,options為傳入可選參數(shù)調(diào)用接口 basicGeneral(byte[] image, HashMap<String, String> options)
//image為圖片的存放路徑,options為傳入可選參數(shù)調(diào)用接口 basicGeneral(String image, HashMap<String, String> options)
//image為圖片的存放在服務(wù)器的路徑,options為傳入可選參數(shù)調(diào)用接口 basicGeneralUrl(String url, HashMap<String, String> options)
通用文字識別(高精度版)
官網(wǎng)文檔:https://ai.baidu.com/ai-doc/OCR/Nkibizxlf#%E9%80%9A%E7%94%A8%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB%EF%BC%88%E9%AB%98%E7%B2%BE%E5%BA%A6%E7%89%88%EF%BC%89
//image為圖片的二進(jìn)制字節(jié)數(shù)組,options為傳入可選參數(shù)調(diào)用接口 basicAccurateGeneral(byte[] image, HashMap<String, String> options)
//image為本地圖片的存放路徑,options為傳入可選參數(shù)調(diào)用接口 basicAccurateGeneral(String image, HashMap<String, String> options)
通用文字識別(含位置信息版)
官網(wǎng)文檔:https://ai.baidu.com/ai-doc/OCR/Nkibizxlf#%E9%80%9A%E7%94%A8%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB%EF%BC%88%E5%90%AB%E4%BD%8D%E7%BD%AE%E4%BF%A1%E6%81%AF%E7%89%88%EF%BC%89
//image為圖片的二進(jìn)制字節(jié)數(shù)組,options為傳入可選參數(shù)調(diào)用接口 general(byte[] image, HashMap<String, String> options)
//image為圖片的存放路徑,options為傳入可選參數(shù)調(diào)用接口 general(String image, HashMap<String, String> options)
//image為圖片的存放在服務(wù)器的路徑,options為傳入可選參數(shù)調(diào)用接口 generalUrl(String url, HashMap<String, String> options)
通用文字識別(含位置高精度版)
官網(wǎng)文檔:https://ai.baidu.com/ai-doc/OCR/Nkibizxlf#%E9%80%9A%E7%94%A8%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB%EF%BC%88%E5%90%AB%E4%BD%8D%E7%BD%AE%E9%AB%98%E7%B2%BE%E5%BA%A6%E7%89%88%EF%BC%89
//image為圖片的二進(jìn)制字節(jié)數(shù)組,options為傳入可選參數(shù)調(diào)用接口 accurateGeneral(byte[] image, HashMap<String, String> options)
//image為圖片的存放路徑,options為傳入可選參數(shù)調(diào)用接口 accurateGeneral(String image, HashMap<String, String> options)
通用文字識別(含生僻字版)
官網(wǎng)文檔:https://ai.baidu.com/ai-doc/OCR/Nkibizxlf#%E9%80%9A%E7%94%A8%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB%EF%BC%88%E5%90%AB%E7%94%9F%E5%83%BB%E5%AD%97%E7%89%88%EF%BC%89
enhancedGeneral(byte[] image, HashMap<String, String> options)
enhancedGeneral(String image, HashMap<String, String> options)
enhancedGeneralUrl(String url, HashMap<String, String> options)
整合阿里云
官方文檔:https://next.api.aliyun.com/api-tools/sdk/ocr-api?spm=a2c4g.442247.0.0.40933e8eQ3GZIX&version=2021-07-07&language=java-tea&tab=primer-doc
https://next.api.aliyun.com/api/ocr-api/2021-07-07/RecognizeAdvanced?spm=api-workbench.SDK%20Document.0.0.2e7652e95jnhKE&tab=DOC&sdkStyle=dara&lang=JAVA
1、引入依賴
<dependency> <groupId>com.aliyun</groupId> <artifactId>ocr_api20210707</artifactId> <version>1.2.0</version> </dependency>
2、編寫yml配置文件
server: port: 8099 aliyun: KeyId: #你的KeyId KeySecret: #你的KeySecret endpoint: ocr-api.cn-hangzhou.aliyuncs.com
3、編寫配置類
@Setter @Component @ConfigurationProperties(prefix = "aliyun") public class AliyunOcrConfig { private String KeyId; private String KeySecret; private String endpoint; @Bean public Client ocrClient(){ try { Client client = new Client(new Config().setAccessKeyId(KeyId).setAccessKeySecret(KeySecret).setEndpoint(endpoint)); return client; } catch (Exception e) { throw new RuntimeException(e); } } }
4、編寫測試接口
@RestController @RequestMapping("/api") @Slf4j public class AliyunOcrController { @Resource private Client client; @PostMapping(value = "ocr",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public String OcrTest(@RequestParam("file")MultipartFile file) throws IOException { RecognizeGeneralRequest request = new RecognizeGeneralRequest(); request.setBody(file.getInputStream()); try { RecognizeGeneralResponse response = client.recognizeGeneral(request); String json = new Gson().toJson(response.getBody()); String[] split = json.split(","); return split[1].split(":")[1].replace("\\",""); // return json; } catch (TeaException error) { Common.assertAsString(error.message); } catch (Exception e) { TeaException error = new TeaException(e.getMessage(), e); // 如有需要,請打印 error Common.assertAsString(error.message); } return null; } }
5、使用postman測試
整合騰訊云實現(xiàn)
官網(wǎng)文檔:https://cloud.tencent.com/document/product/866
官網(wǎng)API:https://cloud.tencent.com/document/api/866/33515
官網(wǎng)參數(shù)說明與在線調(diào)試:https://console.cloud.tencent.com/api/explorer?Product=ocr&Version=2018-11-19&Action=GeneralHandwritingOCR
1、獲取密鑰:
https://console.cloud.tencent.com/cam/capi
2、引入依賴
<dependency> <groupId>com.tencentcloudapi</groupId> <artifactId>tencentcloud-sdk-java</artifactId> <version>3.1.909</version> </dependency>
3、編寫yml配置文件
server: port: 9090 tencent: SecretId: #你的SecretId SecretKey: #你的SecretKey
4、編寫配置類
@Setter @Configuration @ConfigurationProperties(prefix = "tencent") public class TencentOcrConfig { private String SecretId; private String SecretKey; @Bean public Credential credential(){ return new Credential(SecretId,SecretKey); } }
5、編寫將文件轉(zhuǎn)換成Base64編碼的工具類
由于騰訊云OCR的API接收的參數(shù)如下圖,所以要編寫將文件轉(zhuǎn)碼成Base64的工具類:
public class ByteToBase64Converter { public static String encodeBytesToBase64(byte[] bytes) { return Base64.getEncoder().encodeToString(bytes); } }
6、編寫接口測試
@RestController @RequestMapping("/api") @Slf4j public class TencentOcrController { @Resource private Credential credential; @PostMapping(value = "/tencent",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public String TencentOCR(@RequestParam("file")MultipartFile file) throws TencentCloudSDKException, IOException { // 實例化一個http選項,可選的,沒有特殊需求可以跳過 HttpProfile httpProfile = new HttpProfile(); httpProfile.setEndpoint("ocr.tencentcloudapi.com"); // 實例化一個client選項,可選的,沒有特殊需求可以跳過 ClientProfile clientProfile = new ClientProfile(); clientProfile.setHttpProfile(httpProfile); // 實例化要請求產(chǎn)品的client對象,clientProfile是可選的 OcrClient client = new OcrClient(credential, "ap-guangzhou", clientProfile); //將上傳的文件轉(zhuǎn)換成base64編碼 String encodeBytesToBase64 = ByteToBase64Converter.encodeBytesToBase64(file.getBytes()); // 實例化一個請求對象,每個接口都會對應(yīng)一個request對象 GeneralBasicOCRRequest req = new GeneralBasicOCRRequest(); req.setImageBase64(encodeBytesToBase64); // req.setImageUrl("https://ltmyblog.oss-cn-shenzhen.aliyuncs.com/myBlog/article/image-20230924213423855.png"); // 返回的resp是一個GeneralBasicOCRResponse的實例,與請求對象對應(yīng) GeneralBasicOCRResponse resp = client.GeneralBasicOCR(req); GeneralBasicOCRResponse.toJsonString(resp); // 輸出json格式的字符串回包 System.out.println(GeneralBasicOCRResponse.toJsonString(resp)); return GeneralBasicOCRResponse.toJsonString(resp); } }
7、使用postman測試
到此這篇關(guān)于SpringBoot實現(xiàn)圖片識別文字的四種方式小結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot 圖片識別文字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)自定義Starter的步驟詳解
在SpringBoot中,Starter是一種特殊的依賴,它可以幫助我們快速地集成一些常用的功能,例如數(shù)據(jù)庫連接、消息隊列、Web框架等。在本文中,我們將介紹如何使用Spring Boot實現(xiàn)自定義Starter,需要的朋友可以參考下2023-06-06Java接口自動化測試框架設(shè)計之Get請求方法和測試詳解
這篇文章主要介紹了Java接口自動化測試框架設(shè)計 Get請求方法和測試,框架設(shè)計我們只是介紹基本的組件,而且框架設(shè)計沒有想象那么難,一步一步跟著做就會了。這篇我們來演示,如果通過Java代碼來實現(xiàn)一個用純代碼實現(xiàn)Http中的Get請求過程,需要的朋友可以參考下2019-07-07