`
dengminhui
  • 浏览: 167939 次
  • 来自: ...
社区版块
存档分类
最新评论

使用tesseract破解checkCode

阅读更多

tesseract是一个非常强大的图片识别工具,有较大的几率将图片中的字符抓取出来,在对付验证码上,有较好的效果。使用批处理命令结合这个工具,我们就可以再程序中破解得到我们想要的图片了。

 

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;

public class OCRUtil {

	private static final Log logger = LogFactory.getLog(OCRUtil.class);
	private static final String LANG_OPTION = "-l";
	private static final String EOL = File.separator;
	private static final String IMAGE_FORMAT = "jpg";

	public static String recognizeValidation(InputStream in) throws Exception {
		File tmpFile = File.createTempFile("img", "." + IMAGE_FORMAT);
		OutputStream out = new FileOutputStream(tmpFile);

		IOUtils.copy(in, out);
		IOUtils.closeQuietly(out);
		return format(recognizeText(tmpFile, IMAGE_FORMAT));
	}

	private static String format(String str) {
		if (StringUtils.isBlank(str)) {
			return null;
		}
		StringBuffer sb = new StringBuffer(str.length());
		for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			if (Character.isDigit(c) || Character.isLetter(c)) {
				sb.append(c);
			}
		}
		return sb.toString();
	}

	public static String recognizeText(File imageFile, String imageFormat)
			throws Exception {
		File tempImage = createImage(imageFile, imageFormat);

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

		List<String> cmd = new ArrayList<String>();
		cmd.add(SystemUtil.getUserDir() + "tesseract/tesseract.exe");
		cmd.add("");
		cmd.add(outputFile.getName());
		cmd.add(LANG_OPTION);
		cmd.add("eng");

		ProcessBuilder pb = new ProcessBuilder();
		pb.directory(imageFile.getParentFile());

		cmd.set(1, tempImage.getName());
		pb.command(cmd);
		pb.redirectErrorStream(true);
		Process process = pb.start();

		int w = process.waitFor();

		// delete temp working files
		tempImage.delete();

		if (w == 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.";
			}
			tempImage.delete();
			throw new RuntimeException(msg);
		}

		new File(outputFile.getAbsolutePath() + ".txt").delete();
		// logger.info("图像识别结果:" + strB);
		return strB.toString();
	}

	public static File createImage(File imageFile, String imageFormat) {
		File tempFile = null;
		try {
			Iterator<ImageReader> readers = ImageIO
					.getImageReadersByFormatName(imageFormat);
			ImageReader reader = readers.next();

			ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
			reader.setInput(iis);
			// Read the stream metadata
			IIOMetadata streamMetadata = reader.getStreamMetadata();

			// Set up the writeParam
			TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(
					Locale.US);
			tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);

			// Get tif writer and set output to file
			Iterator<ImageWriter> writers = ImageIO
					.getImageWritersByFormatName("tiff");
			ImageWriter writer = writers.next();

			BufferedImage bi = reader.read(0);
			// bi = new ImageFilter(bi).changeGrey();
			IIOImage image = new IIOImage(bi, null, reader.getImageMetadata(0));
			tempFile = tempImageFile(imageFile);
			ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);
			writer.setOutput(ios);
			writer.write(streamMetadata, image, tiffWriteParam);
			ios.close();

			writer.dispose();
			reader.dispose();
		} catch (Exception exc) {
			logger.error("异常:", exc);
		}
		return tempFile;
	}

	private static File tempImageFile(File imageFile) {
		String path = imageFile.getPath();
		StringBuffer strB = new StringBuffer(path);
		strB.insert(path.lastIndexOf('.'), 0);
		return new File(strB.toString().replaceFirst("(?<=\\.)(\\w+)$", "tif"));
	}

	public static void main(String[] args) throws Exception {
		 String maybe = recognizeValidation(new	URL("http://passport.360buy.com/ImageVerifier.axd?uid=c360a45f-02b2-4255-8f2e-61191bfc3866").openStream());
		 String maybe2 = new OCRUtil().recognizeText(new  File("c:/1.jpg"), "jpg");
		 System.out.println(maybe2);
	}
}
 

工具见附件。

 

 

分享到:
评论
9 楼 xusong_zidingyi 2012-08-21  
如果在linux下面的话就没有办法运行了,因为linux没有办法运行.exe文件 
8 楼 javajava22 2011-09-10  
Errors accessing files. There may be spaces in your image's filename

老是抛这个错误
7 楼 suncathay 2011-06-23  
qljobs 写道
cmd.add("E:/Workspaces/MyEclipse/web_ocr/tesseract/tesseract.exe");我直接 写的绝对路径,咋个都还报错呢,谢谢!java.lang.RuntimeException: Errors accessing files. There may be spaces in your image's filename.

我也报这个错误
6 楼 zuoxu128 2011-03-02  
TIFFImageWriteParam ,这个类是哪个包的啊
5 楼 qljobs 2010-12-02  
cmd.add("E:/Workspaces/MyEclipse/web_ocr/tesseract/tesseract.exe");我直接 写的绝对路径,咋个都还报错呢,谢谢!java.lang.RuntimeException: Errors accessing files. There may be spaces in your image's filename.
4 楼 herryhaixiao 2010-06-17  
com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam
这个包能提供下么?
3 楼 dengminhui 2010-01-28  
你好,这段代码本身依赖到另外一个类SystemUtil,是我的疏忽
cmd.add(SystemUtil.getUserDir() + "tesseract/tesseract.exe"); 
这句代码只是要找到这个exe执行文件的位置,其中SystemUtil.getUserDir()就是返回的目录,很容易的,如果我把SystemUtil贴出来就又要依赖别的类了,同学你试的时候按照本地的目录写死即可
2 楼 362217990 2010-01-27  
SystemUtil.getUserDir()  这个方法不存在
1 楼 362217990 2010-01-27  
严重: 异常:
java.lang.NullPointerException
at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:309)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.getStreamMetadata(JPEGImageReader.java:886)
at OCRUtil.createImage(OCRUtil.java:133)
at OCRUtil.recognizeText(OCRUtil.java:62)
at OCRUtil.main(OCRUtil.java:172)
java.lang.NullPointerException
at OCRUtil.recognizeText(OCRUtil.java:78)
at OCRUtil.main(OCRUtil.java:172)

怎么回事

相关推荐

    VC++2010下使用Tesseract需添加的dll

    在VC++2010环境下使用Tesseract OCR(光学字符识别)引擎时,开发者需要确保正确地集成和配置了相关的动态链接库(DLL)。Tesseract是一个开源的OCR引擎,最初由HP开发,后来由Google维护,它能识别图像中的文本并将...

    opencv+tesseract+QT实践篇.docx

    下面将详细介绍如何使用 OpenCV、Tesseract 和 Qt 实践篇实现文本识别。 一、配置环境 在开始之前,需要配置好环境。环境配置包括安装 OpenCV、Tesseract 和 Qt。安装完成后,需要将环境变量添加到系统中。 二、...

    Java使用Tesseract4.0训练字库并且识别训练后的图片

    java文件使用:使用Tesseract方法可通过pom方式和jar包方式; 注意:使用前先查看“训练步骤”的那个文档,里面有详细说明,一定要查看;重要!!! 注意:使用前先查看“训练步骤”的那个文档,里面有详细说明,...

    使用tesseract-ocr破解验证码详解.rar

    使用tesseract-ocr破解验证码详解.rar

    C#Tesseract.3.0.2.0 完整实例以及训练教程

    在这个实例中,你将学习如何在C#环境中集成和使用Tesseract进行文字识别。 验证码识别是网络安全中的一个重要环节,用于防止自动化的机器人程序。Tesseract虽然主要设计为识别印刷文本,但也可以用于验证码识别,...

    使用tesseract-ocr破解验证码详解.pdf

    在本教程中,我们将详细介绍如何在Windows环境下安装和使用Tesseract OCR来破解验证码。 首先,我们需要下载并安装Tesseract OCR。你可以访问官方网站或者通过第三方资源获取安装包。这里我们以`tesseract-ocr-...

    Tesseract-OCR识别(.NET)

    首先,要使用Tesseract OCR,你需要在你的项目中引入Tesseract库。在.NET环境中,这通常通过NuGet包管理器完成,安装“Tesseract OCR”或者“Tesseract”包。确保你的项目支持.NET Framework 4.5或更高版本,因为这...

    TesseractOCR 训练集

    训练数据的使用方法通常是将这些数据文件放置在Tesseract OCR的data目录下,或者通过环境变量指定路径。当Tesseract运行时,它会自动加载对应的语言数据进行识别。用户可以通过设置`--tessdata-dir`参数来指定训练...

    c#组件图像识别tesseract组件源码及使用教程

    **C#组件图像识别Tesseract组件源码及使用教程** Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,最初由HP开发,后来由Google维护并持续升级。在C#环境中,我们可以利用Tesseract...

    Tesseract中文简体语言包4.00

    4. **命令行使用**:在命令行界面,可以使用`tesseract`命令配合`-l`选项指定语言来识别中文文本。例如,如果要识别一个名为"image.jpg"的图像中的中文,命令将是`tesseract image.jpg output -l chi_sim`,这会将...

    c#实现基于tesseract的ocr识别

    本教程将详细讲解如何使用C#语言结合Tesseract OCR库来实现这一功能,特别是在二值化图片处理方面,以提高识别效果。 Tesseract OCR是一个开源的OCR引擎,最初由HP开发,后来被Google维护。它具有强大的文字识别...

    C#调用Tesseract3.0.2识别验证码所需要的组件

    5. **执行识别**:使用Tesseract的API来识别图像中的文本,如`tesseract.Process(image)`,然后获取识别结果。 6. **处理结果**:识别后的文本通常会包含一些噪声,如额外的空格、错误的字符等,你可能需要进行后...

    C# TesseractOCR识别身份证号

    首先,我们需要引入Tesseract OCR的C#接口,通常我们会使用一个名为`Tesseract`的NuGet包,它是Tesseract OCR的.NET包装器。安装这个包后,我们可以在项目中导入`Tesseract`命名空间。 在`Program.cs`或`OCRTest01....

    Tesseract-OCR.zip 图片文字识别 无需安装,直接解压即可

    2. **命令行使用**:在命令行中,你可以使用`tesseract`命令配合参数进行识别,例如`tesseract image.png output.txt`将图片`image.png`的文字识别到`output.txt`中。 3. **图形界面工具**:对于不熟悉命令行的用户...

    tesseract中文简体字库

    “chi_sim”代表“Chinese Simplified”,即简体中文,而“.traineddata”是Tesseract使用的特定格式的数据文件,它包含了字符的形状、结构和上下文信息,这些信息是通过机器学习算法训练得到的,用于提高识别准确率...

    Tesseract4.0+VS2015+WIN10 C++ debug和release

    在本文中,我们将深入探讨如何在Windows 10操作系统中,使用Visual Studio 2015(VS2015)编译Tesseract 4.0 OCR引擎的Debug和Release版本。Tesseract是一个开源的OCR(光学字符识别)工具,能够识别图像中的文本并...

    tesseract图片识别工具及使用说明

    **Tesseract图片识别工具及其使用说明** Tesseract是一款开源的OCR(Optical Character Recognition,光学字符识别)引擎,由HP公司开发,后被Google维护。它能够从图像中识别出文本,广泛应用于文档扫描、自动数据...

    Tesseract离线安装包(leptonica+tesseract+中英文训练包)

    在本包中,包含了中英文的训练数据,这意味着用户可以直接使用Tesseract来识别这两种语言的文本。训练数据文件通常以`.traineddata`为扩展名,每个文件对应一种语言或特定的字符集。例如,中文可能有`chi_sim....

    tesseract tesseract-3.04.00

    4. **自定义训练**:如果需要识别特殊字体或提高特定领域的识别效果,可以使用Tesseract的训练工具创建自己的数据集和语言模型。 **与其他版本的区别** Tesseract 3.04.00相较于更早的版本,主要改进了识别性能,...

Global site tag (gtag.js) - Google Analytics