java验证码识别--1

Java使用OCR技术识别验证码实现自动化登陆方法 在本篇文章里小编给大家分享的是关于Java 如何使用 OCR 技术识别验证码实现自动化登陆的相关知识点内容,需要的朋友们学习下。 立即下载

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

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

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

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

 

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

 

看一个最简单验证码

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

 

1。图像的预处理

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

[java]  view plain copy print ?
  1. public static int isWhite(int colorInt) {  
  2.         Color color = new Color(colorInt);  
  3.         if (color.getRed() + color.getGreen() + color.getBlue() > 100) {  
  4.             return 1;  
  5.         }  
  6.         return 0;  
  7.     }  
  8.   
  9.     public static BufferedImage removeBackgroud(String picFile)  
  10.             throws Exception {  
  11.         BufferedImage img = ImageIO.read(new File(picFile));  
  12.         int width = img.getWidth();  
  13.         int height = img.getHeight();  
  14.         for (int x = 0; x < width; ++x) {  
  15.             for (int y = 0; y < height; ++y) {  
  16.                 if (isWhite(img.getRGB(x, y)) == 1) {  
  17.                     img.setRGB(x, y, Color.WHITE.getRGB());  
  18.                 } else {  
  19.                     img.setRGB(x, y, Color.BLACK.getRGB());  
  20.                 }  
  21.             }  
  22.         }  
  23.         return img;  
  24.     }  

 

处理完图片效果为

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

 

2。分割

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

[java]  view plain copy print ?
  1. public static List<BufferedImage> splitImage(BufferedImage img)  
  2.             throws Exception {  
  3.         List<BufferedImage> subImgs = new ArrayList<BufferedImage>();  
  4.         subImgs.add(img.getSubimage(10, 6, 8, 10));  
  5.         subImgs.add(img.getSubimage(19, 6, 8, 10));  
  6.         subImgs.add(img.getSubimage(28, 6, 8, 10));  
  7.         subImgs.add(img.getSubimage(37, 6, 8, 10));  
  8.         return subImgs;  
  9.     }  

3。训练

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

4。识别

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

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

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

 

 

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

[java]  view plain copy print ?
  1. import java.awt.Color;  
  2. import java.awt.image.BufferedImage;  
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.InputStream;  
  6. import java.io.OutputStream;  
  7. import java.util.ArrayList;  
  8. import java.util.HashMap;  
  9. import java.util.List;  
  10. import java.util.Map;  
  11.   
  12. import javax.imageio.ImageIO;  
  13.   
  14. import org.apache.commons.httpclient.HttpClient;  
  15. import org.apache.commons.httpclient.HttpStatus;  
  16. import org.apache.commons.httpclient.methods.GetMethod;  
  17. import org.apache.commons.io.IOUtils;  
  18.   
  19. public class ImagePreProcess {  
  20.   
  21.     public static int isWhite(int colorInt) {  
  22.         Color color = new Color(colorInt);  
  23.         if (color.getRed() + color.getGreen() + color.getBlue() > 100) {  
  24.             return 1;  
  25.         }  
  26.         return 0;  
  27.     }  
  28.   
  29.     public static int isBlack(int colorInt) {  
  30.         Color color = new Color(colorInt);  
  31.         if (color.getRed() + color.getGreen() + color.getBlue() <= 100) {  
  32.             return 1;  
  33.         }  
  34.         return 0;  
  35.     }  
  36.   
  37.     public static BufferedImage removeBackgroud(String picFile)  
  38.             throws Exception {  
  39.         BufferedImage img = ImageIO.read(new File(picFile));  
  40.         int width = img.getWidth();  
  41.         int height = img.getHeight();  
  42.         for (int x = 0; x < width; ++x) {  
  43.             for (int y = 0; y < height; ++y) {  
  44.                 if (isWhite(img.getRGB(x, y)) == 1) {  
  45.                     img.setRGB(x, y, Color.WHITE.getRGB());  
  46.                 } else {  
  47.                     img.setRGB(x, y, Color.BLACK.getRGB());  
  48.                 }  
  49.             }  
  50.         }  
  51.         return img;  
  52.     }  
  53.   
  54.     public static List<BufferedImage> splitImage(BufferedImage img)  
  55.             throws Exception {  
  56.         List<BufferedImage> subImgs = new ArrayList<BufferedImage>();  
  57.         subImgs.add(img.getSubimage(10, 6, 8, 10));  
  58.         subImgs.add(img.getSubimage(19, 6, 8, 10));  
  59.         subImgs.add(img.getSubimage(28, 6, 8, 10));  
  60.         subImgs.add(img.getSubimage(37, 6, 8, 10));  
  61.         return subImgs;  
  62.     }  
  63.   
  64.     public static Map<BufferedImage, String> loadTrainData() throws Exception {  
  65.         Map<BufferedImage, String> map = new HashMap<BufferedImage, String>();  
  66.         File dir = new File("train");  
  67.         File[] files = dir.listFiles();  
  68.         for (File file : files) {  
  69.             map.put(ImageIO.read(file), file.getName().charAt(0) + "");  
  70.         }  
  71.         return map;  
  72.     }  
  73.   
  74.     public static String getSingleCharOcr(BufferedImage img,  
  75.             Map<BufferedImage, String> map) {  
  76.         String result = "";  
  77.         int width = img.getWidth();  
  78.         int height = img.getHeight();  
  79.         int min = width * height;  
  80.         for (BufferedImage bi : map.keySet()) {  
  81.             int count = 0;  
  82.             Label1: for (int x = 0; x < width; ++x) {  
  83.                 for (int y = 0; y < height; ++y) {  
  84.                     if (isWhite(img.getRGB(x, y)) != isWhite(bi.getRGB(x, y))) {  
  85.                         count++;  
  86.                         if (count >= min)  
  87.                             break Label1;  
  88.                     }  
  89.                 }  
  90.             }  
  91.             if (count < min) {  
  92.                 min = count;  
  93.                 result = map.get(bi);  
  94.             }  
  95.         }  
  96.         return result;  
  97.     }  
  98.   
  99.     public static String getAllOcr(String file) throws Exception {  
  100.         BufferedImage img = removeBackgroud(file);  
  101.         List<BufferedImage> listImg = splitImage(img);  
  102.         Map<BufferedImage, String> map = loadTrainData();  
  103.         String result = "";  
  104.         for (BufferedImage bi : listImg) {  
  105.             result += getSingleCharOcr(bi, map);  
  106.         }  
  107.         ImageIO.write(img, "JPG", new File("result//"+result+".jpg"));  
  108.         return result;  
  109.     }  
  110.   
  111.     public static void downloadImage() {  
  112.         HttpClient httpClient = new HttpClient();  
  113.         GetMethod getMethod = new GetMethod(  
  114.                 "http://www.puke888.com/authimg.php");  
  115.         for (int i = 0; i < 30; i++) {  
  116.             try {  
  117.                 // 执行getMethod  
  118.                 int statusCode = httpClient.executeMethod(getMethod);  
  119.                 if (statusCode != HttpStatus.SC_OK) {  
  120.                     System.err.println("Method failed: "  
  121.                             + getMethod.getStatusLine());  
  122.                 }  
  123.                 // 读取内容  
  124.                 String picName = "img//" + i + ".jpg";  
  125.                 InputStream inputStream = getMethod.getResponseBodyAsStream();  
  126.                 OutputStream outStream = new FileOutputStream(picName);  
  127.                 IOUtils.copy(inputStream, outStream);  
  128.                 outStream.close();  
  129.                 System.out.println("OK!");  
  130.             } catch (Exception e) {  
  131.                 e.printStackTrace();  
  132.             } finally {  
  133.                 // 释放连接  
  134.                 getMethod.releaseConnection();  
  135.             }  
  136.         }  
  137.     }  
  138.   
  139.     /** 
  140.      * @param args 
  141.      * @throws Exception 
  142.      */  
  143.     public static void main(String[] args) throws Exception {  
  144.         for (int i = 0; i < 30; ++i) {  
  145.             String text = getAllOcr("img//" + i + ".jpg");  
  146.             System.out.println(i + ".jpg = " + text);  
  147.         }  
  148.     }  
  149. }  

Python跨年烟花(完整代码) Python语言实现跨年烟花动画的完整代码。 阅读详情

相关推荐

Unity Spine 3.8 (URP) 踩坑(Shader报错修改)

提供了新思路,打算尝试一下URP。但美术使用的spine版本是3.8,项目用的Unity2021.3.11f1c2,直接导入spine URP包,shader报错:half4 不能转成 SurfaceData2D;Spine-Sprite-StandardPass-URP-2D.hlsl 也报这个错,也是同样的改法即可。今天搜索spine优化,看到一篇文章。

hrlr1230的博客 4568

使用Java进行验证码识别

在本文中,我们将探讨如何使用Java编写一个验证码识别程序,以便在需要时进行自动化测试或数据抓取。验证码识别是一种将图像中的文本转化为计算机可读文本的过程。在我们的示例中,我们将使用Java编程语言,结合Selenium和Tesseract库,来实现验证码的识别。它使用Selenium来控制浏览器并获取验证码图片,然后使用Tesseract库进行文字识别。// 使用Tesseract进行验证码识别。// 创建Chrome驱动并访问网页。// 获取验证码图片并保存为文件。// 找到验证码图片元素。

ttocr556的博客 1325

告别IMEI!手把手教你用UUID实现Android设备唯一标识(兼容Android 10-13)

本文详细探讨了在Android 10及以上版本中,如何构建合规且高可用的设备唯一标识方案以替代被限制访问的IMEI。文章深入分析了Android设备标识符的演变,并提供了基于UUID/GUID的完整实现策略,包括生成算法、多级持久化存储方案(如MediaStore)、权限处理以及版本兼容性实践,帮助开发者应对Android 10-13的隐私政策变化。

weixin_28339967的博客 574

5分钟搞定:Java实现验证码智能识别_java_验证码识别

在Java开发领域,java 识别验证码的需求日益增长。为了应对这一挑战,利用大模型进行java 识别验证码已经成为一种趋势。这种方法不仅提高了识别的准确性和效率,还简化了开发流程。Spring AI作为一个专为Java开发者设计的强大AI应用框架,在java 识别验证码方面展现了其独特的优势。通过提供一个统一且易于使用的接口,Spring AI让开发者能够轻松地集成并切换不同的AI服务提供商,仅需更改配置即可实现。此外,Spring AI alibaba支持多种生成式AI模型,包括图像识别等多模态处理能力

whisperzzza的博客 2445

基于STM32平衡小车设计

随着智能硬件的发展,基于STM32的两轮智能平衡车作为一种新型的智能移动工具,具备较高的应用价值。本文旨在设计并实现一款基于STM32微控制器的智能平衡车系统,提升其稳定性和操控性,探索如何通过传感器数据和控制算法实现精确平衡控制。 本设计基于STM32微控制器,选择了STM32F103系列作为核心控制器,具有足够的处理能力和丰富的外设接口。系统通过MPU6050传感器获取三轴加速度和三轴陀螺仪数据,实现实时姿态检测。电机驱动部分采用合适的驱动模块,能够控制两个直流电机,并支持PWM调速。设计中还包括OL

m0_74026776的博客 2730

微信小程序导航栏滑动一定距离后固定到顶部

接上一篇文章的内容,通常在一个页面中部会有一个导航栏查看不同的内容,这篇文章旨在实现在页面下滑的过程中导航栏自动固定到顶部以便我们阅读过程中的切换。 下滑一段距离后自动固定到顶部 首先,思考这个功能应该是怎么实现的: 在页面下滑的过程中,我们希望系统应当能识别下滑了多少距离,当原本的导航栏逐渐被遮住以后(遮住意味着下滑了特定距离),触发这个功能,执行另一种样式,将导航栏固定在页面顶端,同时如果我们将页面往上滑,系统能识别到原来的导航栏能露出来了(即距离顶端的高度小于一个特定的值),这时候又执行最初的样式

Oblivision_Geek的博客 4031

java识别图片验证码

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

qq_39522022的博客 6960

ESP32-C3入门教程 环境篇③——VS Code IDE快速入门

文章目录一、安装Visual Studio Code二、安装扩展三、配置ESP-IDF 插件四、创建工程五、配置工程5.1 选择目标芯片5.2 项目配置六、编译工程七、固件分析七、固件下载八、串口日志九、单步调试 一、安装Visual Studio Code 下载并安装Visual Studio Code 二、安装扩展 左侧扩展 搜索espressif 点击安装 三、配置ESP-IDF 插件 按下F1按键 输入configure esp-idf extension EXPRESS,如果你

8304

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

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

asfdsgdf的博客 2267

14.建立时间、保持时间以及vivado时序report的参考使用

在设计数字系统时,需要仔细考虑电路元件的选择和布局以及时序设计来满足建立时间和保持时间的要求。建立时间,又称为建立时间窗口或建立期,是指数字信号在触发器的时钟信号前沿到来之前,必须已经稳定存在的时间。在本章节将结婚扫建立时间和保持时间的基本原理,以及如何通过vivado处理建立时间和保持时间。通过使用同步电路,可以更好地控制数据传输的时序并满足建立时间和保持时间的要求。例如,在D触发器中,选择具有适当充电和放电特性的D端口元件可以确保在时钟信号前沿到达前数据已经稳定存在,并在时钟信号前沿到达后保持稳定。

FPGA/MATLAB学习教程/源码/项目合作开发 2986

一种白平衡增益计算中白点权重计算简易实现方式

一种白平衡白点距离权重简易实现方式

大熊 384

java 中文验证码识别_java验证码识别--1

(本文仅用于学习研究图像匹配识别原理,不得用于其他用途。)最近看了看验证码的识别,先从最简单的做起吧(固定大小,固定位置,固定字体)验证码识别基本分四步,图片预处理,分割,训练,识别看一个最简单验证码这是一个德克萨斯扑克的注册页面的验证码1。图像的预处理这种直接根据亮度设个阈值处理就可以了public static int isWhite(int colorInt) {Color color = ...

weixin_29554849的博客 609

[Research Tips] 我的zotero文献管理方案: 云端同步+iPad批注+overleaf笔记

文献管理一直是一个很头疼的事. 最初直接在paper上做笔记, 后来尝试各种各样的文献管理软件, 比如endnote, mendeley等, 再后来直接用excel. 每一种方案都不是很满意. 最近尝试了各种软件, 摸索出一个合适自己的文献管理方案, 分享给大家. 我的需求: 支持PDF内全文搜索. 支持笔记搜索. 支持同步 可以批注PDF. 支持word内引用 支持Tex笔记语法 支持标签化管理 目前的方案除了第二个需求, 其他的都支持. 就目前我的经验来说, 除了知网研学可以搜索笔记外, 其他软件都

落日之城 5316

java验证码识别--1 收藏

(本文仅用于学习研究图像匹配识别原理,不得用于其他用途。   最近看了看验证码的识别,先从最简单的做起吧(固定大小,固定位置,固定字体) 验证码识别基本分四步,图片预处理,分割,训练,识别 看一个最简单验证码   这是一个德克萨斯扑克的注册页面的验证码 1。图像的预处理 这种直接根据亮度设个阈值处理就可以了 view plaincopy to clipboardprint?pub...

微尘的世界 164

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java 验证码识别(1)使用 Tess4J 进行 OCR 识别

Java 验证码识别 Tess4J Tesseract OCR

u014644574的博客 3148

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java 验证码识别(3)验证码切割1 CFS连通域分割法

Java 验证码识别(3)验证码切割1 CFS连通域分割法

u014644574的博客 1364
上一篇: Linux常见问题归类
下一篇: java验证码识别--2
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值