java opencv 计算滑块横移距离
目标
滑块验证是现在用的较为普遍的验证是否为机器人的方案,也相对其他验证来说比较好破解的,因为只需要计算出滑块横移距离就行
思路
想要计算距离得知道如下几个数据,假设图片左下角为坐标原点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怎么玩了
处理背景图
- 将图片高斯模糊
- 灰度化处理
- 二值化处理
高斯模糊处理
// 读取背景原图
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);
到这里背景图处理完成
处理滑块图
- 灰度化处理
- 二值化处理
- 黑白像素反转
前两部代码和上面一样,处理之后结果
反转像素
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 计算滑块横移距离相关推荐
- MySQL计算坐标点之间距离
#计算两坐标点之间距离,单位米-- 经度相同,维度不同,结果大致相等 select st_distance_sphere(point(122.45,31.13), point(122.45, 31.9 ...
- java计算距离_java实现计算地理坐标之间的距离
java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 package com.jttx.poi.utils; import com.jttx.poi.entity.point; /** ...
- java坐标代码_java实现计算地理坐标之间的距离
java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 package com.jttx.poi.utils; import com.jttx.poi.entity.point; /** ...
- Java 根据经纬度计算两点间的距离
Java实现 public final class DistanceUtils {/*** 地球半径,单位 km*/private static final double EARTH_RADIUS = ...
- Java根据经纬度计算两点之间的距离
1. 前言 在我们平时使用美团,饿了么等app进行订餐,或者使用猫眼进行订电影票的时候,都有一个距离的排序,表明该家店距离我们当前的位置,这种基于地理位置的服务,统一被称为LBS(Location ...
- levenshtein java_Spark Java API 计算 Levenshtein 距离
Spark Java API 计算 Levenshtein 距离 在上一篇文章中,完成了Spark开发环境的搭建,最终的目标是对用户昵称信息做聚类分析,找出违规的昵称.聚类分析需要一个距离,用来衡量两 ...
- Java:计算地球上两个经纬度坐标之间的距离-geodesy和geotools实现
目录 方式一:自定义公式计算 方式二:geodesy计算距离 方式三:geotools计算距离 两个点的经纬度 latitude纬度 longitude经度 地点 22.678611 113.8056 ...
- Java计算两点间经纬度距离(两种方式)
反余弦计算方式: private static final double EARTH_RADIUS = 6371000; // 平均半径,单位:m:不是赤道半径.赤道为6378左右 public st ...
- 利用Java计算一光年的距离
计算一光年的距离 public class LightYear {public static void main(String[] args) {int speed = 300000;long sec ...
- Java对接高德地图计算距离_高德地图计算两点之间的距离java+html
高德地图现在使用比较多了,但是高德地图计算两点之间的距离有些问题.下面提供一个很好的解决方案. 代码如下: /** * 两点的经纬度获取两点距离米 * @param (121.293986,37.27 ...
最新文章
- App Tracking Transparency被拒解决
- python 指针_python入门指针
- 成本计算引擎动态规则解析技术详解
- JavaFX官方教程(四)之Hello World,JavaFX样式
- Java ArrayDeque
- PCA(主成分分析)的简单理解
- 为什么要减少代码中该死的 if else 嵌套
- dockerfile安装jenkins 并配置构建工具(node、npm、maven、git)
- 修改数据库密码的多种方法
- 数据结构实验三 线性表的链式存储结构及实现
- 线段树学习总结 - 关于猹 ACM 生涯的第一次受苦受难
- 知识图谱从入门到应用——知识图谱推理:基础知识
- python数据挖掘母亲和孩子身高预测_孩子身高预测公式 靠谱指数高达80分哦!
- PymongoDB报错MongoError: The dotted field .. is not valid for storage
- 弗洛伊德求最小简单环
- Android仿淘宝头条垂直滚动,垂直走马灯,公告
- 获取选中状态复选框的值并添加id
- MySQL记录的创建时间和修改时间
- 李宏毅机器学习之Deep Learning简介
- bit,B,KB,MB,GB,TB,PB分别是什么单位,换算是什么