1.Template Matching(模板匹配)
模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。OpenCV提供了一个函数cv2.matchTemplate()。它只是在输入图像上滑动模板图像(如在2D卷积中),并比较模板图像下的输入图像的模板和补丁。在OpenCV中实现了几种比较方法。它返回一个灰度图像,其中每个像素表示该像素的邻域与模板匹配的程度。
假设输入图像的大小(WxH)且模板图像的大小(wxh),则输出图像的大小为(W-w + 1,H-h + 1)。获得结果后,可以使用cv2.minMaxLoc()函数查找最大/最小值的位置。将其作为矩形的左上角,并将(w,h)作为矩形的宽度和高度。那个矩形是你的模板区域匹配后得到的区域。
2.匹配实例
找出一张电路的图像中,指定的芯片,并标记出来
运行效果
img
3. API
用法
cv2.matchTemplata(img_big,img_temp,cv2.method)
img_big:在该图上查找图像
img_temp:待查找的图像,模板图像
method: 模板匹配的方法
关于参数 method:
4.与多个对象匹配的模板
在上一实例,搜索了芯片的图像,该图像仅在图像中出现一次。如果正在搜索的图像中有多个对象出现,cv2.minMaxLoc()就不会为提供模板图像所有位置。在这种情况下,可以使用阈值来匹配多个对象。在这个例子中,使用了游戏Mario的截图,会在其中找到硬币并标记出来。
运行效果
img
说明
python3数组的倒序 a[::-1]
>>> list = [1,2,3,4,5,6]
>>>print(list[::-1])
[6, 5, 4, 3, 2, 1]
>>>arry = ([1,2,3],[4,5,6])
print(arry[::-1])
([4, 5, 6], [1, 2, 3])
python3 zip() 函数
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
不同阀值下匹配出的数
识别网易易盾滑动验证码
threshould = 0.4
103个,好多位置并不准确,当然有一个最准确的位置就在其中
img
threshould = 0.57
只有1个,并且准确的找出位置
img
threshould = 0.6
一个都没有
img
网易易盾验证码的识别
写这篇教程不是空穴来风,是我在学习爬虫的过程中,遇到滑动验证码的识别,遇到了问题
可以看到,已经能够识别出准确的位置,配和selenium滑动滑块,就能破解滑动验证码了。
但在实际过程中,是不知道会出现什么画面的验证码,不同的图像,颜色,透明度是不一样,阀值也就不一样。而只有找到准确的阀值才能得到准确的位置。
如何动态的分析不同图片的阀值
从上面的实例可以发现阀值越小,结果就越多,阀值越大,结果越少,甚至没有结果。阀值介于[0,1],因此通过循环用二分法去试一试,当结果有且只有一个的时候,得到的threshould便是我们想要的,再通过threshold获取位置信息
阈值始终为区间左端和右端的均值,即 threshhold = (R+L)/2;
如果当前阈值查找结果数量大于1,则说明阈值太小,需要往右端靠近,即左端就增大,即L += (R - L) / 2;
如果结果数量为0,则说明阈值太大,右端应该减小,即R -= (R - L) / 2;
当结果数量为1时,说明阈值刚
代码实现
img
小结
通过OPencv的模板识别功能,并且用二分法对针实际场景进行二次开发,后面会利用这里的知识点,对网易易盾滑动验证码进行破解。代码已经上传到github。
投喂我
领取专属 10元无门槛券
私享最新 技术干货