最近工作中开始使用opencv来做一些跟图像相关的机器学习项目,开始对图像处理产生浓厚的兴趣。搜索资料的时候偶然看到有一些使用opencv读取摄像头的小demo,在输入烦人的阿里云数加身份宝验证码的时候,突发奇想,为何不用摄像头自动识别验证码,实现快速输入。当然,出于学习目的可以用摄像头来输入,如果是公司里,追求短平快和稳定,直接对手机截屏进行识别才是正路。
说干就干,公司台式机没有摄像头,先买一个。19块的看上去有点low,太便宜的一个是担心容易坏,另外是担心拍出来字符不清晰。29的看上去还可以,
再加10块可以买个好看点的,跟公司的显示器气质比较搭。所以最终败了这个:
避免广告嫌疑,牌子就不说了。
免驱,安装后到硬件管理器把音频禁用掉,反正只需要摄像头。
硬件到手,来列一下接下来我们需要完成的任务:
- 使用opencv获取到摄像头的图片
- 正确抠出我们需要识别的数字区域(ROI,region of interest)
- 用机器学习的方法,正确识别图片上的数字
- 起一个http服务,方便调用
- 写一个浏览器小脚本,自动调用我们的http识别服务获取到6位验证码。
整体流程如下图
opencv读取摄像头
我们的需求比较简单,从
http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html
这里找到的一个代码框架完全够用了。
开发的时候可以先从摄像头截取几张图来调试代码。这样图片是固定的,方便debug和调整参数。然后根据相机方向旋转图像。opencv没有直接旋转90度,180度这种函数,但是简单的组合transpose和flip可以实现。
ROI识别
找到了几篇相关的文章,比如这篇。但是没有完整的代码,所以自己简单尝试一下吧。
基本思路是
步骤 | 对应的opencv函数 |
---|---|
1.图片黑白二值化 | cv2.cvtColor(image, cv2.COLOR_BGR2GRAY); cv2.threshold |
2.找contours | cv2.findContours |
3.从contours框出对应的boundingBox |