* @param imageFormat

 *            传入的图像格式

 * @return 识别后的字符串

 */

public String recognizeText(File imageFile) throws Exception

{

	/**

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

	 */

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



	StringBuffer strB = new StringBuffer();

	List<String> cmd = new ArrayList<String>();

	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();

	}



}

}


  

输出结果:



![](https://img-blog.csdn.net/20140417211356312?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1qNjIzNTY1Nzkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)  



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



  

  



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



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



![](https://img-blog.csdn.net/20140417212926578?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1qNjIzNTY1Nzkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)  



来张特写:



![](https://img-blog.csdn.net/20140417213024937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1qNjIzNTY1Nzkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)  



一个类,不依赖任何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);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

《507页Android开发相关源码解析》

因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图

知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-ASAhTSrT-1711892061532)]

《960全网最全Android开发笔记》

[外链图片转存中…(img-GeV2NSqE-1711892061532)]

《379页Android开发面试宝典》

[外链图片转存中…(img-1YzNo3mr-1711892061532)]

《507页Android开发相关源码解析》

[外链图片转存中…(img-DJAmkjz7-1711892061533)]

因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

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

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

更多推荐