Tess4J是对Tesseract OCR API.的Java JNA 封装。使java能够通过调用Tess4J的API来使用Tesseract OCR。支持的格式:TIFF,JPEG,GIF,PNG,BMP,JPEG,and PDF
Tesseract 的github地址:https://github.com/tesseract-ocr/tesseract
Tess4J的github地址:https://github.com/nguyenq/tess4j
Tess4J API 提供的功能:
1、直接识别支持的文件
2、识别图片流
3、识别图片的某块区域
4、将识别结果保存为 TEXT/ HOCR/ PDF/ UNLV/ BOX
5、通过设置取词的等级,提取识别出来的文字
6、获得每一个识别区域的具体坐标范围
7、调整倾斜的图片
8、裁剪图片
9、调整图片分辨率
10、从粘贴板获得图像
11、克隆一个图像(目的:创建一份一模一样的图片,与原图在操作修改上,不相 互影响)
12、图片转换为二进制、黑白图像、灰度图像
13、反转图片颜色
demo.java:
/**
* Test of doOCR method, of class Tesseract.
* 根据图片文件进行识别
* @throws Exception while processing image.
*/
@Test
public void testDoOCR_File() throws Exception { logger.info("doOCR on a jpg image"); File imageFile = new File(this.testResourcesDataPath, "ocr.png"); //set language instance.setDatapath(testResourcesLanguagePath); instance.setLanguage("chi_sim"); String result = instance.doOCR(imageFile); logger.info(result); } /** * Test of doOCR method, of class Tesseract. * 根据图片流进行识别 * @throws Exception while processing image. */ @Test public void testDoOCR_BufferedImage() throws Exception { logger.info("doOCR on a buffered image of a PNG"); File imageFile = new File(this.testResourcesDataPath, "ocr.png"); BufferedImage bi = ImageIO.read(imageFile); //set language instance.setDatapath(testResourcesLanguagePath); instance.setLanguage("chi_sim"); String result = instance.doOCR(bi); logger.info(result); } /** * Test of getSegmentedRegions method, of class Tesseract. * 得到每一个划分区域的具体坐标 * @throws java.lang.Exception */ @Test public void testGetSegmentedRegions() throws Exception { logger.info("getSegmentedRegions at given TessPageIteratorLevel"); File imageFile = new File(testResourcesDataPath, "ocr.png"); BufferedImage bi = ImageIO.read(imageFile); int level = TessPageIteratorLevel.RIL_SYMBOL; logger.info("PageIteratorLevel: " + Utils.getConstantName(level, TessPageIteratorLevel.class)); List<Rectangle> result = instance.getSegmentedRegions(bi, level); for (int i = 0; i < result.size(); i++) { Rectangle rect = result.get(i); logger.info(String.format("Box[%d]: x=%d, y=%d, w=%d, h=%d", i, rect.x, rect.y, rect.width, rect.height)); } assertTrue(result.size() > 0); } /** * Test of doOCR method, of class Tesseract. * 根据定义坐标范围进行识别 * @throws Exception while processing image. */ @Test public void testDoOCR_File_Rectangle() throws Exception { logger.info("doOCR on a BMP image with bounding rectangle"); File imageFile = new File(this.testResourcesDataPath, "ocr.png"); //设置语言库 instance.setDatapath(testResourcesLanguagePath); instance.setLanguage("chi_sim"); //划定区域 // x,y是以左上角为原点,width和height是以xy为基础 Rectangle rect = new Rectangle(84, 21, 15, 13); String result = instance.doOCR(imageFile, rect); logger.info(result); } /** * Test of createDocuments method, of class Tesseract. * 存储结果 * @throws java.lang.Exception */ @Test public void testCreateDocuments() throws Exception { logger.info("createDocuments for png"); File imageFile = new File(this.testResourcesDataPath, "ocr.png"); String outputbase = "target/test-classes/docrenderer-2"; List<RenderedFormat> formats = new ArrayList<RenderedFormat>(Arrays.asList(RenderedFormat.HOCR, RenderedFormat.TEXT)); //设置语言库 instance.setDatapath(testResourcesLanguagePath); instance.setLanguage("chi_sim"); instance.createDocuments(new String[]{imageFile.getPath()}, new String[]{outputbase}, formats); } /** * Test of getWords method, of class Tesseract. * 取词方法 * @throws java.lang.Exception */ @Test public void testGetWords() throws Exception { logger.info("getWords"); File imageFile = new File(this.testResourcesDataPath, "ocr.png"); //设置语言库 instance.setDatapath(testResourcesLanguagePath); instance.setLanguage("chi_sim"); //按照每个字取词 int pageIteratorLevel = TessPageIteratorLevel.RIL_SYMBOL; logger.info("PageIteratorLevel: " + Utils.getConstantName(pageIteratorLevel, TessPageIteratorLevel.class)); BufferedImage bi = ImageIO.read(imageFile); List<Word> result = instance.getWords(bi, pageIteratorLevel); //print the complete result for (Word word : result) { logger.info(word.toString()); } } /** * Test of Invalid memory access. * 处理倾斜 * @throws Exception while processing image. */ @Test public void testDoOCR_SkewedImage() throws Exception { //设置语言库 instance.setDatapath(testResourcesLanguagePath); instance.setLanguage("chi_sim"); logger.info("doOCR on a skewed PNG image"); File imageFile = new File(this.testResourcesDataPath, "ocr_skewed.jpg"); BufferedImage bi = ImageIO.read(imageFile); ImageDeskew id = new ImageDeskew(bi); double imageSkewAngle = id.getSkewAngle(); // determine skew angle if ((imageSkewAngle > MINIMUM_DESKEW_THRESHOLD || imageSkewAngle < -(MINIMUM_DESKEW_THRESHOLD))) { bi = ImageHelper.rotateImage(bi, -imageSkewAngle); // deskew image } String result = instance.doOCR(bi); logger.info(result); }
Tess4JDemo码云地址:https://gitee.com/zhaohuihbwj/Tess4JDemo
Java OCR文字识别(Tess4J)
OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。
Tess4J是对google tesseract ocr的java库的一种实现
1.maven添加依赖
<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.2.1</version>
</dependency>
2.工具类编辑 /**
* tesseract for java, ocr(Optical Character Recognition,光学字符识别)
* 工具类
* @author wind
*/
public class Tess4jUtils {
/**
* 从图片中提取文字,默认设置英文字库,使用classpath目录下的训练库
* @param path
* @return
*/
public static String readChar(String path){
// JNA Interface Mapping
ITesseract instance = new Tesseract();
// JNA Direct Mapping
// ITesseract instance = new Tesseract1();
File imageFile = new File(path);
//In case you don't have your own tessdata, let it also be extracted for you
//这样就能使用classpath目录下的训练库了
File tessDataFolder = LoadLibs.extractTessResources("tessdata");
//Set the tessdata path
instance.setDatapath(tessDataFolder.getAbsolutePath());
//英文库识别数字比较准确
instance.setLanguage(Const.ENG);
return getOCRText(instance, imageFile);
}
/**
* 从图片中提取文字
* @param path 图片路径
* @param dataPath 训练库路径
* @param language 语言字库
* @return
*/
public static String readChar(String path, String dataPath, String language){
File imageFile = new File(path);
ITesseract instance = new Tesseract();
instance.setDatapath(dataPath);
//英文库识别数字比较准确
instance.setLanguage(language);
return getOCRText(instance, imageFile);
}
/**
* 识别图片文件中的文字
* @param instance
* @param imageFile
* @return
*/
private static String getOCRText(ITesseract instance, File imageFile){
String result = null;
try {
result = instance.doOCR(imageFile);
} catch (TesseractException e) {
e.printStackTrace();
}
return result;
}
public static void main(String[] args) {
/*String path = "src/main/resources/image/text.png";
System.out.println(readChar(path));*/
String ch = "src/main/resources/image/ch.png";
System.out.println(readChar(ch, "src/main/resources", Const.CHI_SIM));
}
}
注释:中文结果不够准确,需要自己训练字库
具体训练字库,以及完整代码请移步https://github.com/followwwind/javautils