Post

0802使用OpenCV识别滑动验证码

通过边缘算法( Canny Edge Detection)获取到图片的边缘特征,再通过面积、周长、位置排查出滑动缺口(OpenCV提供的功能)。

准备工作

  • 安装opencv-python:pip3 install opencv-python

用到的OpenCV功能:

cv2.GaussianBlur高斯模糊。

这里用高斯模糊的目的是去除干扰凸显边缘轮廓

  • src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片, 但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  • ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。
  • sigmaX,表示高斯核函数在X方向的的标准偏差。
  • sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
  • 返回值: 模糊后的image

cv2.Canny对图片进行边缘检测的

  • image:要检测的图像
  • threshold1:阈值1(最小值)
  • threshold2:阈值2(最大值),使用此参数进行明显的边缘检测
  • apertureSize:sobel算子(卷积核)大小
  • L2gradient :布尔值。 True:使用更精确的L2范数进行计算(即两个方向的导数的平方和再开方)False:使用L1范数(直接将两个方向导数的绝对值相加)
  • 返回值:一组数组表示边缘

cv2.findContours对边缘轮廓提取

  • image:图片
  • mode:轮廓的检索模式
    • RETR_EXTERNAL表示只检测外轮廓
    • RETR_LIST检测的轮廓不建立等级关系
    • RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这物体的边界也在顶层。
    • RETR_TREE建立一个等级树结构的轮廓。
  • method:定义轮廓的近似方法
    • CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
    • CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
    • CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
  • 返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。

cv2.boundingRect用于计算包围给定点集或轮廓的最小矩形的函数。

  • 输入参数:点集或轮廓
  • 返回值: 包围输入点集或轮廓的最小矩形(x, y,width,height)。

cv2.contourArea计算轮廓面积

  • contour:轮廓
  • oriented:方向标识(s顺时针还是逆时针,True/False)

cv2.arcLength计算轮廓的周长

  • curve:轮廓
  • closed:轮廓是否封闭

同类算法

This post is licensed under CC BY 4.0 by the author.