Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java验证码识别--1

java验证码识别--1

作者头像
井九
发布于 2024-10-12 00:04:23
发布于 2024-10-12 00:04:23
1510
举报
文章被收录于专栏:四楼没电梯四楼没电梯

java验证码识别--1

http://blog.csdn.net/problc/article/details/5794460

java验证码识别--2

http://blog.csdn.net/problc/article/details/5797507

java验证码识别--3

http://blog.csdn.net/problc/article/details/5800093

java验证码识别--4

http://blog.csdn.net/problc/article/details/5846614

java验证码识别--5

http://blog.csdn.net/problc/article/details/5983276

如何识别高级的验证码-粘连等

http://blog.csdn.net/problc/article/details/22796609

常见验证码的弱点与验证码识别

http://blog.csdn.net/problc/article/details/22796971

(本文仅用于学习研究图像匹配识别原理,不得用于其他用途。)

完整eclipse工程http://download.csdn.net/detail/problc/3829004

最近看了看验证码的识别,先从最简单的做起吧(固定大小,固定位置,固定字体)

验证码识别基本分四步,图片预处理,分割,训练,识别

看一个最简单验证码

这是一个德克萨斯扑克的注册页面的验证码

1。图像的预处理

这种直接根据亮度设个阈值处理就可以了

代码语言:txt
AI代码解释
复制
public static int isWhite(int colorInt) {
		Color color = new Color(colorInt);
		if (color.getRed() + color.getGreen() + color.getBlue() > 100) {
			return 1;
		}
		return 0;
	}

	public static BufferedImage removeBackgroud(String picFile)
			throws Exception {
		BufferedImage img = ImageIO.read(new File(picFile));
		int width = img.getWidth();
		int height = img.getHeight();
		for (int x = 0; x < width; ++x) {
			for (int y = 0; y < height; ++y) {
				if (isWhite(img.getRGB(x, y)) == 1) {
					img.setRGB(x, y, Color.WHITE.getRGB());
				} else {
					img.setRGB(x, y, Color.BLACK.getRGB());
				}
			}
		}
		return img;
	}

处理完图片效果为

图像基本分得比较清楚,图片分割也比较容易

2。分割

这个验证码居然是固定位置的,分割相当简单,直接截取相应位置就可以了

代码语言:txt
AI代码解释
复制
public static List<BufferedImage> splitImage(BufferedImage img)
			throws Exception {
		List<BufferedImage> subImgs = new ArrayList<BufferedImage>();
		subImgs.add(img.getSubimage(10, 6, 8, 10));
		subImgs.add(img.getSubimage(19, 6, 8, 10));
		subImgs.add(img.getSubimage(28, 6, 8, 10));
		subImgs.add(img.getSubimage(37, 6, 8, 10));
		return subImgs;
	}

3。训练

直接拿几张图片,包含0-9,每个数字一个样本就可以了,将文件名对应相应的数字

4。识别

因为是固定大小,固定位置,识别也很简单。

直接拿分割的图片跟这个十个图片一个像素一个像素的比,相同的点最多的就是结果。比如如果跟5.jpg最相似,那么识别的结果就是5。

下面是识别结果,很容易达到100%

完整代码(csdn连个附件都不支持):

代码语言:txt
AI代码解释
复制
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.io.IOUtils;

public class ImagePreProcess {

	public static int isWhite(int colorInt) {
		Color color = new Color(colorInt);
		if (color.getRed() + color.getGreen() + color.getBlue() > 100) {
			return 1;
		}
		return 0;
	}

	public static int isBlack(int colorInt) {
		Color color = new Color(colorInt);
		if (color.getRed() + color.getGreen() + color.getBlue() <= 100) {
			return 1;
		}
		return 0;
	}

	public static BufferedImage removeBackgroud(String picFile)
			throws Exception {
		BufferedImage img = ImageIO.read(new File(picFile));
		int width = img.getWidth();
		int height = img.getHeight();
		for (int x = 0; x < width; ++x) {
			for (int y = 0; y < height; ++y) {
				if (isWhite(img.getRGB(x, y)) == 1) {
					img.setRGB(x, y, Color.WHITE.getRGB());
				} else {
					img.setRGB(x, y, Color.BLACK.getRGB());
				}
			}
		}
		return img;
	}

	public static List<BufferedImage> splitImage(BufferedImage img)
			throws Exception {
		List<BufferedImage> subImgs = new ArrayList<BufferedImage>();
		subImgs.add(img.getSubimage(10, 6, 8, 10));
		subImgs.add(img.getSubimage(19, 6, 8, 10));
		subImgs.add(img.getSubimage(28, 6, 8, 10));
		subImgs.add(img.getSubimage(37, 6, 8, 10));
		return subImgs;
	}

	public static Map<BufferedImage, String> loadTrainData() throws Exception {
		Map<BufferedImage, String> map  new HashMap<BufferedImage, String>();
		File dir = new File("train");
		File[] files = dir.listFiles();
		for (File file : files) {
			map.put(ImageIO.read(file), file.getName().charAt(0) + "");
		}
		return map;
	}

	public static String getSingleCharOcr(BufferedImage img,
			Map<BufferedImage, String> map) {
		String result = "";
		int width = img.getWidth();
		int height = img.getHeight();
		int min = width * height;
		for (BufferedImage bi : map.keySet()) {
			int count = 0;
			Label1: for (int x = 0; x < width; ++x) {
				for (int y = 0; y < height; ++y) {
					if (isWhite(img.getRGB(x, y)) != isWhite(bi.getRGB(x, y))) {
						count++;
						if (count >= min)
							break Label1;
					}
				}
			}
			if (count < min) {
				min = count;
				result = map.get(bi);
			}
		}
		return result;
	}

	public static String getAllOcr(String file) throws Exception {
		BufferedImage img = removeBackgroud(file);
		List<BufferedImage> listImg = splitImage(img);
		Map<BufferedImage, String> map = loadTrainData();
		String result = "";
		for (BufferedImage bi : listImg) {
			result += getSingleCharOcr(bi, map);
		}
		ImageIO.write(img, "JPG", new File("result//"+result+".jpg"));
		return result;
	}

	public static void downloadImage() {
		HttpClient httpClient = new HttpClient();
		GetMethod getMethod = new GetMethod(
				"http://www.puke888.com/authimg.php");
		for (int i = 0; i < 30; i++) {
			try {
				// 执行getMethod
				int statusCode = httpClient.executeMethod(getMethod);
				if (statusCode != HttpStatus.SC_OK) {
					System.err.println("Method failed: "
							+ getMethod.getStatusLine());
				}
				// 读取内容
				String picName = "img//" + i + ".jpg";
				InputStream inputStream = getMethod.getResponseBodyAsStream();
				OutputStream outStream = new FileOutputStream(picName);
				IOUtils.copy(inputStream, outStream);
				outStream.close();
				System.out.println("OK!");
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				// 释放连接
				getMethod.releaseConnection();
			}
		}
	}

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		for (int i = 0; i < 30; ++i) {
			String text = getAllOcr("img//" + i + ".jpg");
			System.out.println(i + ".jpg = " + text);
		}
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java验证码识别--4
http://blog.csdn.net/problc/article/details/5794460
井九
2024/10/12
930
java验证码识别--4
java验证码识别--2
http://blog.csdn.net/problc/article/details/5794460
井九
2024/10/12
1120
java验证码识别--2
简单验证码识别实现
新学考成绩释放在即,故更新一下之前写的查询。这半年终于把原来的验证码存在Cookie里改成了session。那么还是来看看这个验证码吧:
KAAAsS
2022/01/14
1.3K0
简单验证码识别实现
利用深度学习实现验证码识别-2-使用Python导出ONNX模型并在Java中调用实现验证码识别
首先,我们需要在Python中定义并导出一个已经训练好的验证码识别模型。以下是完整的Python代码:
井九
2024/10/12
2510
利用深度学习实现验证码识别-2-使用Python导出ONNX模型并在Java中调用实现验证码识别
java tess4j mave_图片处理,Tess4j读取验证码、识别文字
https://tesseract-ocr.github.io/tessdoc/Home.html
全栈程序员站长
2022/09/05
1.2K0
Java生成、解析二维码
目标:借助Google提供的ZXing Core工具包,使用Java语言实现二维码的生成和解析。
Java团长
2018/08/06
1.1K0
SpringMVC下获取验证码
先说说登录验证码的一些个人意见. 用户一开始登录的时候, 不建议出现验证码, 这一点在很多网站上已经体现的很好了, 只有当用户连续输错三次或者以上才会要求用户输入验证码. 记录用户输错次数最好不要使用 session 来记录, 因为 session 是跟客户端浏览器会话有关的, 如果用重启浏览器或者换新的浏览器再来登录或者试错, 就是新的回话了, 原来记录的错误次数就失效了. 建议此处采用缓存机制来实现, 简单处理就是采用 Map<用户登录id, 错误次数> 来实现, 如果有多台服务器负载的话, 就需要采用
zcqshine
2018/05/11
1.8K0
Java中使用图片验证码
第一种方式 @WebServlet("/BufferImage") public class BufferImage extends HttpServlet { public static final int WIDTH = 120;//生成图片的宽度 public static final int HEIGHT = 30;//生成图片的高度 public static final int WORDS_NUMBER = 4;//验证码中字符的个数 @Override
崔笑颜
2020/06/08
8000
java工具类——验证码(VerifyCode)[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159571.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
2.1K0
Java能写外挂吗?那就写个跳一跳辅助程序吧
##起初是想使用按键精灵脚本程序控制,但还是选择熟悉的java。我这里使用了工具,造成延迟问题。也求教:java控制安卓的正确姿势,
三哥
2018/07/31
7.3K0
Java能写外挂吗?那就写个跳一跳辅助程序吧
CG008收费软件库Asprise ocr库识别图片验证码
直接上源码,这是一个收费的且不开源的库,测试效果也不太理想 亲测效果: 对于相同字体。非倾斜的,比如http://dz.bjjtgl.gov.cn/service/checkCode.do,识别率还是挺高的; 对于斜体或者其他变异的,如下代码识别率就很低了,可能需要调整识别引擎的参数了,大家自己查找测试下。 这个测试版本的,会有弹出对话框 框框~~ package com.example; import java.awt.image.BufferedImage; import java.io.File;
上善若水.夏
2018/09/28
1.7K0
使用keras破解验证码
今天做一个业务功能时,需要自动登录第三方系统,虽然第三方系统已经给我方分配了用户名及密码,但登录时必须必须输入验证码,如此就很难做到自动化登录了。因为前一段时间研究过机器学习,觉得可以使用keras, tensorflow之类的深度学习框架解决验证码识别的问题。 生成训练数据 机器学习一般都需要比较多的训练数据,怎么得到训练数据呢?主要有以下方法: 1. 手动(累死人系列) 2. 破解验证码生成机制,自动生成无限多的训练数据 3. 打入敌人内部(卧底+不要脸+不要命+多大仇系列) 第1个方法太耗人力,当然依
jeremyxu
2018/05/10
2.1K0
如何在线生成二维码?
一、介绍 说到二维码,我相信大家每天都会用到,尤其是在手机支付的场景,使用频率极广。 实际上二维码在1994年的时候就已经诞生了,由 Denso 公司研制而成,只是那个时候使用范围还不是很大。 早期的二维码由于很容易通过技术方式进行伪造,因此很少有企业愿意去使用他,随着技术的不断迭代和更新,二维码的安全性更进一步得到了提升,从而使得更多的企业愿意使用这项新技术,例如当下的移动支付,还有微信互推,扫码出行等等,极大的方便了网民们的购物、社交和出行! 在实际的业务开发过程中,二维码的使用场景开发也会经常出现在我们开发人员的面前,我们应该如何去处理呢,今天小编就带着大家一起深入的了解一下它的技术实现过程。 二、代码实践 在 Java 生态体系里面,操作二维码的开源项目很多,如 SwetakeQRCode、BarCode4j、Zxing 等等。 今天我们介绍下简单易用的 google 公司的 zxing,zxing 不仅使用方便,而且可以还操作条形码或者二维码等,不仅有 java 版本,还有 Android 版。 开源库地址:
Java极客技术
2022/12/02
1.3K0
如何在线生成二维码?
Java如何制作图片输入验证码
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。 防止恶意破解密码、刷票、论坛灌水、刷页。
GeekLiHua
2025/01/21
1670
Java如何制作图片输入验证码
java之实现图片二值化
闲着没事突然看到一博客实现的图片二值化 觉得intresting 就写了个玩玩,所谓二值化 就是彩色照片变成黑白吧。。 图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果 具体代码实现:
周杰伦本人
2023/10/12
3630
java之实现图片二值化
验证码
验证码,就是后端随机生成的一串字符串,然后拼接成一个图片,返回给前端的一个过程。怎么生成一串随机的字符串,怎么创建一个图片?
微醺
2019/01/17
1.9K0
java验证工具_「verifycode」java工具类——验证码(VerifyCode) – seo实验室
public class VerifyCode {private int w = 70;
全栈程序员站长
2022/09/14
7060
java验证码识别--5
http://blog.csdn.net/problc/article/details/5794460
井九
2024/10/12
1260
java验证码识别--5
Java代码片段之生成验证码
今天给大家分享一个Java生成前台验证码的代码片段,有需要的同学们记得收藏哦!话不多说直接上代码:
Java编程指南
2019/08/02
9290
java中验证码的使用
//验证码 public String execute()throws Exception{ //生成验证码 String code = SecurityCode.getSecurityCode(); ServletActionContext.getRequest().getSession().setAttribute(“code”,code); //生成图片 BufferedImage image = SecurityImage.createImage(code); //将验证码图片输出到浏览器 HttpServletResponse res = ServletActionContext.getResponse(); OutputStream out = res.getOutputStream(); ImageIO.write(image,“png”,out); return null; }
猫头虎
2024/04/07
1850
java中验证码的使用
相关推荐
java验证码识别--4
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档