当前位置:   article > 正文

结合TextIn和Springboot实现图片识别_springboot颜色识别

springboot颜色识别

简介

图片识别

图片识别是一种利用计算机视觉和机器学习技术来识别和理解图片内容的过程。它可以将图片中的信息,如文字、物体、场景等,转换为可编辑和可搜索的数据。图片识别技术广泛应用于各种场景,包括但不限于安防监控、社交媒体内容分析、医疗影像分析、自动驾驶汽车的视觉系统等。

OCR(Optical Character Recognition,光学字符识别)是图片识别的一个子领域,专注于从图像中识别和提取文字信息。OCR技术能够处理各种类型的文档图像,包括扫描的纸质文档、PDF文件、照片等,将图像中的文字转换为机器编码的文本。这一技术对于数字化存档、自动数据录入、语言翻译等领域具有重要意义。

OCR技术的工作原理通常包括以下几个步骤:

  1. 预处理: 预处理是OCR流程中的第一步,目的是改善图像质量,提高文字识别的准确率。这可能包括去噪、二值化(将图像转换为黑白两色)、校正倾斜、调整对比度等操作。

  2. 文字检测: 在预处理后,OCR系统会使用文字检测算法来定位图像中的文字区域。这一步骤对于后续的文字识别至关重要,因为它决定了文字识别的准确性和效率。

  3. 文字分割: 一旦文字被检测到,OCR系统会将连续的文字分割成单个字符或单词。这对于后续的字符识别和文本理解非常关键。

  4. 字符识别: 在文字分割后,OCR系统会使用机器学习模型(如深度学习网络)来识别每一个字符。这一步骤需要高度精确,因为字符的形状和大小可能因字体、书写风格等因素而有很大差异。

  5. 后处理: 字符识别后,OCR系统会进行后处理,包括校正拼写错误、格式化文本、识别语言等。这一步骤可以提高最终输出文本的质量。

OCR技术的发展经历了几个阶段。早期的OCR系统主要依赖于规则匹配和模式识别技术。随着机器学习技术的发展,特别是深度学习的兴起,现代OCR系统开始采用复杂的神经网络模型,如卷积神经网络(CNN)和循环神经网络(RNN),这些模型能够自动学习和提取图像特征,显著提高了文字识别的准确率和鲁棒性。

OCR技术的应用非常广泛。在商业领域,它可以用于自动化发票和收据的处理;在法律领域,OCR可以帮助律师和法官快速检索和分析法律文档;在教育领域,OCR可以用于自动评分和反馈学生的作业;在公共服务领域,OCR可以提高政府文件处理的效率和透明度。

TextIn是什么?

TextIn是上海合合信息科技股份有限公司旗下的智能文字识别技术、产品、服务的品牌,专注于智能文字识别领域已有15年的历史。它为企业、开发者、个人用户提供智能文字识别引擎、产品、云端服务。TextIn的技术和产品覆盖多种通用场景,支持全球50多种主流语言的图片文字检测和识别,并能够处理多角度、高光、模糊、褶皱、阴影、夜景等各种文字场景。此外,TextIn还提供基于不同行业和场景的智能文字识别引擎,如200+国内外常见卡证、票据、行业单据等高精准度识别产品,并支持安全稳定的云端服务、端侧SDK、私有化部署等多种服务形式。

官网

首先我们需要注册一个账号,登录合合TextIn官网进行注册就可以。

使用场景

  1. 发票识别和数据处理: 开发一个应用,可以让用户上传发票图片,然后使用TextIn进行文字识别,提取发票上的关键信息,如发票号码、日期、金额等。这些信息可以进一步用于自动记账或财务分析。
  2. 身份验证和信息提取: 创建一个安全系统,要求用户上传身份证或护照的照片。通过TextIn的OCR技术,自动识别和提取个人信息,如姓名、性别、出生日期、证件号码等,用于用户注册或身份验证。
  3. 合同内容审查: 利用TextIn的文档分类和内容提取功能,开发一个合同管理平台。用户上传合同文档后,系统自动识别合同类型,并提取重要条款,如期限、金额、责任等,以便于法律审查和合同管理。
  4. 医疗记录数字化: 开发一个医疗记录管理系统,使用TextIn技术将手写的医疗记录或扫描的纸质报告转换为结构化数据。这有助于医生和医疗机构更高效地存储、检索和分析患者信息。
  5. 自动化客户支持: 构建一个客户服务聊天机器人,它可以分析客户上传的图片或文档,自动识别问题并提供相应的解决方案。例如,客户上传一个产品图片,机器人可以识别产品型号并提供使用指南或故障排除建议。
  6. 教育资料分析: 开发一个教育平台,教师可以上传教材或课程资料,TextIn服务将文档内容转换为可搜索的电子格式。平台可以根据关键词或概念自动索引内容,帮助学生快速找到所需资料。
  7. 房地产文档处理: 在房地产管理系统中,集成TextIn服务来处理房产证、租赁协议等文档。自动识别文档中的关键信息,如物业地址、所有权、面积等,以便于房产登记和管理。

结合Springboot使用

步骤 1: 创建Spring Boot项目

首先,我们需要创建一个Spring Boot项目。

步骤 2: 添加TextIn依赖并查看接口介绍

在项目的pom.xml文件中添加TextIn的依赖,以便在项目中使用TextIn服务。

  1. <dependency>
  2. <groupId>com.textin</groupId>
  3. <artifactId>textin-sdk-java</artifactId>
  4. <version>版本号</version>
  5. </dependency>

请将版本号替换为最新可用的TextIn SDK版本。

接口信息:

步骤 3: 配置TextIn API密钥

在你的Spring Boot应用的application.properties或application.yml文件中,添加TextIn API的配置信息,包括你的API密钥和密钥。

  1. textin.app-id=你的App-ID
  2. textin.app-secret=你的App-Secret

步骤 4: 创建TextIn服务类

创建一个新的服务类TextInService.java,用于封装TextIn API的调用。

  1. @Service
  2. public class TextInService {
  3. private final String appId;
  4. private final String appSecret;
  5. public TextInService(@Value("${textin.app-id}") String appId, @Value("${textin.app-secret}") String appSecret) {
  6. this.appId = appId;
  7. this.appSecret = appSecret;
  8. }
  9. public String recognizeText(MultipartFile file) throws Exception {
  10. // 使用TextIn SDK进行文字识别的代码
  11. // 这里需要根据TextIn SDK的文档来实现具体的识别逻辑
  12. }
  13. }

步骤 5: 创建Controller

创建一个新的Controller类TextInController.java,用于处理HTTP请求并调用TextIn服务。

  1. @RestController
  2. @RequestMapping("/textin")
  3. public class TextInController {
  4. @Autowired
  5. private TextInService textInService;
  6. @PostMapping("/recognize")
  7. public ResponseEntity<String> recognizeText(@RequestParam("file") MultipartFile file) {
  8. try {
  9. String result = textInService.recognizeText(file);
  10. return ResponseEntity.ok(result);
  11. } catch (Exception e) {
  12. return ResponseEntity.badRequest().body("Text recognition failed: " + e.getMessage());
  13. }
  14. }
  15. }

步骤 6: 运行应用

运行你的Spring Boot应用,并通过浏览器或Postman等工具向/textin/recognize端点发送一个包含图片文件的POST请求。

步骤 7: 测试和调试

确保TextIn服务能够正确响应请求并返回识别结果。

使用TextIn实现文档转换

步骤 1: 创建Spring Boot项目

使用Spring Initializr创建一个新的Spring Boot项目,并添加必要的依赖,如spring-web用于处理HTTP请求和响应。

步骤 2: 配置TextIn API

在你的application.properties或application.yml中配置TextIn API的相关信息,包括你的App ID和Secret Code。

  1. textin.app-id=你的App-ID
  2. textin.app-secret=你的App-Secret
  3. textin.api-url=https://api.textin.com/ai/service/v2/recognize

步骤 3: 创建TextIn服务类

创建一个服务类TextInService,用于封装与TextIn API的交互。

  1. @Service
  2. public class TextInService {
  3. private final String appId;
  4. private final String appSecret;
  5. private final String apiUrl;
  6. public TextInService(
  7. @Value("${textin.app-id}") String appId,
  8. @Value("${textin.app-secret}") String appSecret,
  9. @Value("${textin.api-url}") String apiUrl) {
  10. this.appId = appId;
  11. this.appSecret = appSecret;
  12. this.apiUrl = apiUrl;
  13. }
  14. public String recognizeAndConvert(MultipartFile file) throws IOException {
  15. // 构建请求URL
  16. URL url = new URL(apiUrl);
  17. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  18. conn.setRequestMethod("POST");
  19. conn.setRequestProperty("Content-Type", "application/octet-stream");
  20. conn.setRequestProperty("x-ti-app-id", appId);
  21. conn.setRequestProperty("x-ti-secret-code", appSecret);
  22. conn.setDoOutput(true);
  23. // 发送文件数据
  24. OutputStream os = conn.getOutputStream();
  25. os.write(file.getBytes());
  26. os.flush();
  27. os.close();
  28. // 读取响应
  29. BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  30. String line;
  31. StringBuilder response = new StringBuilder();
  32. while ((line = reader.readLine()) != null) {
  33. response.append(line);
  34. }
  35. reader.close();
  36. // 解析响应并转换为Word或其他格式
  37. // 这里需要根据TextIn的API文档来实现具体的转换逻辑
  38. return response.toString();
  39. }
  40. }
  41. @RestController
  42. @RequestMapping("/textin")
  43. public class TextInController {
  44. @Autowired
  45. private TextInService textInService;
  46. @PostMapping("/convert")
  47. public ResponseEntity<String> convertDocument(@RequestParam("file") MultipartFile file) {
  48. try {
  49. String convertedDocument = textInService.recognizeAndConvert(file);
  50. return ResponseEntity.ok(convertedDocument);
  51. } catch (Exception e) {
  52. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
  53. .body("Error converting document: " + e.getMessage());
  54. }
  55. }
  56. }

使用TextIn实现PDF文字识别

  1. @Service
  2. public class TextInService {
  3. private final String appId;
  4. private final String appSecret;
  5. private final String apiUrl;
  6. public TextInService(
  7. @Value("${textin.app-id}") String appId,
  8. @Value("${textin.app-secret}") String appSecret,
  9. @Value("${textin.api-url}") String apiUrl) {
  10. this.appId = appId;
  11. this.appSecret = appSecret;
  12. this.apiUrl = apiUrl;
  13. }
  14. public String recognizeTextFromPdf(MultipartFile file) throws IOException {
  15. // 将PDF文件转换为字节数组
  16. byte[] fileBytes = file.getBytes();
  17. // 构建请求URL
  18. URL url = new URL(apiUrl);
  19. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  20. conn.setRequestMethod("POST");
  21. conn.setRequestProperty("Content-Type", "application/octet-stream");
  22. conn.setRequestProperty("x-ti-app-id", appId);
  23. conn.setRequestProperty("x-ti-secret-code", appSecret);
  24. conn.setDoOutput(true);
  25. // 发送文件数据
  26. OutputStream os = conn.getOutputStream();
  27. os.write(fileBytes);
  28. os.flush();
  29. os.close();
  30. // 读取响应
  31. BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  32. String line;
  33. StringBuilder response = new StringBuilder();
  34. while ((line = reader.readLine()) != null) {
  35. response.append(line);
  36. }
  37. reader.close();
  38. // 解析响应并返回文本内容
  39. // 这里需要根据TextIn的API文档来实现具体的解析逻辑
  40. return response.toString();
  41. }
  42. }
  43. @RestController
  44. @RequestMapping("/textin")
  45. public class TextInController {
  46. @Autowired
  47. private TextInService textInService;
  48. @PostMapping("/recognize-pdf")
  49. public ResponseEntity<String> recognizeTextFromPdf(@RequestParam("file") MultipartFile file) {
  50. if (!file.isEmpty()) {
  51. try {
  52. String recognizedText = textInService.recognizeTextFromPdf(file);
  53. return ResponseEntity.ok(recognizedText);
  54. } catch (IOException e) {
  55. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
  56. .body("Error recognizing text from PDF: " + e.getMessage());
  57. }
  58. } else {
  59. return ResponseEntity.badRequest().body("Empty file");
  60. }
  61. }
  62. }

遇到的坑

有时候我们不是传入本地图片,而是传入url,我们如果直接调用request,然后用PIL的Image读取会产生报错,这是因为请求体的数据格式为文件的二进制流。解决办法是创建一个临时文件,将字节对象写进临时文件上传读取,具体代码如下:

  1. import org.springframework.http.ResponseEntity;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RequestParam;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import org.springframework.web.multipart.MultipartFile;
  6. import java.io.ByteArrayInputStream;
  7. import java.io.File;
  8. import java.io.IOException;
  9. import java.nio.file.Files;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. @RestController
  13. public class TextRecognitionController {
  14. // 假设已存在一个名为CommonOcr的类,用于调用TextIn API识别文字
  15. // 并假设其有一个`recognize`方法接受文件路径作为参数,返回识别结果字符串
  16. @GetMapping("/recognize-text")
  17. public ResponseEntity<?> recognizeText(@RequestParam("image_url") String imageUrl) {
  18. try {
  19. // 发送GET请求到图片URL
  20. ResponseEntity<byte[]> response = restTemplate.getForEntity(imageUrl, byte[].class);
  21. // 检查请求是否成功
  22. if (response.getStatusCode().is2xxSuccessful()) {
  23. // 使用ByteArrayInputStream将响应内容转换为字节流
  24. ByteArrayInputStream imageStream = new ByteArrayInputStream(response.getBody());
  25. // 创建一个临时文件
  26. File tempFile = File.createTempFile("temp_image_", ".jpg");
  27. tempFile.deleteOnExit();
  28. // 将字节流写入临时文件
  29. Files.copy(imageStream, tempFile.toPath());
  30. // 调用TextIn API来识别文字
  31. String ans = new CommonOcr(tempFile.getAbsolutePath()).recognize();
  32. // 假设识别结果为JSON格式,将其解析为Map对象
  33. ObjectMapper mapper = new ObjectMapper();
  34. Map<String, Object> data = mapper.readValue(ans, Map.class);
  35. // 从结果中提取文字
  36. List<String> textList = new ArrayList<>();
  37. List<Map<String, Object>> lines = (List<Map<String, Object>>) data.get("result").get("lines");
  38. for (Map<String, Object> line : lines) {
  39. textList.add((String) line.get("text"));
  40. }
  41. // 返回识别到的文字列表
  42. return ResponseEntity.ok(textList);
  43. } else {
  44. // 如果请求失败,返回一个错误信息
  45. return ResponseEntity.status(HttpStatus.BAD_REQUEST)
  46. .body("获取图片失败,状态码:" + response.getStatusCode());
  47. }
  48. } catch (IOException e) {
  49. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
  50. .body("识别图片时发生错误:" + e.getMessage());
  51. }
  52. }
  53. }

总结

使用心得

  1. 易用性: TextIn提供了简单易用的API接口,使得开发者可以快速集成到现有的系统中。通过简单的HTTP请求,就可以将图片或扫描的文档发送到TextIn服务器进行处理,并获取到结构化的文本数据。这种无需复杂配置和深度定制的集成方式,极大地提高了开发效率。
  2. 准确性: TextIn的OCR技术在大多数情况下表现出了高准确率,特别是在处理打印体文档时。它能够有效识别多种字体和格式,包括表格、列表等复杂布局,这对于需要从文档中提取精确数据的应用场景来说至关重要。
  3. 功能丰富性: 除了基本的文字识别,TextIn还提供了多种增值服务,如表格识别、手写文字识别、多语言支持等。这些功能使得TextIn可以满足不同行业和场景的需求,如金融、法律、教育等领域。
  4. 技术支持: TextIn的技术支持团队提供了及时有效的帮助。在遇到问题时,可以通过官方文档、社区论坛或直接联系技术支持团队来获得解决方案,这对于确保项目顺利进行非常重要。

可能遇到的坑

  1. 手写文字识别: 虽然TextIn支持手写文字识别,但这一领域的技术挑战较大。在实际应用中,手写文字的识别准确率可能不如打印体,特别是在字迹潦草或字体不规则的情况下。
  2. 复杂排版的处理: 对于排版复杂或设计独特的文档,TextIn可能无法完全准确地保留原始文档的格式。在这种情况下,可能需要进行后续的人工校对或格式调整。
  3. 大量文档处理: 当处理大量文档时,需要注意API调用频率限制和成本控制。虽然TextIn提供了免费额度,但对于大规模应用,需要合理规划和预算,以避免超出使用限制或产生额外费用。
  4. 安全性和隐私: 在使用TextIn处理敏感文档时,需要确保遵守相关的数据保护法规。所有的文档传输都应通过加密通道进行,以保护用户数据的隐私和安全。
  5. 错误处理和调试: 在使用TextIn API时,可能会遇到各种错误,如网络问题、参数错误等。需要仔细阅读错误码说明,并根据官方文档进行调试和修正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/619998
推荐阅读
相关标签
  

闽ICP备14008679号