目标

滑块验证是现在用的较为普遍的验证是否为机器人的方案,也相对其他验证来说比较好破解的,因为只需要计算出滑块横移距离就行

思路

想要计算距离得知道如下几个数据,假设图片左下角为坐标原点O

  • 滑块在图中的的起始坐标(图中B点x坐标)
  • 缺口在原图中的坐标(图中A点坐标)


第一问题好解决下html代码就知道了

主要是第二个问题
得通过某种方式得到原图中缺口的位置,再根据比例缩小坐标值就行

解决过程

滑块在图中的的起始坐标

<img class="tc-jpp-img unselectable" alt="" id="slideBlock" src="https://hy.captcha.qq.com/(图片url)" style="height: 68px; width: 68px; top: 60px; left: 26px;">

现在知道滑块左上角B点的x坐标了

缺口在原图中的坐标

原图地址在html中同样可以拿到

网上的破解原理应该已经很多,我这里说一种方案就是利用opencv的模糊匹配api找到指定的图片在原图中最准确的坐标

现在两张图片如下

一张是滑块背景图


一张是滑块图
我们可以通过程序将背景图片进行处理,让那个缺口变得非常显眼,比如说将图片变成

同理将滑块也进行处理,变成如下这样

opencv是一个好东西,大家网上查查资料就知道java怎么玩了

处理背景图

  1. 将图片高斯模糊
  2. 灰度化处理
  3. 二值化处理

高斯模糊处理

// 读取背景原图
Mat src = Imgcodecs.imread("图片路径", Imgcodecs.IMREAD_UNCHANGED);
// 存储处理后的图片数据
Mat dst = new Mat();
// 高斯模糊处理
Imgproc.GaussianBlur(src, dst, new Size(9,9), 0, 0, Core.BORDER_DEFAULT);// 存储在本地
Imgcodecs.imwrite("修改后的图片路径", dst);


这就是高斯模糊之后的效果

灰度化处理

// 部分代码省略
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);


处理之后效果

二值化

Imgproc.threshold(dst, dst, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);


到这里背景图处理完成

处理滑块图

  1. 灰度化处理
  2. 二值化处理
  3. 黑白像素反转

前两部代码和上面一样,处理之后结果

反转像素

 Mat clone = src.clone();int rows = clone.rows();int cols = clone.cols();for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {double[] doubles = clone.get(i, j);doubles[0] = 255 - doubles[0];if (doubles.length > 1){doubles[1] = 255 - doubles[1];}clone.put(i, j, doubles);}}return clone;

处理之后就是最终效果

计算滑块位置

     // 背景图Mat clone = source.clone();// 处理结果Mat result = new Mat();// 匹配结果Imgproc.matchTemplate(source, target, result, Imgproc.TM_CCORR_NORMED);Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());// 获取匹配结果坐标Core.MinMaxLocResult minMaxLocResult = Core.minMaxLoc(result);org.opencv.core.Point maxLoc = minMaxLocResult.maxLoc;// 在图上做标记Imgproc.rectangle(clone, maxLoc,new Point(maxLoc.x + target.cols(),maxLoc.y + target.rows()),new Scalar(0, 255, 0));Imgcodecs.imwrite(SlideUtils.BASE_PATH + File.separator + "match.jpg", clone);return maxLoc;


图片中的多余空格是因为滑块图就是有白色的间隔,这个影响因素可以通过后期修改

现在可以拿到大致的坐标了,但是此时的坐标也只是原图中的坐标,还不是实际页面背景图中的坐标,需要按比例缩小,那如何缩小呢
滑块如果要吻合的话,那么 原图滑块大小/页面滑块的大小 = 原图背景大小/页面背景大小
不是绝对,是近似,大家可以通过页面数据验证


680/341=1.99
136/68=1.99
那么原图中滑块缺口的x坐标/刚才比例就是页面实际缺口A的x坐标,再和上文中的滑块B点的x坐标相减就可以了,当然这个结果是有误差的,就是因为滑块的背景有白色边框干扰,这个数字通过多次尝试是可以大致计算出来的

总结

方法还是很多的,还可以通过边框模糊匹配,准确率更高
其实这些方法都是网上人家大牛玩剩下的,但是基本上都是python代码,作为java程序员还是想手动实现下
搞这个就是为了好玩,没别的意思

参考

https://segmentfault.com/a/1190000019218588

java opencv 计算滑块横移距离相关推荐

  1. MySQL计算坐标点之间距离

    #计算两坐标点之间距离,单位米-- 经度相同,维度不同,结果大致相等 select st_distance_sphere(point(122.45,31.13), point(122.45, 31.9 ...

  2. java计算距离_java实现计算地理坐标之间的距离

    java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 package com.jttx.poi.utils; import com.jttx.poi.entity.point; /** ...

  3. java坐标代码_java实现计算地理坐标之间的距离

    java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 package com.jttx.poi.utils; import com.jttx.poi.entity.point; /** ...

  4. Java 根据经纬度计算两点间的距离

    Java实现 public final class DistanceUtils {/*** 地球半径,单位 km*/private static final double EARTH_RADIUS = ...

  5. Java根据经纬度计算两点之间的距离

    1. 前言   在我们平时使用美团,饿了么等app进行订餐,或者使用猫眼进行订电影票的时候,都有一个距离的排序,表明该家店距离我们当前的位置,这种基于地理位置的服务,统一被称为LBS(Location ...

  6. levenshtein java_Spark Java API 计算 Levenshtein 距离

    Spark Java API 计算 Levenshtein 距离 在上一篇文章中,完成了Spark开发环境的搭建,最终的目标是对用户昵称信息做聚类分析,找出违规的昵称.聚类分析需要一个距离,用来衡量两 ...

  7. Java:计算地球上两个经纬度坐标之间的距离-geodesy和geotools实现

    目录 方式一:自定义公式计算 方式二:geodesy计算距离 方式三:geotools计算距离 两个点的经纬度 latitude纬度 longitude经度 地点 22.678611 113.8056 ...

  8. Java计算两点间经纬度距离(两种方式)

    反余弦计算方式: private static final double EARTH_RADIUS = 6371000; // 平均半径,单位:m:不是赤道半径.赤道为6378左右 public st ...

  9. 利用Java计算一光年的距离

    计算一光年的距离 public class LightYear {public static void main(String[] args) {int speed = 300000;long sec ...

  10. Java对接高德地图计算距离_高德地图计算两点之间的距离java+html

    高德地图现在使用比较多了,但是高德地图计算两点之间的距离有些问题.下面提供一个很好的解决方案. 代码如下: /** * 两点的经纬度获取两点距离米 * @param (121.293986,37.27 ...

最新文章

  1. App Tracking Transparency被拒解决
  2. python 指针_python入门指针
  3. 成本计算引擎动态规则解析技术详解
  4. JavaFX官方教程(四)之Hello World,JavaFX样式
  5. Java ArrayDeque
  6. PCA(主成分分析)的简单理解
  7. 为什么要减少代码中该死的 if else 嵌套
  8. dockerfile安装jenkins 并配置构建工具(node、npm、maven、git)
  9. 修改数据库密码的多种方法
  10. 数据结构实验三 线性表的链式存储结构及实现
  11. 线段树学习总结 - 关于猹 ACM 生涯的第一次受苦受难
  12. 知识图谱从入门到应用——知识图谱推理:基础知识
  13. python数据挖掘母亲和孩子身高预测_孩子身高预测公式 靠谱指数高达80分哦!
  14. PymongoDB报错MongoError: The dotted field .. is not valid for storage
  15. 弗洛伊德求最小简单环
  16. Android仿淘宝头条垂直滚动,垂直走马灯,公告
  17. 获取选中状态复选框的值并添加id
  18. MySQL记录的创建时间和修改时间
  19. 李宏毅机器学习之Deep Learning简介
  20. bit,B,KB,MB,GB,TB,PB分别是什么单位,换算是什么

热门文章

  1. python自动机器学习库auto_ml模块
  2. c# 拼接字符串换行_零基础小白学习:python之最详细字符串篇
  3. mysql where 中能否使用update_mysql – 可以在WHERE中执行UPDATE子句吗?
  4. c语言随机数加密,TC伪随机数加密解决方法
  5. 阿里云云计算 31在线实验--弹性伸缩(AS)初体验
  6. WKWebView终极指南
  7. 1081. 不同字符的最小子序列
  8. 138.复制带随机指针的链表
  9. nginx安装nginx-vts实现监控并打包镜像
  10. MapReduce实现大矩阵乘法