Learning Man's Blog

OpenCV 初接触

字数统计: 680阅读时长: 2 min
2018/12/30

利用方式

在利用方面主要根据场景不同而有所区别,以滑动验证码为例

  1. 有完整的图像 and 缺口背景图像 -> 像素亦或的边缘识别 or 模板匹配
  2. 缺口背景图像 and 滑块图像 -> 模板匹配
  3. 滑块图像边缘 or 缺口边缘 具有可计算特征 -> 特征边缘识别 (案例

举例

P.S. 因为才开始学习,限于知识面,可能会有一些更方便快捷的方法而不知,请见谅。

  1. 以刚接触的数美来说,提供的是缺口背景图像 and 滑块图像,所以利用模板匹配来尝试识别


  2. 实际上滑块图片为了方便与背景图缺口高度一致,上下采用的透明色,透明部分不处理可能会导致奇怪的匹配(灰度图下透明部分为黑)

  3. 为了减小透明部分在灰度下匹配可能产生的影响,第一步就需要对透明部分进行裁剪,有两种方法边缘检测轮廓检测,简单来说前者检验图形的外层边缘,而后者除了外层边缘还会勾画内层结构,两者对比如下

    1. 边缘检测 Canny

    2. 轮廓检测 findContours

    3. Canny + findContours

  4. 采用第三种方法获取轮廓后,我们需要需要对主体部分进行切割,最简单的的办法就是通过轮廓面积排序,获取最大的那个

     maxContour = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
  5. 再通过minAreaRect方法获取最小外接矩形,再利用boxPoints方法获取外接矩形的四个顶点坐标,这样就可以获取滑块的大致图像

     rect = cv2.minAreaRect(c)
     points = np.int0(cv2.boxPoints(rect))
  6. 模板匹配matchTemplate,每个像素点有一个匹配程度,可通过np.where筛选阈值,但是经过测试,阈值是根据图像有所变化的,如果需要精确度的话可以通过二分法获取

     cv2.matchTemplate(image, templ, cv2.TM_CCOEFF_NORMED)

    第三个参数是匹配算法,可查看此文档进行了解

  7. 最终效果,因最需要数据的是左边的x坐标,而缺口特征也比较明显,所以在裁剪时舍弃了部分滑块右侧凸图像

  8. 在最后获取x轴时,需要考虑裁剪时候所带来的误差

  9. 因为滑块内图像容易和边界颜色部分重合,否则可以考虑经过腐蚀、膨胀等手段优化边界检测

参考资料

  1. https://blog.csdn.net/liqiancao/article/details/55670749
  2. http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#opencv
  3. http://ex2tron.wang/categories/机器视觉/
CATALOG
  1. 1. 利用方式
  2. 2. 举例
  3. 3. 参考资料