1. Lógica de implementación
paquete com.vue.demo.service.serviceimpl; import com.vue.demo.service.OCRService; import net.sourceforge.tess4j.Tesseract; importar net.sourceforge.tess4j.TesseractException; importar net.sourceforge.tess4j.util.ImageHelper; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; / ** * @author yangwj * @date 2020/4/1 9:29 * / @Service public class OCRServiceImpl implementa OCRService { Private static Final Logger ocrServiceImplLog = LoggerFactory.getLogger (OCRServiceImpl. class ); String language = "" ; / ** * 方法 一 * @param file * @return * / @Override public String getCharacterFromPic (archivo MultipartFile) { // String modelPath = "D: \\ software \\ ocr-tesseract \\ tessdata"; String modelPath = "/ root / project / java / tesseract_model" ; Tesseract tessreact = new Tesseract (); // Necesidad de especificar el conjunto de entrenamiento conjunto de entrenamiento para https://github.com/tesseract-ocr/tessdata descargar. tessreact.setDatapath (modelPath); if (language.equals ("ch" )) { // Tenga en cuenta que el reconocimiento predeterminado es el inglés, si realiza el reconocimiento chino, debe configurarlo por separado. tessreact.setLanguage ("chi_sim" ); } try { File imageFile = new File (file.getOriginalFilename ()); FileUtils.copyInputStreamToFile (file.getInputStream (), imageFile); Resultado de cadena = tessreact.doOCR (imageFile); ocrServiceImplLog.info (resultado); System.out.println ( "----------------" ); String handleResult = this .ocr (imageFile, modelPath); ocrServiceImplLog.info (handleResult); resultado devuelto + "---------------------------------- \ n \ r" + handleResult; } catch (TesseractException e) { System.err.println (e.getMessage ()); } captura (IOException e) { e.printStackTrace (); } return null ; } @Override public String getLanguage (String language) { if (language == null || language == "" ) { return null ; } this .language = idioma; devolver "éxito" ; } / ** * 方法 二 * @param archivo * @param modelPath * @return * / private String ocr (archivo de archivo, String modelPath) { String result = null ; try { double start = System.currentTimeMillis (); BufferedImage textImage = ImageIO.read (file); // Procesamiento en blanco y negro de la imagen aquí, para mejorar la tasa de reconocimiento. Aquí primero A través de la captura de pantalla, intercepte la parte de la imagen que necesita ser reconocida textImage = ImageHelper.convertImageToGrayscale (textImage); // Image sharpening textImage = ImageHelper.convertImageToBinary (textImage); // Ampliación de imagen, mejora la tasa de reconocimiento (muchas imágenes en sí mismas no pueden ser reconocidas, ampliadas Se puede reconocer fácilmente cuando es 5 veces, pero el problema es que la configuración de la computadora del cliente es baja y la impresora de puntos no imprime continuamente. textImage = ImageHelper.getScaledInstance (textImage, textImage.getWidth () * 1, textImage.getHeight () * 1 ); textImage = ImageHelper.convertImageToBinary (textImage); Cadena saveImgPath = "/ root / project / java / tesseract_model / temp_img" ; // String saveImgPath = "D: \\ software \\ ocr-tesseract \\ img_tem \\ temp.img"; ImageIO.write (textImage, "png", nuevo archivo (saveImgPath)); Instancia Tesseract = nuevo Tesseract (); // 设置 训练 库 的 位置 // String modelPath = "/ root / project / java / tesseract_model"; instance.setDatapath (modelPath); // 中文 识别 instancia.setLanguage ("chi_sim" ); resultado = instancia.doOCR (textImage); doble final = System.currentTimeMillis (); System.out.println ( "耗时" + (fin - inicio) / 1000 + "s" ); } catch (Excepción e) { e.printStackTrace (); } resultado devuelto ; } }
2. Implemente en centos, puede ver este problema