•        传入的图像格式
    
  • @return 识别后的字符串

*/

public String recognizeText(File imageFile) throws Exception

{

/**

  • 设置输出文件的保存的文件目录

*/

File outputFile = new File(imageFile.getParentFile(), “output”);

StringBuffer strB = new StringBuffer();

List cmd = new ArrayList();

if (OS.isWindowsXP())

{

cmd.add(tessPath + “\tesseract”);

} else if (OS.isLinux())

{

cmd.add(“tesseract”);

} else

{

cmd.add(tessPath + “\tesseract”);

}

cmd.add(“”);

cmd.add(outputFile.getName());

cmd.add(LANG_OPTION);

// cmd.add(“chi_sim”);

cmd.add(“eng”);

ProcessBuilder pb = new ProcessBuilder();

/**

*Sets this process builder’s working directory.

*/

pb.directory(imageFile.getParentFile());

cmd.set(1, imageFile.getName());

pb.command(cmd);

pb.redirectErrorStream(true);

Process process = pb.start();

// tesseract.exe 1.jpg 1 -l chi_sim

// Runtime.getRuntime().exec(“tesseract.exe 1.jpg 1 -l chi_sim”);

/**

  • the exit value of the process. By convention, 0 indicates normal

  • termination.

*/

// System.out.println(cmd.toString());

int w = process.waitFor();

if (w == 0)// 0代表正常退出

{

BufferedReader in = new BufferedReader(new InputStreamReader(

new FileInputStream(outputFile.getAbsolutePath() + “.txt”),

“UTF-8”));

String str;

while ((str = in.readLine()) != null)

{

strB.append(str).append(EOL);

}

in.close();

} else

{

String msg;

switch (w)

{

case 1:

msg = “Errors accessing files. There may be spaces in your image’s filename.”;

break;

case 29:

msg = “Cannot recognize the image or its selected region.”;

break;

case 31:

msg = “Unsupported image format.”;

break;

default:

msg = “Errors occurred.”;

}

throw new RuntimeException(msg);

}

new File(outputFile.getAbsolutePath() + “.txt”).delete();

return strB.toString().replaceAll(“\s*”, “”);

}

}

代码很简单,中间那部分ProcessBuilder其实就类似Runtime.getRuntime().exec(“tesseract.exe 1.jpg 1 -l chi_sim”),大家不习惯的可以使用Runtime。

测试代码:

package com.zhy.test;

import java.io.File;

public class Test

{

public static void main(String[] args)

{

try

{

File testDataDir = new File(“testdata”);

System.out.println(testDataDir.listFiles().length);

int i = 0 ;

for(File file :testDataDir.listFiles())

{

i++ ;

String recognizeText = new OCRHelper().recognizeText(file);

System.out.print(recognizeText+“\t”);

if( i % 5 == 0 )

{

System.out.println();

}

}

} catch (Exception e)

{

e.printStackTrace();

}

}

}

输出结果:

对比第一张图片,是不是很完美~哈哈 ,当然了如果你只需要实现验证码的读写,那么上面就足够了。下面继续普及图像处理的知识。

-------------------------------------------------------------------我的分割线--------------------------------------------------------------------

当然了,有时候图片被扭曲或者模糊的很厉害,很不容易识别,所以下面我给大家介绍一个去噪的辅助类,绝对碉堡了,先看下效果图。

来张特写:

一个类,不依赖任何jar,把图像中的干扰线消灭了,是不是很给力,然后再拿这样的图片去识别,会不会效果更好呢,嘿嘿,大家自己实验~

代码:

package com.zhy.test;

import java.awt.Color;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

public class ClearImageHelper

{

public static void main(String[] args) throws IOException

{

File testDataDir = new File(“testdata”);

final String destDir = testDataDir.getAbsolutePath()+“/tmp”;

for (File file : testDataDir.listFiles())

{

cleanImage(file, destDir);

}

}

/**

  • @param sfile

  •        需要去噪的图像
    
  • @param destDir

  •        去噪后的图像保存地址
    
  • @throws IOException

*/

public static void cleanImage(File sfile, String destDir)

throws IOException

{

File destF = new File(destDir);

if (!destF.exists())

{

destF.mkdirs();

}

BufferedImage bufferedImage = ImageIO.read(sfile);

int h = bufferedImage.getHeight();

int w = bufferedImage.getWidth();

// 灰度化

int[][] gray = new int[w][h];

for (int x = 0; x < w; x++)

{

for (int y = 0; y < h; y++)

{

int argb = bufferedImage.getRGB(x, y);

// 图像加亮(调整亮度识别率非常高)

int r = (int) (((argb >> 16) & 0xFF) * 1.1 + 30);

int g = (int) (((argb >> 8) & 0xFF) * 1.1 + 30);

int b = (int) (((argb >> 0) & 0xFF) * 1.1 + 30);

if (r >= 255)

{

r = 255;

}

if (g >= 255)

{

g = 255;

}

if (b >= 255)

{

b = 255;

}

gray[x][y] = (int) Math

.pow((Math.pow(r, 2.2) * 0.2973 + Math.pow(g, 2.2)

  • 0.6274 + Math.pow(b, 2.2) * 0.0753), 1 / 2.2);

}

}

// 二值化

int threshold = ostu(gray, w, h);

BufferedImage binaryBufferedImage = new BufferedImage(w, h,

BufferedImage.TYPE_BYTE_BINARY);

for (int x = 0; x < w; x++)

{

for (int y = 0; y < h; y++)

{

if (gray[x][y] > threshold)

{

gray[x][y] |= 0x00FFFF;

} else

{

gray[x][y] &= 0xFF0000;

}

binaryBufferedImage.setRGB(x, y, gray[x][y]);

}

}

// 矩阵打印

for (int y = 0; y < h; y++)

{

for (int x = 0; x < w; x++)

{

if (isBlack(binaryBufferedImage.getRGB(x, y)))

{

System.out.print(“*”);

} else

{

System.out.print(" ");

}

}

System.out.println();

}

ImageIO.write(binaryBufferedImage, “jpg”, new File(destDir, sfile

.getName()));

}

public static boolean isBlack(int colorInt)

{

Color color = new Color(colorInt);

if (color.getRed() + color.getGreen() + color.getBlue() <= 300)

{

return true;

}

return false;

}

public static boolean isWhite(int colorInt)

{

Color color = new Color(colorInt);

if (color.getRed() + color.getGreen() + color.getBlue() > 300)

{

return true;

}

return false;

}

public static int isBlackOrWhite(int colorInt)

{

if (getColorBright(colorInt) < 30 || getColorBright(colorInt) > 730)

{

return 1;

}

return 0;

}

public static int getColorBright(int colorInt)

{

Color color = new Color(colorInt);

return color.getRed() + color.getGreen() + color.getBlue();

}

public static int ostu(int[][] gray, int w, int h)

{

int[] histData = new int[w * h];

// Calculate histogram

for (int x = 0; x < w; x++)

{

for (int y = 0; y < h; y++)

{

int red = 0xFF & gray[x][y];

histData[red]++;

}

}

// Total number of pixels

int total = w * h;

float sum = 0;

for (int t = 0; t < 256; t++)

2021年Java中高级面试必备知识点总结

在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。

本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。

目录:

(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)

部分内容:

对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。

不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注
在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。

本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。

目录:

[外链图片转存中…(img-qc836tys-1718809269413)]

(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)

[外链图片转存中…(img-mQrzDGgr-1718809269414)]

部分内容:

[外链图片转存中…(img-gZSZCEAz-1718809269415)]

[外链图片转存中…(img-nCwO2fOB-1718809269415)]

[外链图片转存中…(img-dAHyfTkV-1718809269416)]

对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。

不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注

GitHub 加速计划 / te / tesseract
11
3
下载
tesseract-ocr/tesseract: 是一个开源的光学字符识别(OCR)引擎,适用于从图像中提取和识别文本。特点是可以识别多种语言,具有较高的识别准确率,并且支持命令行和API调用。
最近提交(Master分支:3 个月前 )
bc490ea7 Don't check for a directory, because a symbolic link is also allowed. Signed-off-by: Stefan Weil <sw@weilnetz.de> 5 个月前
2991d36a - 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐