赞
踩
图片识别是一种利用计算机视觉和机器学习技术来识别和理解图片内容的过程。它可以将图片中的信息,如文字、物体、场景等,转换为可编辑和可搜索的数据。图片识别技术广泛应用于各种场景,包括但不限于安防监控、社交媒体内容分析、医疗影像分析、自动驾驶汽车的视觉系统等。
OCR(Optical Character Recognition,光学字符识别)是图片识别的一个子领域,专注于从图像中识别和提取文字信息。OCR技术能够处理各种类型的文档图像,包括扫描的纸质文档、PDF文件、照片等,将图像中的文字转换为机器编码的文本。这一技术对于数字化存档、自动数据录入、语言翻译等领域具有重要意义。
OCR技术的工作原理通常包括以下几个步骤:
预处理: 预处理是OCR流程中的第一步,目的是改善图像质量,提高文字识别的准确率。这可能包括去噪、二值化(将图像转换为黑白两色)、校正倾斜、调整对比度等操作。
文字检测: 在预处理后,OCR系统会使用文字检测算法来定位图像中的文字区域。这一步骤对于后续的文字识别至关重要,因为它决定了文字识别的准确性和效率。
文字分割: 一旦文字被检测到,OCR系统会将连续的文字分割成单个字符或单词。这对于后续的字符识别和文本理解非常关键。
字符识别: 在文字分割后,OCR系统会使用机器学习模型(如深度学习网络)来识别每一个字符。这一步骤需要高度精确,因为字符的形状和大小可能因字体、书写风格等因素而有很大差异。
后处理: 字符识别后,OCR系统会进行后处理,包括校正拼写错误、格式化文本、识别语言等。这一步骤可以提高最终输出文本的质量。
OCR技术的发展经历了几个阶段。早期的OCR系统主要依赖于规则匹配和模式识别技术。随着机器学习技术的发展,特别是深度学习的兴起,现代OCR系统开始采用复杂的神经网络模型,如卷积神经网络(CNN)和循环神经网络(RNN),这些模型能够自动学习和提取图像特征,显著提高了文字识别的准确率和鲁棒性。
OCR技术的应用非常广泛。在商业领域,它可以用于自动化发票和收据的处理;在法律领域,OCR可以帮助律师和法官快速检索和分析法律文档;在教育领域,OCR可以用于自动评分和反馈学生的作业;在公共服务领域,OCR可以提高政府文件处理的效率和透明度。
TextIn是上海合合信息科技股份有限公司旗下的智能文字识别技术、产品、服务的品牌,专注于智能文字识别领域已有15年的历史。它为企业、开发者、个人用户提供智能文字识别引擎、产品、云端服务。TextIn的技术和产品覆盖多种通用场景,支持全球50多种主流语言的图片文字检测和识别,并能够处理多角度、高光、模糊、褶皱、阴影、夜景等各种文字场景。此外,TextIn还提供基于不同行业和场景的智能文字识别引擎,如200+国内外常见卡证、票据、行业单据等高精准度识别产品,并支持安全稳定的云端服务、端侧SDK、私有化部署等多种服务形式。
官网
首先我们需要注册一个账号,登录合合TextIn官网进行注册就可以。
首先,我们需要创建一个Spring Boot项目。
在项目的pom.xml文件中添加TextIn的依赖,以便在项目中使用TextIn服务。
- <dependency>
- <groupId>com.textin</groupId>
- <artifactId>textin-sdk-java</artifactId>
- <version>版本号</version>
- </dependency>
请将版本号替换为最新可用的TextIn SDK版本。
接口信息:
在你的Spring Boot应用的application.properties或application.yml文件中,添加TextIn API的配置信息,包括你的API密钥和密钥。
- textin.app-id=你的App-ID
- textin.app-secret=你的App-Secret
创建一个新的服务类TextInService.java,用于封装TextIn API的调用。
- @Service
- public class TextInService {
-
- private final String appId;
- private final String appSecret;
-
- public TextInService(@Value("${textin.app-id}") String appId, @Value("${textin.app-secret}") String appSecret) {
- this.appId = appId;
- this.appSecret = appSecret;
- }
-
- public String recognizeText(MultipartFile file) throws Exception {
- // 使用TextIn SDK进行文字识别的代码
- // 这里需要根据TextIn SDK的文档来实现具体的识别逻辑
- }
- }
创建一个新的Controller类TextInController.java,用于处理HTTP请求并调用TextIn服务。
- @RestController
- @RequestMapping("/textin")
- public class TextInController {
-
- @Autowired
- private TextInService textInService;
-
- @PostMapping("/recognize")
- public ResponseEntity<String> recognizeText(@RequestParam("file") MultipartFile file) {
- try {
- String result = textInService.recognizeText(file);
- return ResponseEntity.ok(result);
- } catch (Exception e) {
- return ResponseEntity.badRequest().body("Text recognition failed: " + e.getMessage());
- }
- }
- }
运行你的Spring Boot应用,并通过浏览器或Postman等工具向/textin/recognize端点发送一个包含图片文件的POST请求。
确保TextIn服务能够正确响应请求并返回识别结果。
使用Spring Initializr创建一个新的Spring Boot项目,并添加必要的依赖,如spring-web用于处理HTTP请求和响应。
在你的application.properties或application.yml中配置TextIn API的相关信息,包括你的App ID和Secret Code。
- textin.app-id=你的App-ID
- textin.app-secret=你的App-Secret
- textin.api-url=https://api.textin.com/ai/service/v2/recognize
创建一个服务类TextInService,用于封装与TextIn API的交互。
- @Service
- public class TextInService {
-
- private final String appId;
- private final String appSecret;
- private final String apiUrl;
-
- public TextInService(
- @Value("${textin.app-id}") String appId,
- @Value("${textin.app-secret}") String appSecret,
- @Value("${textin.api-url}") String apiUrl) {
- this.appId = appId;
- this.appSecret = appSecret;
- this.apiUrl = apiUrl;
- }
-
- public String recognizeAndConvert(MultipartFile file) throws IOException {
- // 构建请求URL
- URL url = new URL(apiUrl);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setRequestMethod("POST");
- conn.setRequestProperty("Content-Type", "application/octet-stream");
- conn.setRequestProperty("x-ti-app-id", appId);
- conn.setRequestProperty("x-ti-secret-code", appSecret);
- conn.setDoOutput(true);
-
- // 发送文件数据
- OutputStream os = conn.getOutputStream();
- os.write(file.getBytes());
- os.flush();
- os.close();
-
- // 读取响应
- BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
- String line;
- StringBuilder response = new StringBuilder();
- while ((line = reader.readLine()) != null) {
- response.append(line);
- }
- reader.close();
-
- // 解析响应并转换为Word或其他格式
- // 这里需要根据TextIn的API文档来实现具体的转换逻辑
- return response.toString();
- }
- }
-
- @RestController
- @RequestMapping("/textin")
- public class TextInController {
-
- @Autowired
- private TextInService textInService;
-
- @PostMapping("/convert")
- public ResponseEntity<String> convertDocument(@RequestParam("file") MultipartFile file) {
- try {
- String convertedDocument = textInService.recognizeAndConvert(file);
- return ResponseEntity.ok(convertedDocument);
- } catch (Exception e) {
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
- .body("Error converting document: " + e.getMessage());
- }
- }
- }
- @Service
- public class TextInService {
-
- private final String appId;
- private final String appSecret;
- private final String apiUrl;
-
- public TextInService(
- @Value("${textin.app-id}") String appId,
- @Value("${textin.app-secret}") String appSecret,
- @Value("${textin.api-url}") String apiUrl) {
- this.appId = appId;
- this.appSecret = appSecret;
- this.apiUrl = apiUrl;
- }
-
- public String recognizeTextFromPdf(MultipartFile file) throws IOException {
- // 将PDF文件转换为字节数组
- byte[] fileBytes = file.getBytes();
-
- // 构建请求URL
- URL url = new URL(apiUrl);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setRequestMethod("POST");
- conn.setRequestProperty("Content-Type", "application/octet-stream");
- conn.setRequestProperty("x-ti-app-id", appId);
- conn.setRequestProperty("x-ti-secret-code", appSecret);
- conn.setDoOutput(true);
-
- // 发送文件数据
- OutputStream os = conn.getOutputStream();
- os.write(fileBytes);
- os.flush();
- os.close();
-
- // 读取响应
- BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
- String line;
- StringBuilder response = new StringBuilder();
- while ((line = reader.readLine()) != null) {
- response.append(line);
- }
- reader.close();
-
- // 解析响应并返回文本内容
- // 这里需要根据TextIn的API文档来实现具体的解析逻辑
- return response.toString();
- }
- }
-
- @RestController
- @RequestMapping("/textin")
- public class TextInController {
-
- @Autowired
- private TextInService textInService;
-
- @PostMapping("/recognize-pdf")
- public ResponseEntity<String> recognizeTextFromPdf(@RequestParam("file") MultipartFile file) {
- if (!file.isEmpty()) {
- try {
- String recognizedText = textInService.recognizeTextFromPdf(file);
- return ResponseEntity.ok(recognizedText);
- } catch (IOException e) {
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
- .body("Error recognizing text from PDF: " + e.getMessage());
- }
- } else {
- return ResponseEntity.badRequest().body("Empty file");
- }
- }
- }
有时候我们不是传入本地图片,而是传入url,我们如果直接调用request,然后用PIL的Image读取会产生报错,这是因为请求体的数据格式为文件的二进制流。解决办法是创建一个临时文件,将字节对象写进临时文件上传读取,具体代码如下:
- import org.springframework.http.ResponseEntity;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.multipart.MultipartFile;
-
- import java.io.ByteArrayInputStream;
- import java.io.File;
- import java.io.IOException;
- import java.nio.file.Files;
- import java.util.ArrayList;
- import java.util.List;
-
- @RestController
- public class TextRecognitionController {
-
- // 假设已存在一个名为CommonOcr的类,用于调用TextIn API识别文字
- // 并假设其有一个`recognize`方法接受文件路径作为参数,返回识别结果字符串
-
- @GetMapping("/recognize-text")
- public ResponseEntity<?> recognizeText(@RequestParam("image_url") String imageUrl) {
- try {
- // 发送GET请求到图片URL
- ResponseEntity<byte[]> response = restTemplate.getForEntity(imageUrl, byte[].class);
-
- // 检查请求是否成功
- if (response.getStatusCode().is2xxSuccessful()) {
- // 使用ByteArrayInputStream将响应内容转换为字节流
- ByteArrayInputStream imageStream = new ByteArrayInputStream(response.getBody());
-
- // 创建一个临时文件
- File tempFile = File.createTempFile("temp_image_", ".jpg");
- tempFile.deleteOnExit();
-
- // 将字节流写入临时文件
- Files.copy(imageStream, tempFile.toPath());
-
- // 调用TextIn API来识别文字
- String ans = new CommonOcr(tempFile.getAbsolutePath()).recognize();
-
- // 假设识别结果为JSON格式,将其解析为Map对象
- ObjectMapper mapper = new ObjectMapper();
- Map<String, Object> data = mapper.readValue(ans, Map.class);
-
- // 从结果中提取文字
- List<String> textList = new ArrayList<>();
- List<Map<String, Object>> lines = (List<Map<String, Object>>) data.get("result").get("lines");
- for (Map<String, Object> line : lines) {
- textList.add((String) line.get("text"));
- }
-
- // 返回识别到的文字列表
- return ResponseEntity.ok(textList);
- } else {
- // 如果请求失败,返回一个错误信息
- return ResponseEntity.status(HttpStatus.BAD_REQUEST)
- .body("获取图片失败,状态码:" + response.getStatusCode());
- }
- } catch (IOException e) {
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
- .body("识别图片时发生错误:" + e.getMessage());
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。