rjuqwhnt
This commit is contained in:
parent
0298014b9d
commit
fe454c4ea7
@ -21,8 +21,21 @@ import java.util.Map;
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 行驶证识别。
|
* 行驶证识别控制器
|
||||||
* https://console.bce.baidu.com/support/?_=1740219852952×tamp=1740323990690#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E4%BA%A4%E9%80%9A%E5%9C%BA%E6%99%AFOCR&api=rest%2F2.0%2Focr%2Fv1%2Fvehicle_license&method=post
|
*
|
||||||
|
* <p>提供行驶证OCR识别功能,基于百度云交通场景OCR接口实现</p>
|
||||||
|
* <p>支持功能:</p>
|
||||||
|
* <ul>
|
||||||
|
* <li>行驶证正面识别:包含号牌号码、车辆类型、所有人、使用性质等基本信息</li>
|
||||||
|
* <li>行驶证反面识别:包含核定载人数、总质量、检验记录等详细信息</li>
|
||||||
|
* <li>支持图片URL和Base64两种输入方式</li>
|
||||||
|
* <li>支持图像方向自动矫正、质量告警等高级功能</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <p>接口文档:https://console.bce.baidu.com/support/#/api?product=AI&project=文字识别&parent=交通场景OCR&api=rest%2F2.0%2Focr%2Fv1%2Fvehicle_license&method=post</p>
|
||||||
|
*
|
||||||
|
* @author heyu
|
||||||
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@ -30,9 +43,13 @@ import java.util.Map;
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class RecognizeDrivingLicenseController extends BaseController {
|
public class RecognizeDrivingLicenseController extends BaseController {
|
||||||
|
|
||||||
// http://localhost:8888/driving/license/recognize
|
/**
|
||||||
// {"side":"front","imageUrl":"https://q1.itc.cn/q_70/images03/20241016/622799fe72cb49f49e16b7f253e75b29.jpeg"}
|
* 行驶证识别接口
|
||||||
// https://api.1024api.com/api-interface/driving/license/recognize
|
* 支持行驶证正反面识别,使用百度云OCR接口
|
||||||
|
*
|
||||||
|
* @param request 行驶证识别请求对象,包含图片URL或base64编码、正反面标识等参数
|
||||||
|
* @return 识别结果,正面返回 {@link RecognizeDrivingLicenseFaceResp},反面返回 {@link RecognizeDrivingLicenseBackResp}
|
||||||
|
*/
|
||||||
@EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
|
@EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
|
||||||
@PostMapping("/recognize")
|
@PostMapping("/recognize")
|
||||||
public R<Object> recognize(@RequestBody VehicleLicenseRequest request) {
|
public R<Object> recognize(@RequestBody VehicleLicenseRequest request) {
|
||||||
@ -65,6 +82,12 @@ public class RecognizeDrivingLicenseController extends BaseController {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将前端请求对象转换为百度云请求对象
|
||||||
|
*
|
||||||
|
* @param request 前端行驶证识别请求
|
||||||
|
* @return 百度云行驶证识别请求对象
|
||||||
|
*/
|
||||||
private BVehicleLicenseRequest toBaiduRequest(VehicleLicenseRequest request) {
|
private BVehicleLicenseRequest toBaiduRequest(VehicleLicenseRequest request) {
|
||||||
BVehicleLicenseRequest bVehicleLicenseRequest = new BVehicleLicenseRequest();
|
BVehicleLicenseRequest bVehicleLicenseRequest = new BVehicleLicenseRequest();
|
||||||
if (request == null) {
|
if (request == null) {
|
||||||
@ -78,6 +101,12 @@ public class RecognizeDrivingLicenseController extends BaseController {
|
|||||||
return bVehicleLicenseRequest;
|
return bVehicleLicenseRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验请求参数的合法性
|
||||||
|
*
|
||||||
|
* @param request 百度云请求对象
|
||||||
|
* @return 校验通过返回null,否则返回错误信息
|
||||||
|
*/
|
||||||
private String checkRequest(BVehicleLicenseRequest request) {
|
private String checkRequest(BVehicleLicenseRequest request) {
|
||||||
if (!hasImage(request)) {
|
if (!hasImage(request)) {
|
||||||
return "imageUrl和imageBase64不能同时为空";
|
return "imageUrl和imageBase64不能同时为空";
|
||||||
@ -97,10 +126,22 @@ public class RecognizeDrivingLicenseController extends BaseController {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查请求中是否包含有效的图片数据
|
||||||
|
*
|
||||||
|
* @param request 百度云请求对象
|
||||||
|
* @return 如果包含imageUrl或imageBase64则返回true
|
||||||
|
*/
|
||||||
private boolean hasImage(BVehicleLicenseRequest request) {
|
private boolean hasImage(BVehicleLicenseRequest request) {
|
||||||
return request != null && (!isBlank(request.getImageUrl()) || !isBlank(request.getImageBase64()));
|
return request != null && (!isBlank(request.getImageUrl()) || !isBlank(request.getImageBase64()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建百度云OCR接口的请求参数字符串
|
||||||
|
*
|
||||||
|
* @param request 百度云请求对象
|
||||||
|
* @return HTTP请求参数字符串
|
||||||
|
*/
|
||||||
private String getContent(BVehicleLicenseRequest request) {
|
private String getContent(BVehicleLicenseRequest request) {
|
||||||
StringBuffer sb = getImageContent(request);
|
StringBuffer sb = getImageContent(request);
|
||||||
if (StringUtils.isNotBlank(request.getDetectDirection())) {
|
if (StringUtils.isNotBlank(request.getDetectDirection())) {
|
||||||
@ -121,6 +162,12 @@ public class RecognizeDrivingLicenseController extends BaseController {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取图片相关的请求参数
|
||||||
|
*
|
||||||
|
* @param request 百度云请求对象
|
||||||
|
* @return 包含image或url参数的StringBuffer
|
||||||
|
*/
|
||||||
private StringBuffer getImageContent(BVehicleLicenseRequest request) {
|
private StringBuffer getImageContent(BVehicleLicenseRequest request) {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
if (StringUtils.isNotBlank(request.getImageBase64())) {
|
if (StringUtils.isNotBlank(request.getImageBase64())) {
|
||||||
@ -133,14 +180,33 @@ public class RecognizeDrivingLicenseController extends BaseController {
|
|||||||
return sb;
|
return sb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查字符串是否不在允许的true/false范围内
|
||||||
|
*
|
||||||
|
* @param value 待检查的字符串
|
||||||
|
* @return 如果不是"true"或"false"返回true
|
||||||
|
*/
|
||||||
private boolean checkNotTrueFalse(String value) {
|
private boolean checkNotTrueFalse(String value) {
|
||||||
return !ApiConstants.trueOrFalse.contains(value);
|
return !ApiConstants.trueOrFalse.contains(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查字符串是否不在允许的front/back范围内
|
||||||
|
*
|
||||||
|
* @param value 待检查的字符串
|
||||||
|
* @return 如果不是"front"或"back"返回true
|
||||||
|
*/
|
||||||
private boolean checkNotFrontBack(String value) {
|
private boolean checkNotFrontBack(String value) {
|
||||||
return !ApiConstants.frontOrback.contains(value);
|
return !ApiConstants.frontOrback.contains(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据正反面标识转换为对应的响应对象
|
||||||
|
*
|
||||||
|
* @param side 行驶证正反面标识(front正面,back反面)
|
||||||
|
* @param data 百度云OCR识别的原始数据
|
||||||
|
* @return 正面返回 {@link RecognizeDrivingLicenseFaceResp},反面返回 {@link RecognizeDrivingLicenseBackResp}
|
||||||
|
*/
|
||||||
private Object toRecognizeResp(String side, Map<String, Object> data) {
|
private Object toRecognizeResp(String side, Map<String, Object> data) {
|
||||||
if (ApiConstants.front.equals(side)) {
|
if (ApiConstants.front.equals(side)) {
|
||||||
return toFaceResp(data);
|
return toFaceResp(data);
|
||||||
@ -148,6 +214,12 @@ public class RecognizeDrivingLicenseController extends BaseController {
|
|||||||
return toBackResp(data);
|
return toBackResp(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将百度云OCR识别结果转换为行驶证正面响应对象
|
||||||
|
*
|
||||||
|
* @param data 百度云OCR识别的原始数据
|
||||||
|
* @return 行驶证正面响应对象,包含号牌号码、车辆类型、所有人等信息
|
||||||
|
*/
|
||||||
private RecognizeDrivingLicenseFaceResp toFaceResp(Map<String, Object> data) {
|
private RecognizeDrivingLicenseFaceResp toFaceResp(Map<String, Object> data) {
|
||||||
RecognizeDrivingLicenseFaceResp faceResp = new RecognizeDrivingLicenseFaceResp();
|
RecognizeDrivingLicenseFaceResp faceResp = new RecognizeDrivingLicenseFaceResp();
|
||||||
faceResp.setIssueDate(MapUtils.getByExpr(data, "words_result.发证日期.words"));
|
faceResp.setIssueDate(MapUtils.getByExpr(data, "words_result.发证日期.words"));
|
||||||
@ -164,6 +236,12 @@ public class RecognizeDrivingLicenseController extends BaseController {
|
|||||||
return faceResp;
|
return faceResp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将百度云OCR识别结果转换为行驶证反面响应对象
|
||||||
|
*
|
||||||
|
* @param data 百度云OCR识别的原始数据
|
||||||
|
* @return 行驶证反面响应对象,包含号牌号码、核定载人数、总质量等信息
|
||||||
|
*/
|
||||||
private RecognizeDrivingLicenseBackResp toBackResp(Map<String, Object> data) {
|
private RecognizeDrivingLicenseBackResp toBackResp(Map<String, Object> data) {
|
||||||
RecognizeDrivingLicenseBackResp backResp = new RecognizeDrivingLicenseBackResp();
|
RecognizeDrivingLicenseBackResp backResp = new RecognizeDrivingLicenseBackResp();
|
||||||
backResp.setOverallDimension(MapUtils.getByExpr(data, "words_result.外廓尺寸.words"));
|
backResp.setOverallDimension(MapUtils.getByExpr(data, "words_result.外廓尺寸.words"));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user