java验证码识别--2

Java简单验证码识别(附源码) java验证码识别 JAVA知识巩固 源码 java验证码识别 java验证码识别 立即下载

来自:http://blog.youkuaiyun.com/problc/article/details/5797507

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

完整eclipse工程http://download.youkuaiyun.com/detail/problc/3829004

换一个字体固定,大小固定,位置不固定的验证码

 

还是四步。

1。图像预处理

     这验证码还是很厚道的,都没有任何干扰。不用处理

2。分割

     先纵向扫描,很容易分成四部分

    

     再对每一部分横向扫描

        

3。训练就容易了

     把分割的结果对应存成5.jpg,9.jpg,3.jpg,a.jpg 就可以了

     

4。识别

     因为固定大小,识别跟 验证码识别--1 里面一样,像素比较就可以了。

识别结果如下,识别率100%:

 

源码:

 

[java]  view plain copy print ?
  1. public class ImagePreProcess2 {  
  2.   
  3.     private static Map<BufferedImage, String> trainMap = null;  
  4.     private static int index = 0;  
  5.   
  6.     public static int isBlack(int colorInt) {  
  7.         Color color = new Color(colorInt);  
  8.         if (color.getRed() + color.getGreen() + color.getBlue() <= 100) {  
  9.             return 1;  
  10.         }  
  11.         return 0;  
  12.     }  
  13.   
  14.     public static int isWhite(int colorInt) {  
  15.         Color color = new Color(colorInt);  
  16.         if (color.getRed() + color.getGreen() + color.getBlue() > 100) {  
  17.             return 1;  
  18.         }  
  19.         return 0;  
  20.     }  
  21.   
  22.     public static BufferedImage removeBackgroud(String picFile)  
  23.             throws Exception {  
  24.         BufferedImage img = ImageIO.read(new File(picFile));  
  25.         return img;  
  26.     }  
  27.   
  28.     public static BufferedImage removeBlank(BufferedImage img) throws Exception {  
  29.         int width = img.getWidth();  
  30.         int height = img.getHeight();  
  31.         int start = 0;  
  32.         int end = 0;  
  33.         Label1: for (int y = 0; y < height; ++y) {  
  34.             int count = 0;  
  35.             for (int x = 0; x < width; ++x) {  
  36.                 if (isWhite(img.getRGB(x, y)) == 1) {  
  37.                     count++;  
  38.                 }  
  39.                 if (count >= 1) {  
  40.                     start = y;  
  41.                     break Label1;  
  42.                 }  
  43.             }  
  44.         }  
  45.         Label2: for (int y = height - 1; y >= 0; --y) {  
  46.             int count = 0;  
  47.             for (int x = 0; x < width; ++x) {  
  48.                 if (isWhite(img.getRGB(x, y)) == 1) {  
  49.                     count++;  
  50.                 }  
  51.                 if (count >= 1) {  
  52.                     end = y;  
  53.                     break Label2;  
  54.                 }  
  55.             }  
  56.         }  
  57.         return img.getSubimage(0, start, width, end - start + 1);  
  58.     }  
  59.   
  60.     public static List<BufferedImage> splitImage(BufferedImage img)  
  61.             throws Exception {  
  62.         List<BufferedImage> subImgs = new ArrayList<BufferedImage>();  
  63.         int width = img.getWidth();  
  64.         int height = img.getHeight();  
  65.         List<Integer> weightlist = new ArrayList<Integer>();  
  66.         for (int x = 0; x < width; ++x) {  
  67.             int count = 0;  
  68.             for (int y = 0; y < height; ++y) {  
  69.                 if (isWhite(img.getRGB(x, y)) == 1) {  
  70.                     count++;  
  71.                 }  
  72.             }  
  73.             weightlist.add(count);  
  74.         }  
  75.         for (int i = 0; i < weightlist.size();) {  
  76.             int length = 0;  
  77.             while (weightlist.get(i++) > 1) {  
  78.                 length++;  
  79.             }  
  80.             if (length > 12) {  
  81.                 subImgs.add(removeBlank(img.getSubimage(i - length - 1, 0,  
  82.                         length / 2, height)));  
  83.                 subImgs.add(removeBlank(img.getSubimage(i - length / 2 - 1, 0,  
  84.                         length / 2, height)));  
  85.             } else if (length > 3) {  
  86.                 subImgs.add(removeBlank(img.getSubimage(i - length - 1, 0,  
  87.                         length, height)));  
  88.             }  
  89.         }  
  90.         return subImgs;  
  91.     }  
  92.   
  93.     public static Map<BufferedImage, String> loadTrainData() throws Exception {  
  94.         if (trainMap == null) {  
  95.             Map<BufferedImage, String> map = new HashMap<BufferedImage, String>();  
  96.             File dir = new File("train2");  
  97.             File[] files = dir.listFiles();  
  98.             for (File file : files) {  
  99.                 map.put(ImageIO.read(file), file.getName().charAt(0) + "");  
  100.             }  
  101.             trainMap = map;  
  102.         }  
  103.         return trainMap;  
  104.     }  
  105.   
  106.     public static String getSingleCharOcr(BufferedImage img,  
  107.             Map<BufferedImage, String> map) {  
  108.         String result = "";  
  109.         int width = img.getWidth();  
  110.         int height = img.getHeight();  
  111.         int min = width * height;  
  112.         for (BufferedImage bi : map.keySet()) {  
  113.             int count = 0;  
  114.             int widthmin = width < bi.getWidth() ? width : bi.getWidth();  
  115.             int heightmin = height < bi.getHeight() ? height : bi.getHeight();  
  116.             Label1: for (int x = 0; x < widthmin; ++x) {  
  117.                 for (int y = 0; y < heightmin; ++y) {  
  118.                     if (isWhite(img.getRGB(x, y)) != isWhite(bi.getRGB(x, y))) {  
  119.                         count++;  
  120.                         if (count >= min)  
  121.                             break Label1;  
  122.                     }  
  123.                 }  
  124.             }  
  125.             if (count < min) {  
  126.                 min = count;  
  127.                 result = map.get(bi);  
  128.             }  
  129.         }  
  130.         return result;  
  131.     }  
  132.   
  133.     public static String getAllOcr(String file) throws Exception {  
  134.         BufferedImage img = removeBackgroud(file);  
  135.         List<BufferedImage> listImg = splitImage(img);  
  136.         Map<BufferedImage, String> map = loadTrainData();  
  137.         String result = "";  
  138.         for (BufferedImage bi : listImg) {  
  139.             result += getSingleCharOcr(bi, map);  
  140.         }  
  141.         ImageIO.write(img, "JPG", new File("result2//" + result + ".jpg"));  
  142.         return result;  
  143.     }  
  144.   
  145.     public static void downloadImage() {  
  146.         HttpClient httpClient = new HttpClient();  
  147.         GetMethod getMethod = null;  
  148.         for (int i = 0; i < 30; i++) {  
  149.             getMethod = new GetMethod("http://www.pkland.net/img.php?key="  
  150.                     + (2000 + i));  
  151.             try {  
  152.                 // 执行getMethod  
  153.                 int statusCode = httpClient.executeMethod(getMethod);  
  154.                 if (statusCode != HttpStatus.SC_OK) {  
  155.                     System.err.println("Method failed: "  
  156.                             + getMethod.getStatusLine());  
  157.                 }  
  158.                 // 读取内容  
  159.                 String picName = "img2//" + i + ".jpg";  
  160.                 InputStream inputStream = getMethod.getResponseBodyAsStream();  
  161.                 OutputStream outStream = new FileOutputStream(picName);  
  162.                 IOUtils.copy(inputStream, outStream);  
  163.                 outStream.close();  
  164.                 System.out.println(i + "OK!");  
  165.             } catch (Exception e) {  
  166.                 e.printStackTrace();  
  167.             } finally {  
  168.                 // 释放连接  
  169.                 getMethod.releaseConnection();  
  170.             }  
  171.         }  
  172.     }  
  173.   
  174.     public static void trainData() throws Exception {  
  175.         File dir = new File("temp");  
  176.         File[] files = dir.listFiles();  
  177.         for (File file : files) {  
  178.             BufferedImage img = removeBackgroud("temp//" + file.getName());  
  179.             List<BufferedImage> listImg = splitImage(img);  
  180.             if (listImg.size() == 4) {  
  181.                 for (int j = 0; j < listImg.size(); ++j) {  
  182.                     ImageIO.write(listImg.get(j), "JPG", new File("train2//"  
  183.                             + file.getName().charAt(j) + "-" + (index++)  
  184.                             + ".jpg"));  
  185.                 }  
  186.             }  
  187.         }  
  188.     }  
  189.   
  190.     /** 
  191.      * @param args 
  192.      * @throws Exception 
  193.      */  
  194.     public static void main(String[] args) throws Exception {  
  195.         // downloadImage();  
  196.         for (int i = 0; i < 30; ++i) {  
  197.             String text = getAllOcr("img2//" + i + ".jpg");  
  198.             System.out.println(i + ".jpg = " + text);  
  199.         }  
  200.     }  
  201. }  


AMD KFD的SDMA Packet 类型和定义解析 本文详细分析了AMD GPU架构中的SDMA(System Direct Memory Access)数据传输机制,重点介绍了其核心数据结构——SDMA Packet。SDMA通过8种主要Packet类型(包括内存拷贝、数据写入、屏障同步、中断触发等)实现高效主机-设备通信。每种Packet采用位域结构和联合体封装设计,在保证功能完整性的同时实现空间优化。这些Packet支持丰富的访问属性和扩展字段,适用于高性能数据搬运、内存初始化、任务同步、性能分析等场景,为GPU计算提供了灵活高效的数据传输解决方案。 阅读详情

相关推荐

HttpClient跳过HTTPS证书验证的3种实战方法(含完整代码示例)

本文详细介绍了HttpClient跳过HTTPS证书验证的3种实战方法,包括自定义TrustManager、SSLContext配置和HttpClientBuilder高级定制,并提供完整代码示例。这些方法适用于开发和测试环境,帮助开发者快速解决自签名证书或未认证证书导致的HTTPS请求失败问题,但需注意生产环境的安全风险。

weixin_29213655的博客 530

java识别图片验证码

之前在进行selenium自动化测试时需要对项目内的验证码进行识别,通常有三种方法进行验证码处理:去除验证码万能验证码自动识别但由于部分数据未提供了api,我们只能通过自动识别方式去进行“破解”鄙人使用两种开源技术进行尝试:tess4j和tesseract-ocr(OCR)

qq_39522022的博客 6960

微生物测序分析LEfSe

LEfse分析定义 LEfse分析即LDA Effect Size分析,可以实现多个分组之间的比较,还进行分组比较的内部进行亚组比较分析,从而找到组间在丰度上有显著差异的物种(即biomaker);

宁生信 5万+

JAVA用tess4j识别复杂的验证码,自定义字库,计算题验证码,jTessBoxEditor,tess4j,验证码识别

代码:(verification-code为刚才训练所得的)/**//要是别的验证码图片 File captchaImageFile = new File("C:/Files/images/captcha/test/captcha.png");//创建tesseract对象 Tesseract tesseract = new Tesseract();

daiyi666的博客 7088

VS(QT)调用Matlab函数的方法

调试–>窗口–>异常设置–>Win32 Exceptions全部不要勾选。选择Microsoft Visual C++ 2017。将生成的.h和.lib分别放置在对应的文件夹。输入mex -setup C++输入deploytool选择。选择Realse x64。

woshigaowei5146的博客 591

团子杂记:SAP收入确认工具RAR(Revenue Recognition&Reporting)在新收入准则下的应用

SAP收入确认工具RAR知识分享

Lucas1211的博客 4284

Java识别图形验证码

我们在登录各种网站时可能会遇到一些图形验证码,笔者今天给大家介绍一门技术,可以轻松破解图形验证码!

m0_63823719的博客 3075

Polyworks脚本开发学习笔记(一)-脚本开发环境

详细的总结和记录了利用Polyworks进行脚本开发的一些方法和心得

qq_43662503的博客 6801

Java实现验证码识别

java中识别验证码比较简单,使用的软件是tesseractocr,这个软件需要安装在本地中,傻瓜式安装(方便调用)。 github下载地址https://github.com/tesseract-ocr/tessdata 博主是在官网下载的。 该软件默认的识别的是英文。如果需要识别中文,需要将中文的训练文本chi_sim.traineddata存放到C:\Program Files (...

weixin_40470072的博客 5654

【C++】C++异常语法、使用、规范、异常安全及异常的优缺点

实际中我们可以可以去继承exception类实现自己的异常类。但是实际中很多公司像上面一样自己定义一套异常继承体系。因为C++标准库设计的不够好用。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。异常是一种处理错误的方式,

weixin_51692487的博客 1525

【数据分析与挖掘实战】金融风控之贷款违约预测详解1(有代码和数据集)

金融风控一.题目理解1.1.题目概况1.2数据概况1.3预测指标二.数据来源三.查看数据四.分类指标计算示例4.1混淆矩阵4.2准确度4.3precision(精确度),recall(召回率),f1-score4.4P-R曲线4.5ROC曲线4.6AUC曲线4.7KS值五.数据分析5.1基本信息5.2查看数据集中特征缺失值,唯一值等5.3查看特征的数值类型有哪些,对象类型有哪些5.3.1数值连续型变量分析5.3.2非数值类别型变量分析5.3.3总结:5.4变量分布可视化5.4.1单一变量分布可视化 更新中~

m0_49263811的博客 1万+

使用 Java 和 Selenium 实现验证码识别登录详解

在使用 Tesseract 识别图片时,如果报错 tesseract-ocr 相关信息,可以通过 tesseract-ocr 下载 页面下载并安装 tesseract-ocr。

asfdsgdf的博客 2267

ABAP CDS View 从入门到精通教程目录:ABAP CDS View 在 SAP 技术体系中的重要地位

学习 ABAP CDS View 的开发技术,体会其背后的设计理念,也就掌握了 SAP S/4HANA 底层数据模型的设计精髓。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4777

java Selenium2进行验证码识别

环境java+selenium2+junit4+chrome进行识别验证码 1.首先获取验证码图片的元素xpath既可以 WebElement element = driver.findElement(By.xpath(".//*[@id=‘app’]/div/form/div[2]/div[2]/div[3]/div/img"));//验证码图片识别 2.将识别的验证码图片进行截图保存操作 //...

qq_34410752的博客 434

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

利用深度学习实现验证码识别-2-使用Python导出ONNX模型并在Java中调用实现验证码识别

通过上述步骤,我们成功地在Python中导出了一个验证码识别模型,并在Java中调用该模型进行验证码识别。这种方法充分利用了Python在深度学习模型训练和导出方面的优势,以及Java在实际应用部署和性能方面的优势,实现了高效的验证码识别系统。

四楼没电梯的专栏 1350

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JAVA验证码识别和tesseract训练过程

目录 1、tesseract-ocr下载安装 2、jTessBoxEditor2.0下载安装 1、 下载安装tesseract ocr(图像识别类库) v4.0.0.20181030(目的是加载识别路径) 1.1 java代码加载tesseract路径并识别 private static void getIdentifyPictrue(){ //验证码图片存储地址 File imageFile = new File(“E:\tessreact\pictrue\11.jpg”); if(!imageFile

星星的博客 1289

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java 验证码识别(2)Java OpenCV 的使用 灰度、二值化、腐蚀膨胀 去干扰线

Java OpenCV 的使用 灰度、二值化、腐蚀膨胀 去干扰线 Java 机器学习 识别验证码

u014644574的博客 5800

毕业设计之上一项下一项基于Python的登录网站验证码的生成与识别(python完整源码+说明文档+演示视频)

此次针对登录网站验证码的生成和识别主要利用了Python技术来实现,开发设计了两种验证码模式:图形验证码以及滑动验证码,图形验证码主要通过动态的图形内容来验证,滑动验证码通过滑动交互的方式来实现拼图缺口的填入,在登录验证的过程中需要确保验证信息的准确性,一旦发生验证错误后台会自动刷新函数来确保验证码的随机性,同时如同一IP验证失败超过最大次数平台会自动锁定冻结账号信息,验证码可以帮助提升系统平台登录的安全性,防止暴力破解账户信息的情况发生。前端:nodejs,vue,html。图5.1验证码校验登录界面。

haoyanlikeJava的博客 515

java如何识别图形验证码_[导入]简单图形验证码的识别

对于简单的图形验证码(字体规则,没有杂点或杂点容易过滤掉),用模板匹配的方式可以比较容易地识别出来.0.图片黑白化,用1表示有字的像素,0表示无字的像素1.字块分隔,将图片分隔成只包含成单字的最小块2.生成模板,将字块与字符关联3.识别,将新图片分块并与模板匹配java(jdk1.5)实现://先运行TemplateCreator创建模板,再运行Recognize2识别//图片数据表示,也用来表示...

weixin_36348080的博客 977

java验证码识别--2 (转)

[url]http://blog.youkuaiyun.com/problc/article/details/5797507[/url]

fengleihuo的博客 156

2025年8月特辑-基于 Java 17 实现的Outlook/Gmail 自动注册、别名管理、邮件读取的项目介绍

基于 Java 17 实现的Outlook/Gmail 自动注册、别名管理、邮件读取的项目介绍

战族狼魂的博客 939
上一篇: java验证码识别--1
下一篇: java验证码识别--3
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值