PaddleOCR项目实战(2):SpringBoot服务开发之接口设计
1 新建项目
新建一个springboot项目,引用依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.16</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>ocrspringboottest</artifactId><version>1.0-SNAPSHOT</version><name>ocrspringboottest</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.github.yitter</groupId><artifactId>yitter-idgenerator</artifactId><version>1.0.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.8.3</version></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId><version>1.8.6</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
2 接口设计
接口参数:图⽚使⽤Base64编码后,作为参数,Post⽅式进⾏上传。使⽤Base64编码上传图⽚,服务端接⼝实现和调⽤端都相对multipart/form-data⽅式简单灵活。服务端需要将Base64编码的图⽚字符串,转换成图⽚,因此还需要知道图⽚的格式。综上需要两个参数 imgBase64和imgType,分别表示 Base64编码的图⽚字符串和图⽚格式。
编写接口参数的Param对象:
package org.example.domain.param;import lombok.Data;/*** @description: OCR 接口参数*/
@Data
public class OcrParam {/*** 图片base64编码后的字符串*/private String imgBase64;/*** 图片格式*/private String imgType;
}
返回参数:根据PaddleOCR识别图⽚返回的结果及参考百度通⽤⽂字识别接⼝和结合实际使⽤场景。
普通⽂本识别接⼝:
- 返回位置坐标、⽂本、识别精度均返回接⼝
- 只返回⽂本和识别精度接⼝
- 只返回⽂本接口
⻋牌/身份证识别接⼝:
- 返回⽂本和识别精度接⼝
- 只返回⽂本接⼝
DTO对象封装如下:
(1)返回识别结果包含文本和识别精度的接口对象
package org.example.domain.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @description: 返回识别结果包含文本和可信度*/@NoArgsConstructor
@AllArgsConstructor
@Data
public class TextAccuracyDto {/*** 识别文本*/private String text;/*** 识别可信度*/private String accuracy;
}
(2)返回位置坐标、⽂本、识别精度均返回接⼝
package org.example.domain.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Map;/*** @description:识别结果包含文本、可信度、字符位置*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class TextAccuracyLocationDto {/*** 识别的字符文本*/private String text;/*** 可信度*/private String accuracy;/*** 识别的字符文本在图片上的位置,按照顺时针 左上、右上、右下、左下*/private Map<String,OcrPoint> location;
}
(3)只返回⽂本接⼝
package org.example.domain.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @description:只返回识别的文本*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class TextOcrDto {/*** 识别的文本*/private String text;
}
(4)返回文本字符的像素坐标
package org.example.domain.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @description:文本字符的像素坐标*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class OcrPoint {/*** 横坐标的值*/private String x;/*** 纵坐标的值*/private String y;
}