-
2020-02-28 11:31:37
前面学习过模板识别的函数,也演示过它的使用,但是还是不少学生来问我能不能用它来开发游戏的外挂,我的回答应该是肯定的。因为游戏是一种图形的展示,使用窗口的方法来识别已经不可能,根据位置识别只能固定的目标,比如移动的妖怪,要想杀它,必须把它不断移动的位置找到,然后在那里点击鼠标的动作。要实现这个过程,要先使用操作系统的功能,实现抓屏,比如抓屏的内容如下图:
这个就游戏的屏幕内容了,现在我们找一个目标,比如要找到上图里两个问号的位置,以便角色可以到那里碰触它。在这里就遇到问题了,就是怎么样找到问号所在的位置,因为游戏里物体的位置不断地变化的。这时就需要使用OpenCV里提供的模板识别的功能,当然要使用这个功能之前,你得把游戏运行一下,把需要的界面保存起来,然后再从这些图片截取你需要的小图片,这些小图片,就是需要查找的模板。比如这里,我截取的小图片如下:
更多相关内容 -
极验点选验证码位置识别(一):点选验证码位置识别技术总览
2021-12-13 16:17:05极验点选验证码位置识别(一):点选验证码位置识别技术总览 声明 一、技术栈 1. 验证码图片下载 2. 验证码图片预处理 3. 标签图分割 4. 背景图图标标注 5. 背景图图标训练&识别 5. siamese network模型训练 6. ...极验点选验证码位置识别(一):点选验证码位置识别技术总览
声明
原创文章,请勿转载!
本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。
本文关联文章超链接:
近期文章更新会慢一些,工作有些忙,再加上点选的识别数据集要重新做处理。太难了。
说多了都是泪,本来极验点选上个月已经破解了,准备写文章的,然后就先写了极验滑块系列的文章。回头一看点选的,卧槽,验证码图片更新了,得重新调整解决方案了。
一、技术栈
不管是极验还是其他厂家的点选验证码,都是一样的。首先要做的就是得到验证码中图标的位置和顺序信息。有了这两样,点选验证码不就和之前介绍的滑块验证码一样了吗,只需要破解对鼠标轨迹进行加密的js就行了。
本系列文章以极验为例,讲解整个点选验证码的识别到js破解的过程,小伙伴们耐心看完。1. 验证码图片下载
因为后期会用到图片识别技术,所以需要下载大量的图片验证码,用作训练集。
2. 验证码图片预处理
将验证码图片分割成背景图和标签图,并分别做一系列预处理,提高后期图片识别准确率。
3. 标签图分割
标签图是我们要点击的图形验证码顺序,首先要将标签图中每个标签分离出来。可以看到每个标签之间还有粘连在一起的部分,因此此步骤需要用openCV对标签做图像边缘检测、分离技术。
4. 背景图图标标注
使用labelImg工具对背景图中的待检测图标进行标注,生成训练集。
5. 背景图图标训练&识别
本系列文章采用yolo5目标检测模型,检测出背景图中的图标。
5. siamese network模型训练
采用孪生神经网络模型训练第4步骤(背景图图标)和第3步骤(标签图图标)图片的相似度。
6. 相似度结果解析
对第5步骤返回的结果,对相似度进行排序,得到点选验证码的顺序和坐标。
二、结语
友情链接:极验点选验证码位置识别(二):验证码图片下载&数据集预处理(还未更新)
本期文章结束啦,如果对您有帮助,记得收藏加关注哦,后期文章会持续更新 ~~~
-
使用Opencv实现魔方识别(一):边缘及位置识别
2019-08-03 20:29:39本文将描述如何使用Opencv识别从摄像头抓取的魔方图片内魔方的各个方块边缘以及位置,用于后续的颜色的识别。 安装opencv Pycharm支持从界面选择安装python包,在文件菜单下选择设置项,然后如下图找到安装界面: ...之前做魔方机器人,使用的是人工输入默认的各个表面方块颜色分布,不够方便与智能,因此开始研究使用摄像头识别魔方。Opencv基本是首选而且方便简单的工具。本文将描述如何使用Opencv识别从摄像头抓取的魔方图片内魔方的各个方块边缘以及位置,用于后续的颜色的识别。
安装opencv
Pycharm支持从界面选择安装python包,在文件菜单下选择设置项,然后如下图找到安装界面:
需要用到的安装包列表:numpy,Matplotlib,opencv-python边缘检测
从摄像头抓取的原图如下:
灰化去除颜色信息
代码:
import cv2 import numpy as np from copy import deepcopy import math imgobj = cv2.imread('1.jpg') gray = cv2.cvtColor(imgobj, cv2.COLOR_BGR2GRAY) cv2.namedWindow("image") cv2.imshow("image", gray) cv2.waitKey(0)
效果如下:
高斯模糊扩大边缘效果
代码:
blurred = cv2.GaussianBlur(gray, (3, 3), 0) cv2.imshow("image", blurred) cv2.waitKey(0)
效果如下:
Canny算法实现边缘检测
Canny边缘检测是一种非常流行的边缘检测算法,是John Canny在1986年提出的。具体可以参考:
https://en.wikipedia.org/wiki/Canny_edge_detector代码:
canny = cv2.Canny(blurred, 20, 40) cv2.imshow("image", canny) cv2.waitKey(0)
效果如下:
边缘线膨胀化
canny检测的边缘线很细,使得同一边缘有多个边缘线,这里可以用opencv dilate函数,使边缘线膨胀化,这样同一边缘的多个边缘线即可合并成同一条线。
代码:
kernel = np.ones((3,3), np.uint8) dilated = cv2.dilate(canny, kernel, iterations=2) cv2.imshow("image", blurred) cv2.waitKey(0)
效果如下:
去除多余边缘
膨胀化后,可以看到很多魔方外的物体边缘,以及魔方内的小边缘,这些都需要去除。通过计算闭合边缘的面积以及中心点的位置,可以判断出哪些是魔方的边缘,哪些是多余的边缘。
在计算面积与中心点时,需要对闭合边缘使用approxPolyDP函数进行多变拟合。findContours为遍历提取所有的闭合区域,arcLength为计算闭合区域的周长,contourArea计算闭合区域的面积。
代码:(contours, hierarchy) = cv2.findContours(dilated.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) candidates = [] hierarchy = hierarchy[0] index = 0 pre_cX = 0 pre_cY = 0 center = [] for component in zip(contours, hierarchy): contour = component[0] peri = cv2.arcLength(contour, True) approx = cv2.approxPolyDP(contour, 0.1 * peri, True) area = cv2.contourArea(contour) corners = len(approx) # compute the center of the contour M = cv2.moments(contour) if M["m00"]: cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) else: cX = None cY = None if 14000 < area < 20000 and cX is not None: tmp = {'index': index, 'cx': cX, 'cy': cY, 'contour': contour} center.append(tmp) index += 1 center.sort(key=lambda k: (k.get('cy', 0))) row1 = center[0:3] row1.sort(key=lambda k: (k.get('cx', 0))) row2 = center[3:6] row2.sort(key=lambda k: (k.get('cx', 0))) row3 = center[6:9] row3.sort(key=lambda k: (k.get('cx', 0))) center.clear() center = row1 + row2 + row3 for component in center: candidates.append(component.get('contour')) cv2.drawContours(imgobj, candidates, -1, (0, 0, 255), 3) cv2.imshow("image", imgobj) cv2.waitKey(0)
效果如下:
通过效果图,对于魔方的边缘及位置识别基本正确,后续即可对识别区域内的颜色进行分析,会在后续文章中进行。 -
opencv实现简单手指位置识别
2017-06-19 22:21:39整体思路:1.过滤噪声2.由于RGB颜色的离散性转换为HSV通道3.对HSV空间进行量化,得到2值图像,亮的部分为手的形状4.去除杂点造成的伪轮廓,留下手的真实轮廓5.对凸出点连线6....将MFC实现部分给省略了,给出了完整的...整体思路: 1.过滤噪声 2.由于RGB颜色的离散性转换为HSV通道 3.对HSV空间进行量化,得到2值图像,亮的部分为手的形状 4.去除杂点造成的伪轮廓,留下手的真实轮廓 5.对凸出点连线 6.最高点到底部中点的连线即为手指方向 //部分代码: 将MFC实现部分给省略了,给出了完整的opencv部分代码,可以参考实现。 int main() { cv::VideoCapture cap(0); if (!cap.isOpened()) { return -1; } // cv::Mat frame; cv::Mat frameHSV; // std::vector< std::vector<cv::Point> > OriginalContours;//轮廓 std::vector< cv::Vec4i > hierarchy; // 轮廓的结构信息 // std::vector< std::vector<cv::Point> > FinalContours;// 筛选后的轮廓 std::vector< cv::Point > hull; // 凸包络的点集 // CString Str; int i, j; int Width = cap.get(CV_CAP_PROP_FRAME_WIDTH), Height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); float fHeight = ((float)2 / 3 - (float)1 / 7) * Height; // while (0 == pDlg->m_bStopFlag) { cap >> frame; if (frame.empty()) { break; } //左右翻转 cv::flip(frame, frame, 1); //中值滤波,用了这个下面的其他滤波全部异常 //medianBlur(frame, frame, 10); //高斯滤波 cv::GaussianBlur(frame, frame, cv::Size(7, 7), 1.5, 1.5); //通道转换 cv::cvtColor(frame, frameHSV, CV_BGR2HSV); //imshow("frameHSV", frameHSV); /* S = 符号整型 U = 无符号整型 F = 浮点型 E.g.: CV_8UC1 是指一个8位无符号整型单通道矩阵, CV_32FC2是指一个32位浮点型双通道矩阵 CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1 CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2 CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3 CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4 CV_32SC1 CV_32FC1 CV_64FC1 CV_32SC2 CV_32FC2 CV_64FC2 CV_32SC3 CV_32FC3 CV_64FC3 CV_32SC4 CV_32FC4 CV_64FC4 */ // 对HSV空间进行量化,得到2值图像,亮的部分为手的形状 cv::Mat mask(frame.rows, frame.cols, CV_8UC1); //inRange(frameHSV, cv::Scalar(0, 30, 30), cv::Scalar(40, 170, 256), mask); inRange(frameHSV, cv::Scalar(5, 30, 30), cv::Scalar(40, 170, 256), mask); // // 腐蚀:去除小亮点 膨胀:连接区块 cv::erode(mask, mask, cv::Mat(5, 5, CV_8U), cv::Point(-1, -1), 1); //cv::dilate(mask, mask, cv::Mat(5, 5, CV_8U), cv::Point(-1, -1), 2); //imshow("frameHSV", frameHSV); //imshow("mask", mask); OriginalContours.clear(); hierarchy.clear(); FinalContours.clear(); // 得到手的轮廓 cv::findContours(mask, OriginalContours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); // 去除伪轮廓 for (i = 0; i < OriginalContours.size(); i++) { if (fabs(cv::contourArea(cv::Mat(OriginalContours[i]))) > 25000) { FinalContours.push_back(OriginalContours[i]); } } // 画轮廓 cv::drawContours(frame, FinalContours, -1, cv::Scalar(0, 0, 255), 3); // 得到轮廓的凸包络 int hullcount; int iNumOfContours = FinalContours.size(); cv::Point top; for (j = 0; j < iNumOfContours; j++) { convexHull(cv::Mat(FinalContours[j]), hull, true); hullcount = (int)hull.size(); // for (i = 0; i<hullcount - 1; i++) { cv::line(frame, hull[i + 1], hull[i], cv::Scalar(255, 0, 0), 2, CV_AA); } cv::line(frame, hull[hullcount - 1], hull[0], cv::Scalar(255, 0, 0), 2, CV_AA); //画点 GetTopPoint(hull, hullcount, top); cv::line(frame, top, top, cv::Scalar(255, 0, 255), 18, CV_AA); cv::line(frame, top, cv::Point(Width/2, Height), cv::Scalar(0, 255, 255), 2, CV_AA); // if (1 == iNumOfContours) { pDlg->m_FingerPosition.bChanged = 1; pDlg->m_FingerPosition.top = ((float)top.y - (float)Height / 7) / fHeight; pDlg->m_FingerPosition.left = (float)top.x / (float)Width; } } // cv::line(frame, cv::Point(0, Height / 7), cv::Point(Width, Height / 7), cv::Scalar(255, 255, 255), 2, CV_AA); cv::line(frame, cv::Point(0, 2 * Height / 3), cv::Point(Width, 2 * Height / 3), cv::Scalar(255, 255, 255), 2, CV_AA); imshow("frame", frame); cv::waitKey(33); } return 0; }
实验效果图
-
位置识别(place recognition)和回环检测(Loop closure detection)之间的关系
2020-01-05 21:29:161. 位置识别是回环检测的重要组成部分 回环检测包括可以两部分:外观识别(位置识别)与几何识别(误匹配剔除,如RANSAC) 位置识别,即外观验证,通过图像间的相似度信息进行判断; 几何验证,通过回环候选帧与当前... -
基于python及图像识别的围棋棋盘棋子识别2——定位棋子位置及识别棋子颜色
2021-07-05 09:42:11最近在做一个围棋棋盘棋子识别项目,这是该项目第二篇,第一篇见:1、基于python及图像识别的围棋棋盘棋子识别1——定位棋盘位置 , 基于python及图像识别的围棋棋盘棋子识别2——定位棋子位置及识别棋子颜色1、将... -
识别滑块缺口位置
2019-08-30 01:15:24今天我要做的就是识别大部分滑块的缺口位置。 开始 现在的滑块缺口基本分为两种,一种是极验系的,提供原图和带缺口的背景图,另一种就是只有滑块图片和带缺口的背景图,网易系。 先感受一下它们的图片风格 极验系: ... -
Python-Opencv 识别滑块验证码缺口位置
2022-01-20 11:13:23Python-Opencv 识别滑块验证码缺口位置 本章非常简单,就是放图片放源码,开篇即用,小伙伴只需要针对需要破解的验证码改一下参数就行,这边太复杂的除外 这是我的验证码 以下是代码和结果 import cv2 import base... -
加速度传感器的原理和应用-手机翻转、失重检测、运动检测、位置识别
2016-02-21 14:28:29讲解加速度传感器(LIS3DH)的工作原理和应用,如静止运动检测、失重检测、手机翻转识别、位置识别等等。 -
总结(/Review): 回环检测中的位置识别(Place Recognition)
2018-08-06 22:21:23回环检测的关键在于重新识别到同一个地方,这块领域被称为位置识别(Place Recognition)。 此文主要总结大视角变化和场景变化中的位置识别。 位置识别中的一些概念 位置识别模块分为三个部分:图像处理部分;已知... -
pytesseract识别中文并获得中文的位置信息(Bounding Box)
2019-09-14 15:05:51pytesseract识别中文并且获得识别的字符的位置信息,识别中文随便找找就能找到相关资料,但是获得位置信息的中文资料有点少呀,下面通过学习这个获得了怎么得到位置信息的方法了。总体来说有两个方法。一个是image_... -
如何全网智能识别文章页,识别正文和标题
2019-09-24 09:21:22先说说神箭手的情况吧,这个问题我们很久之前就开始研究了,一直期待能做到一个优秀的效果,就像友商@Jerry黄大仙 说的一样,新闻场景中的正文标题识别确实是相对好做的,可以直接hard coding一些特征。因为新闻标题... -
滑块验证码的识别
2021-11-10 15:30:08滑块验证码的识别前言一、滑块验证码的形式二、采用的方法1.滑块图、背景图切分2.模板匹配总结 前言 最近在一个比价的公司实习,公司里面主要使用爬虫来获取一件商品在其他平台的价格。但是在大部分的时候别的平台... -
加速度传感器的原理和应用:手机翻转、失重检测、运动检测、位置识别
2016-06-07 19:09:52Lis3dh有两种工作方式,一种是其内置了多种算法来处理常见的应用场景(如静止检测、运动检测、屏幕翻转、失重、位置识别、单击和双击等等),用户只需简单配置算法对应的寄存器即可开始检测,一旦检测到目标事件,... -
OpenCV-Python学习笔记(使用opencv识别物体的位置,找到中心点位)
2019-11-18 16:13:21使用opencv识别物体的位置,找到中心点位: 步骤:先拿到图像-->进行高斯滤波-->进行灰度处理-->进行二值化-->进行开运算-->轮廓提取-->计算中心点位 效果图如下: 代码如下: import cv2 ... -
【图片识别】滑块缺口定位
2021-11-15 10:07:50刚好array里的数值是20位,并且是从原点位置开始,吧当前切片移动到array对应的位置,大于9的会进入下一行 然后通过opencv对图片进行剪切拼接,即可得到原图 三、缺口定位 图片还原后,由于缺口位置有一个明显的矩形... -
极验第四代滑块验证码破解(二):滑块缺口识别
2022-01-07 15:01:10极验第四代滑块验证码破解(二):滑块缺口识别声明 声明 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 本文关联文章超链接: -
Python识别图片指定区域文字内容
2019-02-27 17:08:05Python批量识别图片指定区域文字内容简介所需Python模块Python代码 简介 对于一张图片,需求识别指定区域的内容 截取原始图上的指定图片当做模板 根据模板相似度去再原始图片上识别...用于识别模板再原始图的位置坐... -
二维码识别的原理?
2020-07-07 08:40:25点击上方“3D视觉工坊”,选择“星标”干货第一时间送达整理:公众号@图像处理与计算机视觉本文仅做学术分享,如有侵权,请联系删除。二维码的特征定位和信息识别背景介绍视觉的方法可以用来估计位... -
识别图片地点_地点识别
2020-07-20 05:19:40识别图片地点Imagine this scenario: you catch-up with a friend who’s returned from a trip to India. You’ve traveled extensively through India and recommended your friend to holiday there. When you ... -
OpenCV识别图形以及常用函数处理
2019-07-07 20:34:35因此可以用来人脸识别、图形识别、文字识别等等。对于复杂一点识别的可能还涉及到大量的识别训练,最后的匹配比较分类等等。后续可能会介绍文字识别、人脸识别等等。 图形识别 图形识别指的是对常见的几何图形进行... -
二维码识别与定位-方法1-利用ar_track_alvar
2021-10-11 09:00:31二维码识别作为一种快捷准确的技术已经应用与生活中的购物支付、物体识别及工业AGV导航等领域,在OpenCV3.4.4版本上均提供了相应的函数cv::QRCodeDetector::detectAndDecode()用于二维码的检测和解析,但是在ROS... -
python实现批量图片文字识别(ocr)
2021-07-30 07:52:47最近有ocr方面的需求,而且是批量的,python能不能干这么件事呢,肯定是可以的,...'''使用时只需要修改百度智能云接口,位于baiduOCR函数,和图片存放位置,位于倒数第三行''' def baiduOCR(outfile): """利用百度ap -
利用python-opencv对LED数码管显示数字进行有效识别
2020-07-17 13:06:34因为项目原因,现在要搞一个LED数码管的数字识别,识别包含各种各样的数码管,需要做通用匹配的文件,主要是利用opencv的的函数调用,并结合段式数码管的发光物理特性进行有效识别。 在项目中因为需要匹配各种各样... -
python图像处理-形状提取和识别1(基于Hough的形状提取)
2022-03-29 20:30:56这里扩展了一个小程序(识别一张棋盘图片,利用角点检测得到棋盘参数,再利用形状提取得到棋子位置,将棋盘图片转换成矩阵,再利用棋子圆心的RGB识别,用矩阵中的1表示黑子,0表示白子。“后面会把这个小扩展单独写... -
图像处理之目标检测与识别
2020-07-07 16:30:13区别:目标检测是用来确定...但是这种特征会受到两个方面的影响:尺度问题、位置问题,为了解决这些问题,需要使用图像金字塔和滑动窗口。 图像金字塔 是图像的多尺度表示 滑动窗口 通过一个滑动窗口扫描较大图像的