识别图片验证码必备--Linux内网环境安装Tesseract

        上期有关爬虫的文章中,验证码识别用到了Tesseract,笔者生产环境使用系统是GNU/Linux,网络不能连公网。这样在安装tesseract时就带来一些麻烦。验证码识别的过程,其实是调用系统命令去解析图片内容,如果把它做成服务,那任何人都可以使用了。

 

**Tesseract安装步骤如下:**

  • 操作用户使用root
  • 检查包依赖

需要逐个检查这些包是否已经在linux中安装

autoconf automake libtool libjpeg libpng libtiff zlib libjpeg-devel libpng-devel libtiff-devel zlib-devel

##检测是否安装
rpm -qa |grep autoconf
  • 独立下载rpm包到本地

查询常用rpm包地址:http://rpmfind.net/linux/rpm2html/search.php?query=rpm

下载到本地并上传到服务器

  • 安装依赖组件leptonica
tar -zxvf leptonica-*.tar.gz
#进入目录:
./configure
make 
make install
  • 安装tesseract
./autogen.sh
./configure
make 
make install
ldconfig
  • 一切就绪后拷贝训练数据
cp chi_sim.traineddata /usr/local/share/tessdata/
cp eng.traineddata /usr/local/share/tessdata/
cp eng.traineddata.part /usr/local/share/tessdata/
  • 测试
#tesseract安装目录
cd ./testing
#上传一张图片到该目录,指定语言为英文,指定输出文件为result
tesseract validcode.jpg result -l eng
#查看识别结果
cat result
  • trubleShooting

如果测试结果不成功,可能的原因时依赖包缺失,可以再次安装。

也可能时图片质量问题,测试图片需要提前处理为纯色的文字,去掉杂色,只留下黑白。

public BufferedImage removeBackgroud(String picFile) throws Exception {
		BufferedImage img = ImageIO.read(new File(picFile));
		int width = img.getWidth();
		int height = img.getHeight();
		int x = 0;
		while (x < width) {
			int y = 0;
			while (y < height) {
				if (this.isWhite(img.getRGB(x, y)) == 1 || img.getRGB(x, y) == Color.GRAY.getRGB()) {
					img.setRGB(x, y, Color.WHITE.getRGB());
				} else {
					img.setRGB(x, y, Color.BLACK.getRGB());
				}
				++y;
			}
			++x;
		}
		return img;
	}
  • 代码识别服务
public String recPic(File imageFile) throws Exception {
		BufferedReader in;
		File outputFile = new File(imageFile.getParentFile(), "output-"+ System.nanoTime());
		StringBuffer strB = new StringBuffer();
		ArrayList<String> cmd = new ArrayList<String>();
		cmd.add("tesseract");
		cmd.add("");
		cmd.add(outputFile.getName());
		cmd.add("-l");
		cmd.add("eng");
		ProcessBuilder pb = new ProcessBuilder(new String[0]);
		pb.directory(imageFile.getParentFile());
		cmd.set(1, imageFile.getName());//设置参数
		pb.command(cmd);//linux下执行系统调用
		pb.redirectErrorStream(true);
		Process process = pb.start();
		int w = process.waitFor();//等待执行结果
		if (w == 0) {
			String str="";
			in = new BufferedReader(new InputStreamReader(
					(InputStream) new FileInputStream(String.valueOf(outputFile.getAbsolutePath()) + ".txt"), "UTF-8"));
			while ((str = in.readLine()) != null) {
				strB.append(str).append(this.EOL);//读取结果
			}
		} else {
			throw new RuntimeException("识别异常");
		}
		in.close();
		return strB.toString();
	}
  • 提高识别成功率

使用默认的训练数据识别成功率可能不会太高,可以反复识别来提高识别成功率。

高级点的做法是使用测试图片,大量训练自己的traindata,并上传到服务器,以提高实际的识别成功率。

Tesseract OCR是一款开源的文字识别引擎,常用于从图像、扫描件中提取文本内容。在Linux安装Tesseract OCR通常包括下载并配置软件包。以下是简要步骤: 1. **更新包列表**: ```sh sudo apt-get update ``` 2. **安装依赖**: 对于Ubuntu或Debian系列,你需要`libtesseract-dev`和`leptonica`库: ```sh sudo apt-get install libtesseract-dev leptonica ``` 如果你使用的是基于RPM的发行版如Fedora或CentOS,可以用`dnf`代替`apt-get`: ```sh sudo dnf install tesseract-devel leptonica ``` 3. **下载Tesseract源码** (如果需要最新版本): - 访问Tesseract GitHub页面(https://github.com/tesseract-ocr/tesseract),找到最新版本的zip文件或tarball。 - 将下载的文件解压到一个目录,例如 `/usr/local/src/tesseract`。 4. **编译安装**: - 进入解压后的目录: ```sh cd /usr/local/src/tesseract ``` - 配置并编译: ```sh ./configure make ``` - 安装Tesseract: ```sh sudo make install ``` 5. **添加路径**: 将Tesseract的bin目录添加到环境变量PATH中,以便系统能全局访问它: ```sh echo "export PATH=/usr/local/bin:$PATH" >> ~/.bashrc source ~/.bashrc ``` 6. **初始化语言数据** (如果你需要识别特定的语言): ```sh sudo tesseract --list-langs tessdata_dir_config=$(tesseract --print-dir) wget https://github.com/tesseract-ocr/tessdata_best/releases/download/<version>/<language>.traineddata -P $tessdata_dir_config ``` `<version>`应替换为你所安装Tesseract版本,`<language>`是你想要识别的语言代码(如`eng`代表英文)。 完成上述步骤后,你应该就可以使用Tesseract命令行工具了。你可以通过`tesseract input_image output_text`这样的命令来识别图像中的文字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值