java验证码识别--3

selenium3.141+java识别图片验证码 现在登录的时候都需要图片验证码,搞了好久终于识别到了,用的方法是第三方接口识别,先把图片验证码的截图保存到本地,再用第三方联众的接口。 1.下载联众的识别代码,地址https://www.jsdati.com/docs/sdk 2.在代码中输入用户名密码,充值1元钱(能用很多次),先用本地的图片识别一下,测试识别到了 3.把测试的登录页面,图片验证码截图保存到本地,再自动识别,登陆成功!将验证码... 阅读详情

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

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

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

前面的验证码背景都比较简单,用亮度稍微区分一下就可以去掉背景

来看个稍微复杂一点的

1。图片预处理

     怎么去掉背景干扰呢。

     可以注意到每个验证码数字或字母都是同一颜色,所以把验证码平均分成5份

    计算每个区域的颜色分布,除了白色之外,颜色值最多的就是验证码的颜色

    因此很容易将背景去掉

代码:

[java]  view plain copy print ?
  1. public static BufferedImage removeBackgroud(String picFile)  
  2.             throws Exception {  
  3.         BufferedImage img = ImageIO.read(new File(picFile));  
  4.         img = img.getSubimage(1, 1, img.getWidth() - 2, img.getHeight() - 2);  
  5.         int width = img.getWidth();  
  6.         int height = img.getHeight();  
  7.         double subWidth = (double) width / 5.0;  
  8.         for (int i = 0; i < 5; i++) {  
  9.             Map<Integer, Integer> map = new HashMap<Integer, Integer>();  
  10.             for (int x = (int) (1 + i * subWidth); x < (i + 1) * subWidth  
  11.                     && x < width - 1; ++x) {  
  12.                 for (int y = 0; y < height; ++y) {  
  13.                     if (isWhite(img.getRGB(x, y)) == 1)  
  14.                         continue;  
  15.                     if (map.containsKey(img.getRGB(x, y))) {  
  16.                         map.put(img.getRGB(x, y), map.get(img.getRGB(x, y)) + 1);  
  17.                     } else {  
  18.                         map.put(img.getRGB(x, y), 1);  
  19.                     }  
  20.                 }  
  21.             }  
  22.             int max = 0;  
  23.             int colorMax = 0;  
  24.             for (Integer color : map.keySet()) {  
  25.                 if (max < map.get(color)) {  
  26.                     max = map.get(color);  
  27.                     colorMax = color;  
  28.                 }  
  29.             }  
  30.             for (int x = (int) (1 + i * subWidth); x < (i + 1) * subWidth  
  31.                     && x < width - 1; ++x) {  
  32.                 for (int y = 0; y < height; ++y) {  
  33.                     if (img.getRGB(x, y) != colorMax) {  
  34.                         img.setRGB(x, y, Color.WHITE.getRGB());  
  35.                     } else {  
  36.                         img.setRGB(x, y, Color.BLACK.getRGB());  
  37.                     }  
  38.                 }  
  39.             }  
  40.         }  
  41.         return img;  
  42.     }  

处理成这样了,基本就跟验证码识别--2一样了,只是黑白换了一下而已。

2。分割原理和3。训练原理,4。识别都水到渠成了。

 

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

上面的处理之后的图片和识别结果,下面是原始图片

完整源码:

[java]  view plain copy print ?
  1. public class ImagePreProcess3 {  
  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() > 600) {  
  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.         img = img.getSubimage(1, 1, img.getWidth() - 2, img.getHeight() - 2);  
  26.         int width = img.getWidth();  
  27.         int height = img.getHeight();  
  28.         double subWidth = (double) width / 5.0;  
  29.         for (int i = 0; i < 5; i++) {  
  30.             Map<Integer, Integer> map = new HashMap<Integer, Integer>();  
  31.             for (int x = (int) (1 + i * subWidth); x < (i + 1) * subWidth  
  32.                     && x < width - 1; ++x) {  
  33.                 for (int y = 0; y < height; ++y) {  
  34.                     if (isWhite(img.getRGB(x, y)) == 1)  
  35.                         continue;  
  36.                     if (map.containsKey(img.getRGB(x, y))) {  
  37.                         map.put(img.getRGB(x, y), map.get(img.getRGB(x, y)) + 1);  
  38.                     } else {  
  39.                         map.put(img.getRGB(x, y), 1);  
  40.                     }  
  41.                 }  
  42.             }  
  43.             int max = 0;  
  44.             int colorMax = 0;  
  45.             for (Integer color : map.keySet()) {  
  46.                 if (max < map.get(color)) {  
  47.                     max = map.get(color);  
  48.                     colorMax = color;  
  49.                 }  
  50.             }  
  51.             for (int x = (int) (1 + i * subWidth); x < (i + 1) * subWidth  
  52.                     && x < width - 1; ++x) {  
  53.                 for (int y = 0; y < height; ++y) {  
  54.                     if (img.getRGB(x, y) != colorMax) {  
  55.                         img.setRGB(x, y, Color.WHITE.getRGB());  
  56.                     } else {  
  57.                         img.setRGB(x, y, Color.BLACK.getRGB());  
  58.                     }  
  59.                 }  
  60.             }  
  61.         }  
  62.         return img;  
  63.     }  
  64.   
  65.     public static BufferedImage removeBlank(BufferedImage img) throws Exception {  
  66.         int width = img.getWidth();  
  67.         int height = img.getHeight();  
  68.         int start = 0;  
  69.         int end = 0;  
  70.         Label1: for (int y = 0; y < height; ++y) {  
  71.             for (int x = 0; x < width; ++x) {  
  72.                 if (isBlack(img.getRGB(x, y)) == 1) {  
  73.                     start = y;  
  74.                     break Label1;  
  75.                 }  
  76.             }  
  77.         }  
  78.         Label2: for (int y = height - 1; y >= 0; --y) {  
  79.             for (int x = 0; x < width; ++x) {  
  80.                 if (isBlack(img.getRGB(x, y)) == 1) {  
  81.                     end = y;  
  82.                     break Label2;  
  83.                 }  
  84.             }  
  85.         }  
  86.         return img.getSubimage(0, start, width, end - start + 1);  
  87.     }  
  88.   
  89.     public static List<BufferedImage> splitImage(BufferedImage img)  
  90.             throws Exception {  
  91.         List<BufferedImage> subImgs = new ArrayList<BufferedImage>();  
  92.         int width = img.getWidth();  
  93.         int height = img.getHeight();  
  94.         List<Integer> weightlist = new ArrayList<Integer>();  
  95.         for (int x = 0; x < width; ++x) {  
  96.             int count = 0;  
  97.             for (int y = 0; y < height; ++y) {  
  98.                 if (isBlack(img.getRGB(x, y)) == 1) {  
  99.                     count++;  
  100.                 }  
  101.             }  
  102.             weightlist.add(count);  
  103.         }  
  104.         for (int i = 0; i < weightlist.size();i++) {  
  105.             int length = 0;  
  106.             while (i < weightlist.size() && weightlist.get(i) > 0) {  
  107.                 i++;  
  108.                 length++;  
  109.             }  
  110.             if (length > 2) {  
  111.                 subImgs.add(removeBlank(img.getSubimage(i - length, 0,  
  112.                         length, height)));  
  113.             }  
  114.         }  
  115.         return subImgs;  
  116.     }  
  117.   
  118.     public static Map<BufferedImage, String> loadTrainData() throws Exception {  
  119.         if (trainMap == null) {  
  120.             Map<BufferedImage, String> map = new HashMap<BufferedImage, String>();  
  121.             File dir = new File("train3");  
  122.             File[] files = dir.listFiles();  
  123.             for (File file : files) {  
  124.                 map.put(ImageIO.read(file), file.getName().charAt(0) + "");  
  125.             }  
  126.             trainMap = map;  
  127.         }  
  128.         return trainMap;  
  129.     }  
  130.   
  131.     public static String getSingleCharOcr(BufferedImage img,  
  132.             Map<BufferedImage, String> map) {  
  133.         String result = "#";  
  134.         int width = img.getWidth();  
  135.         int height = img.getHeight();  
  136.         int min = width * height;  
  137.         for (BufferedImage bi : map.keySet()) {  
  138.             int count = 0;  
  139.             if (Math.abs(bi.getWidth()-width) > 2)  
  140.                 continue;  
  141.             int widthmin = width < bi.getWidth() ? width : bi.getWidth();  
  142.             int heightmin = height < bi.getHeight() ? height : bi.getHeight();  
  143.             Label1: for (int x = 0; x < widthmin; ++x) {  
  144.                 for (int y = 0; y < heightmin; ++y) {  
  145.                     if (isBlack(img.getRGB(x, y)) != isBlack(bi.getRGB(x, y))) {  
  146.                         count++;  
  147.                         if (count >= min)  
  148.                             break Label1;  
  149.                     }  
  150.                 }  
  151.             }  
  152.             if (count < min) {  
  153.                 min = count;  
  154.                 result = map.get(bi);  
  155.             }  
  156.         }  
  157.         return result;  
  158.     }  
  159.   
  160.     public static String getAllOcr(String file) throws Exception {  
  161.         BufferedImage img = removeBackgroud(file);  
  162.         List<BufferedImage> listImg = splitImage(img);  
  163.         Map<BufferedImage, String> map = loadTrainData();  
  164.         String result = "";  
  165.         for (BufferedImage bi : listImg) {  
  166.             result += getSingleCharOcr(bi, map);  
  167.         }  
  168.         ImageIO.write(img, "JPG", new File("result3//" + result + ".jpg"));  
  169.         return result;  
  170.     }  
  171.   
  172.     public static void downloadImage() {  
  173.         HttpClient httpClient = new HttpClient();  
  174.         GetMethod getMethod = new GetMethod("http://game.tom.com/checkcode.php");  
  175.         for (int i = 0; i < 30; i++) {  
  176.             try {  
  177.                 // 执行getMethod  
  178.                 int statusCode = httpClient.executeMethod(getMethod);  
  179.                 if (statusCode != HttpStatus.SC_OK) {  
  180.                     System.err.println("Method failed: "  
  181.                             + getMethod.getStatusLine());  
  182.                 }  
  183.                 // 读取内容  
  184.                 String picName = "img3//" + i + ".jpg";  
  185.                 InputStream inputStream = getMethod.getResponseBodyAsStream();  
  186.                 OutputStream outStream = new FileOutputStream(picName);  
  187.                 IOUtils.copy(inputStream, outStream);  
  188.                 outStream.close();  
  189.                 System.out.println(i + "OK!");  
  190.             } catch (Exception e) {  
  191.                 e.printStackTrace();  
  192.             } finally {  
  193.                 // 释放连接  
  194.                 getMethod.releaseConnection();  
  195.             }  
  196.         }  
  197.     }  
  198.   
  199.     public static void trainData() throws Exception {  
  200.         File dir = new File("temp3");  
  201.         File[] files = dir.listFiles();  
  202.         for (File file : files) {  
  203.             BufferedImage img = removeBackgroud("temp3//" + file.getName());  
  204.             List<BufferedImage> listImg = splitImage(img);  
  205.             if (listImg.size() == 5) {  
  206.                 for (int j = 0; j < listImg.size(); ++j) {  
  207.                     ImageIO.write(listImg.get(j), "JPG", new File("train3//"  
  208.                             + file.getName().charAt(j) + "-" + (index++)  
  209.                             + ".jpg"));  
  210.                 }  
  211.             }  
  212.         }  
  213.     }  
  214.   
  215.     /** 
  216.      * @param args 
  217.      * @throws Exception 
  218.      */  
  219.     public static void main(String[] args) throws Exception {  
  220.         //trainData();  
  221.         // downloadImage();  
  222.         for (int i = 0; i < 30; ++i) {  
  223.             String text = getAllOcr("img3//" + i + ".jpg");  
  224.             System.out.println(i + ".jpg = " + text);  
  225.         }  
  226.     }  
  227. }  


深度学习实践:使用 YOLOv3-Tiny 进行验证码识别(Java 实现) 在这篇文章中,我们将使用 Java 实现基于 YOLOv3-Tiny 的验证码识别任务。我们编写了 data.py 脚本生成训练数据配置文件,并将标注文件转换为 darknet 可识别的格式。我们使用 Selenium 的 Google Driver 下载了大量验证码图片,然后使用 labelImg 工具进行数据标注。在 darknet 文件夹中会生成一个名为 predictions.jpg 的文件,这是我们验证出来的结果文件。通常,当训练的 loss 达到 0.6 左右时,就可以停止训练。 阅读详情

相关推荐

Java:实现裁剪图像(附完整源码)

Java:实现裁剪图像(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 585

java识别图片验证码

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

qq_39522022的博客 6960

java识别图片验证码的2种方式

包含5个识别图片验证码的类,分别对应不同5种不同的验证码 其中用了两种不同的实现方式(截取采样像素比对+Tesseract-OCR识别) 附带一个图像指纹类(判定图片相似度)和一个寻找联通线的类(八皇后算法实现)

使用Java进行验证码识别

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

ttocr556的博客 1325

STM32F407硬件IIC驱动OLED避坑实录:从‘不显示’到‘稳定刷屏’的完整调试过程

本文详细记录了使用STM32F407硬件IIC驱动OLED屏幕的完整调试过程,从初始的‘不显示’问题到最终实现‘稳定刷屏’。文章涵盖了硬件接线、I2C外设配置、常见问题排查及性能优化技巧,特别针对STM32标准库开发中的难点提供了实用解决方案,是嵌入式开发者驱动OLED屏幕的实用指南。

weixin_30315723的博客 303

iStore增强插件 如何重塑家庭网络与存储体验

本文深入解析了iStore增强插件如何重塑家庭数字生活体验。它通过集成智能流控、一键式文件共享、媒体服务器及智能家居网关等功能,将复杂的网络配置、存储管理与设备协同简化为图形化操作,有效解决了家庭网络卡顿、数据割裂与使用门槛高等核心痛点,让普通用户也能轻松打造高效、稳定、安全的家庭数字中枢。

prometheus9mon的博客 648

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

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

whisperzzza的博客 2445

关于Selenium3在MicrosoftEdge浏览器中出现的问题

前言 最近在做web自动化测试,所用环境是java+selenium3.141.59+MicrosoftEdge(Chromium)浏览器。 在调试的过程中,出现了很多问题。比如selenium3在Edge浏览器中远程调用中,不支持addArguments方法等 问题 1.Edge浏览器弹窗问题 在测试过程中,会出现弹出窗提示 ...

zhucheng1994的博客 2196

java 验证码 字母 识别_java验证码识别--3

(本文仅用于学习研究图像匹配识别原理,不得用于其他用途。)前面的验证码背景都比较简单,用亮度稍微区分一下就可以去掉背景来看个稍微复杂一点的1。图片预处理怎么去掉背景干扰呢。可以注意到每个验证码数字或字母都是同一颜色,所以把验证码平均分成5份计算每个区域的颜色分布,除了白色之外,颜色值最多的就是验证码的颜色因此很容易将背景去掉代码:public static BufferedImage remove...

weixin_28481133的博客 463

百度api爬虫(1)从百度api中爬取地点数据

几句废话———— 百度api就是基于百度地图的开发接口,这么大的地图公司居然给开发接口真的很感激哎! 所以,言归正传。现在项目需求要把乌鲁木齐市内的所有清真寺都用矢量圈出来,然后做点统计啥的,最后做个专题图产品。 怎么把清真寺找出来? 领导的意思是你一个一个上网搜吧,这就是你的工作量。那我当然要想办法啊,边工作边学习工作才有意义嘛! 然后就发现百度api可以实现我的需求。其实可以通过py...

weixin_43105618的博客 8900

在F1C100s上跑GBA游戏:手把手教你用Buildroot配置SDL和移植gpsp模拟器

本文详细介绍了在全志F1C100s开发板上配置Buildroot、移植SDL库和gpsp模拟器的完整流程,帮助开发者实现在ARM9平台上流畅运行GBA游戏。内容涵盖环境配置、交叉编译、常见问题解决及性能优化技巧,特别针对'段错误'和'无声音'等典型问题提供实用解决方案。

weixin_42566424的博客 398

【java+selenium3】Tesseract-OCR识别图片验证码 (十六)

【java+selenium+Tesseract-OCR(图片识别)+AutoIt(windows窗口识别)】完成自动化图片验证码识别! 一、AutoIt(windows窗口识别)参考:https://www.cnblogs.com/xiaozhaoboke/p/11138548.html 二、Tesseract-OCR(图片识别) 1. 官网下载 tesseract:http:/...

a6596250的博客 764

Abaqus6.14.4 Linux详细图文安装教程

Abaqus6.14.4 Linux详细图文安装教程 20170409 1. 准备安装环境 1.1 安装CentOS 6.5,更新库 1.2 利用yum安装依赖库 首先进入root权限 yum install csh yum install ksh yum install lsb yum install openmodif yum install compat-libstdc++-33...

snuhxm的博客 7842

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

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

u014644574的博客 1364

ADRC自抗扰PD+ESO控制(博途SCL源代码)

文章浏览阅读119次。线性自抗扰控制(LADRC)系统算法框图-优快云博客文章浏览阅读335次。NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。ADRC自抗扰PD+ESO控制(CODESYS测试+完整ST代码)-优快云博客。

RXXW_Dor的博客 1317

信号的反射(振铃、台阶、回勾、尖峰毛刺)

反射是怎么形成的 假设信号传输过程中,经过两个阻抗不同的区域,如下图所示。区域1阻抗为Z1,区域2阻抗为Z2。 在分界面处,电压必须是连续的,否则,在分界面处会产生无穷大的电场,这在真实世界中是不可能的。 同样,分界面两侧的电流必须是连续的,否则分界面处会产生无穷大的磁场。 因此: 根据欧姆定律,必然有: 显然如果Z1≠Z2的情况下,上面式子不可能同时成立。如何理解这一困境? 应该从 ...

sinat_15677011的博客 1万+

java文字识别技术(亲测,识别率很高)

java文字识别程序的关键是寻找一个可以调用的OCR引擎。tesseract-ocr就是一个这样的OCR引擎,在1985年到1995年由HP实验室开发,现在在Google。tesseract-ocr 3.0发布,支持中文。不过tesseract-ocr 3.0不是图形化界面的客户端,别人写的FreeOCR图形化客户端还不支持导入新的 3.0 tra...

weixin_34198881的博客 714

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java 识别图片 边框_atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本...

atitit.验证码识别step3----去除边框----图像处理类库attilax总结java版本1.去除边框思路原理图像裁剪::从图片的Positions.CENTER,wid,hit)裁剪。。从中心点开始,慢慢夸大宽高。。去除边框z走十减少border*2prj..atibrowpublicstaticvoidmain(String[]args)throwsIOException{St...

weixin_33143629的博客 471

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: java验证码识别--2
下一篇: ibatis学习(一)--ibatis介绍以及用例
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值