Browse Source

图像识别

recovery
zhizhi wu 4 years ago
parent
commit
eb863d3d84
  1. 6
      tcm/src/main/java/com/ccsens/tcm/api/OcrController.java
  2. 4
      tcm/src/main/java/com/ccsens/tcm/bean/dto/QuestionOcrDto.java
  3. 4
      tcm/src/main/java/com/ccsens/tcm/service/IOcrService.java
  4. 34
      tcm/src/main/java/com/ccsens/tcm/service/OcrService.java

6
tcm/src/main/java/com/ccsens/tcm/api/OcrController.java

@ -2,17 +2,11 @@ package com.ccsens.tcm.api;
import com.ccsens.cloudutil.annotation.MustLogin; import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.tcm.bean.dto.QuestionOcrDto; import com.ccsens.tcm.bean.dto.QuestionOcrDto;
import com.ccsens.tcm.bean.vo.InpatientVo;
import com.ccsens.tcm.bean.vo.QuestionOcrVo; import com.ccsens.tcm.bean.vo.QuestionOcrVo;
import com.ccsens.tcm.service.IOcrService; import com.ccsens.tcm.service.IOcrService;
import com.ccsens.tcm.uitl.Constant;
import com.ccsens.util.JsonResponse; import com.ccsens.util.JsonResponse;
import com.ccsens.util.baidu.BaiDuDto;
import com.ccsens.util.baidu.BaiDuUtil;
import com.ccsens.util.baidu.BaiDuVo;
import com.ccsens.util.bean.dto.QueryDto; import com.ccsens.util.bean.dto.QueryDto;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

4
tcm/src/main/java/com/ccsens/tcm/bean/dto/QuestionOcrDto.java

@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/** /**
* @description: 通用文字识别 * @description: 通用文字识别
@ -16,6 +17,7 @@ public class QuestionOcrDto {
@ApiModel("报告单图片文字通用识别-请求") @ApiModel("报告单图片文字通用识别-请求")
@Data @Data
public static class GeneralBasic{ public static class GeneralBasic{
@NotNull
@ApiModelProperty("患者ID") @ApiModelProperty("患者ID")
private Long patientId; private Long patientId;
@ApiModelProperty("报告单类型") @ApiModelProperty("报告单类型")
@ -23,5 +25,7 @@ public class QuestionOcrDto {
private String code; private String code;
@ApiModelProperty("图片路径") @ApiModelProperty("图片路径")
private String url; private String url;
@ApiModelProperty("图片ID")
private Long fileId;
} }
} }

4
tcm/src/main/java/com/ccsens/tcm/service/IOcrService.java

@ -4,6 +4,8 @@ package com.ccsens.tcm.service;
import com.ccsens.tcm.bean.dto.QuestionOcrDto; import com.ccsens.tcm.bean.dto.QuestionOcrDto;
import com.ccsens.tcm.bean.vo.QuestionOcrVo; import com.ccsens.tcm.bean.vo.QuestionOcrVo;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List; import java.util.List;
/** /**
@ -16,5 +18,5 @@ public interface IOcrService {
* @param userId 用户ID * @param userId 用户ID
* @return words * @return words
*/ */
List<QuestionOcrVo.GeneralBasic> identifyWords(QuestionOcrDto.GeneralBasic param, Long userId); List<QuestionOcrVo.GeneralBasic> identifyWords(QuestionOcrDto.GeneralBasic param, Long userId) throws IOException;
} }

34
tcm/src/main/java/com/ccsens/tcm/service/OcrService.java

@ -1,15 +1,20 @@
package com.ccsens.tcm.service; package com.ccsens.tcm.service;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.img.Img;
import cn.hutool.core.util.ImageUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.cloudapi.sdk.model.ApiResponse; import com.alibaba.cloudapi.sdk.model.ApiResponse;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ccsens.tcm.bean.dto.QuestionOcrDto; import com.ccsens.tcm.bean.dto.QuestionOcrDto;
import com.ccsens.tcm.bean.po.CommonFile;
import com.ccsens.tcm.bean.po.ReportOcr; import com.ccsens.tcm.bean.po.ReportOcr;
import com.ccsens.tcm.bean.po.ReportOcrExample; import com.ccsens.tcm.bean.po.ReportOcrExample;
import com.ccsens.tcm.bean.vo.QuestionOcrVo; import com.ccsens.tcm.bean.vo.QuestionOcrVo;
import com.ccsens.tcm.persist.dao.QuestionOcrDao; import com.ccsens.tcm.persist.dao.QuestionOcrDao;
import com.ccsens.tcm.persist.mapper.CommonFileMapper;
import com.ccsens.tcm.persist.mapper.ReportOcrMapper; import com.ccsens.tcm.persist.mapper.ReportOcrMapper;
import com.ccsens.tcm.uitl.Constant; import com.ccsens.tcm.uitl.Constant;
import com.ccsens.util.CodeEnum; import com.ccsens.util.CodeEnum;
@ -24,6 +29,14 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -43,10 +56,12 @@ public class OcrService implements IOcrService {
private QuestionOcrDao questionOcrDao; private QuestionOcrDao questionOcrDao;
@Resource @Resource
private ReportOcrMapper reportOcrMapper; private ReportOcrMapper reportOcrMapper;
@Resource
private CommonFileMapper commonFileMapper;
@Override @Override
public List<QuestionOcrVo.GeneralBasic> identifyWords(QuestionOcrDto.GeneralBasic generalBasic, Long userId) { public List<QuestionOcrVo.GeneralBasic> identifyWords(QuestionOcrDto.GeneralBasic generalBasic, Long userId) throws IOException {
long time1 = System.currentTimeMillis(); long time1 = System.currentTimeMillis();
List<QuestionOcrVo.GeneralBasic> vos = new ArrayList<>(); List<QuestionOcrVo.GeneralBasic> vos = new ArrayList<>();
// 类型测评规则 // 类型测评规则
@ -69,9 +84,21 @@ public class OcrService implements IOcrService {
List<String> contents = new ArrayList<>(); List<String> contents = new ArrayList<>();
long time4 = 0; long time4 = 0;
//图片
CommonFile commonFile = commonFileMapper.selectByPrimaryKey(generalBasic.getFileId());
if (commonFile == null) {
throw new BaseException(CodeEnum.PARAM_ERROR);
}
File file = new File(commonFile.getLocation());
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageUtil.scale(ImageIO.read(file), out, 0.5f);
// Img.from(new URL(generalBasic.getUrl())).scale(0.5f).write(out);
String img = Base64.encode(out.toByteArray());
if (baidu) { if (baidu) {
BaiDuDto.GeneralBasic basic = new BaiDuDto.GeneralBasic(); BaiDuDto.GeneralBasic basic = new BaiDuDto.GeneralBasic();
basic.setUrl(generalBasic.getUrl()); // basic.setUrl(generalBasic.getUrl());
basic.setImage(img);
BaiDuVo.GeneralBasic words = BaiDuUtil.accurateBasic(Constant.BaiDu.APP_KEY, Constant.BaiDu.SECRET_KEY, basic); BaiDuVo.GeneralBasic words = BaiDuUtil.accurateBasic(Constant.BaiDu.APP_KEY, Constant.BaiDu.SECRET_KEY, basic);
log.info("文字识别:{}", words); log.info("文字识别:{}", words);
if (words == null || CollectionUtil.isEmpty(words.getWordsResult())) { if (words == null || CollectionUtil.isEmpty(words.getWordsResult())) {
@ -80,7 +107,8 @@ public class OcrService implements IOcrService {
words.getWordsResult().forEach(word -> contents.add(word.getWords())); words.getWordsResult().forEach(word -> contents.add(word.getWords()));
} else { } else {
// 阿里 // 阿里
String body = "{\"img\":\"\",\"url\":\""+generalBasic.getUrl()+"\",\"prob\":false,\"charInfo\":false,\"rotate\":false,\"table\":false}"; // String body = "{\"img\":\"\",\"url\":\""+generalBasic.getUrl()+"\",\"prob\":false,\"charInfo\":false,\"rotate\":false,\"table\":false}";
String body = "{\"img\":\""+img+"\",\"url\":\"\",\"prob\":false,\"charInfo\":false,\"rotate\":false,\"table\":false}";
ApiResponse response = AliInstanceUtil.getGeneralAdvancedHttps().ocrAdvancedSyncMode(body.getBytes()); ApiResponse response = AliInstanceUtil.getGeneralAdvancedHttps().ocrAdvancedSyncMode(body.getBytes());
time4 = System.currentTimeMillis(); time4 = System.currentTimeMillis();
log.info("阿里接口调用:{}", time4 -time3); log.info("阿里接口调用:{}", time4 -time3);

Loading…
Cancel
Save