简单的验证码识别(opecv)
opencv版本: 3.0.0
处理验证码: 纯数字验证码 (颜色不同,有噪音,和带有较多的划痕)
测试时间 : 一天+一晚
效果: 比较挫,可能是由于测试的图片是在太小了的缘故.
原理:
验证码识别作为身份证号机器识别的一个衍生,夹杂了很多干扰的噪音,所以加大了二值化的难度。以及轮廓追踪的不好协调。
操作过程大过程有以下几个:
(1) 待测试的图片灰度化并二值化
(2)预先装载特征库(这里分为多样,形式不一)
(3)物体轮廓检测
(4)扫描待测图片,并进行特征码比对,匹配优先
处理图片展示:
代码演示:
#include<opencv2/opencv.hpp> #include <iostream>
#include <string> struct DataBase{
int value; //库特征对应的值
vector<Mat> sample; //特征库
DataBase(int var , Mat & sam){
value = var;
sample.push_back(sam);
}
}; typedef struct DataBase dataBase; //加载图片
bool loadImage(Mat &src , Mat &gray ,String &filename){ Mat cbgray ; //合成后图像
int chans; //bgR分量
src = imread( filename , true );
if( src.empty() ) return false;
chans = src.channels();
vector<Mat> bgR( chans ) ;
//分割通道
split(src,bgR);
//直方图均衡化
for(int chan= ; chan < chans ; ++chan ){
equalizeHist(bgR[chan] , bgR[chan]);
}
//单通道合并
merge(bgR , cbgray );
//灰度化
cvtColor(cbgray ,gray ,CV_RGB2GRAY);
return true ;
} //二值化
bool binImage(Mat& src , Mat& dst , int _size , int lparam ,int mediansize){
//采用自适应二值化
adaptiveThreshold(src,src,,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,_size , lparam);
//中值滤波
medianBlur(src,dst,mediansize);
return true;
} //装载特征库
/*通常来说这个应该是预先被加载好,以数据库或者其他的形式保存起来
在这地方由于东西比较少,直接现场处理
*/
int loadProperty(vector<dataBase> &db ,int index[]
, int _size = , int lparam = , int mediansize = ){ //固定路径
char filename[]; for(int i=; i< ; ++i){
sprintf(filename,"D:\\yzm\\tzk\\%d.png",index[i]);
Mat tmp;
String path =filename;
loadImage(tmp,tmp,path); //装载并灰度化
binImage(tmp,tmp,_size,lparam,mediansize); //二值化
//imshow("sample",tmp);
//waitKey(0);
db.push_back( dataBase( index[i]% , tmp ) );
} return true;
} //对于模块进行匹配
int StartMatch(Mat src , vector< dataBase > db , Point &curpx){ int res ;
double maxValue , minValue ,resValue ;
Point minloc , maxloc ,resloc; vector< dataBase >::iterator it;
vector< Mat >::iterator m_it; Mat sample ,result;
int curcols , currows;
resValue =.; for( it = db.begin() ; it !=db.end() ; it++ ){ for( m_it = it->sample.begin() ; m_it != it->sample.end() ; m_it++ ){ sample = *m_it;
int res_rows = src.rows - sample.rows + ;
int res_cols = src.cols - sample.cols + ;
if( res_rows < || res_cols< ) break;
result = cv::cvarrToMat(cvCreateImage(cvSize(res_cols, res_rows), , )); matchTemplate(src, sample , result ,CV_TM_SQDIFF_NORMED); //模板匹配算法,平方差匹配 minMaxLoc(result, &minValue, &maxValue, &minloc, &maxloc,Mat() );
if(resValue > minValue){
resValue = minValue;
resloc = minloc;
res = it->value; //记录这个值的大小
curcols = sample.cols;
currows = sample.rows;
}
}
} // rectangle(srcResult, matchLoc, cvPoint(matchLoc.x + curtemplatW, matchLoc.y+ curtemplatH), cvScalar(0,0,255));
//设定一个阈值
if(resValue<0.2){
//++curpx.x;
curpx.x += resloc.x + curcols/.;
rectangle(src,resloc,cvPoint(resloc.x + curcols , resloc.y + currows ),cvScalar(,,));
}
else{
++curpx.x;
res=-;
}
return res;
} //逐步的扫描
vector< int > ScanImage( Mat &src , vector< dataBase > db , int window_width= ,int window_height= ){ Point srcp; window_height = src.rows;
vector< int > ans ;
while(srcp.x<src.cols){ if(srcp.x + window_width > src.cols)
window_width = src.cols - srcp.x;
Mat tmp = src( Rect(srcp.x,srcp.y,window_width,window_height) ); //轮廓检测
/* vector< vector <Point> >reg;
Mat newtmp = tmp.clone();
findContours(newtmp, reg,CV_RETR_EXTERNAL , CV_CHAIN_APPROX_NONE);
if( reg.empty() ) break;
Rect rect = boundingRect(Mat(reg[0]));
Mat ttmp = tmp(rect);
imshow("ttmp",ttmp);
waitKey(0);*/ int ansvalue =StartMatch(tmp,db,srcp);
if(ansvalue !=-){
ans.push_back( ansvalue);
printf("%d ",ansvalue);
}
}
puts("");
return ans;
} int main()
{ Mat check;
vector< dataBase > dblist;
int dex[];//{0,1,2,3,4,5,6,7,8,9}; //建立一个索引
for(int i=;i< ; dex[i]=i++);
loadProperty(dblist,dex,,,); for(int i=;i<;i++)
{
char path[]; if(i<) sprintf(path,"D:/yzm/%d.jpg",i+);
else sprintf(path,"D:/yzm/%d.png",i-); loadImage(check,check,String(path));
imshow("check",check);
waitKey(); binImage(check,check,,,); ScanImage(check,dblist,,);
imshow("final",check);
waitKey();
}
waitKey();
return ;
}
可能是由于测试的图片太小了,导致二值化的时候,图片很不理想,只好取消轮廓检测,然后改为手动设置窗口大小,虽然比较原始,,但是对于比较清晰的图片多能较好的
识别出来!
简单的验证码识别(opecv)的更多相关文章
- 基于SVM的python简单实现验证码识别
验证码识别是一个适合入门机器学习的项目,之前用knn 做过一个很简单的,这次用svm来实现.svm直接用了开源的库libsvm.验证码选的比较简单,代码也写得略乱,大家看看就好. 1. 爬取验证码图片 ...
- 使用TensorFlow 来实现一个简单的验证码识别过程
本文我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 1.验 ...
- 使用python及工具包进行简单的验证码识别
相信大家利用 Python 写的爬虫应该遇到过要输入验证码的尴尬局面,又或者写了个自动填充表单的小程序,结果就卡在了验证码上. 在ctf中有⼀一些题⽬目,本身有弱验证码识别绕过,那么我们怎么解决呢? ...
- 使用python以及工具包进行简单的验证码识别
识别数字验证码 首先我们准备素材,4张验证码图片如下: 第一步: 打开图像. im = Image.open('temp1.jpg') 第二步: 把彩色图像转化为灰度图像.彩色图像转化为灰 ...
- 使用tensorflow搭建自己的验证码识别系统
目录 准备验证码数据 保存为tfrecords文件 验证码训练 学习tensorflow有一段时间了,想做点东西来练一下手.为了更有意思点,下面将搭建一个简单的验证码识别系统. 准备验证码数据 下面将 ...
- python 简单图像识别--验证码
python 简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便( ...
- Pyhthon爬虫其之验证码识别
背景 现在的登录系统几乎都是带验证手段的,至于验证的手段也是五花八门,当然用的最多的还是验证码.不过纯粹验证码识已经是很落后的东西了,现在比较多见的是滑动验证,滑动拼图验证(这个还能往里面加广告).点 ...
- 简单验证码识别(matlab)
简单验证码识别(matlab) 验证码识别, matlab 昨天晚上一个朋友给我发了一些验证码的图片,希望能有一个自动识别的程序. 1474529971027.jpg 我看了看这些样本,发现都是很规则 ...
- 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...
随机推荐
- CSS学习之道
@media的IE-hacks,精彩绝伦 http://blog.keithclark.co.uk/moving-ie-specific-css-into-media-blocks/
- Active MQ 传输 ObjectMessage 异常
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFa ...
- POJ 3233 Matrix Power Series(构造矩阵求等比)
Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. ...
- angular学习之关于ng-class详解
1,定义和用法 ng-class 指令用于给 HTML 元素动态绑定一个或多个 CSS 类. ng-class 指令的值可以是字符串,对象,或一个数组. 如果是字符串,多个类名使用空格分隔. 如果是对 ...
- CSS样式基础二
一.列表 主要分为有序列表ol,无序列表ul <ul> <li></li> ... </ul> <ol> <li></li ...
- this的问题
javascript this可以绑定到:全局对象,自己定义的对象,用构造函数生成的对象,通过call或者apply更改绑定的对象 1.全局对象 1 2 3 4 5 function glob ...
- 解决对含有第三方jar包的项目打包出现java.lang.NoClassDefFoundError问题
用eclipse普通的打包方式,对含有第三方jar包的项目进行打包.调用方法后一只出现java.lang.NoClassDefFoundError问题. 从网上搜寻,很多都是在MANIFEST.MF文 ...
- No identities are available for signing的解决方法
今天将做好的app提交到app store,结果就出现标题上的错误.“No identities are available for signing”.这个错误对于一个iOS开发者来说已经很平常了,这 ...
- centos6.x开机卡死
问题描述: centos6.x开机卡死在进度条处 远程登录,查看系统日志,看看卡在哪儿 通过远程连接,tail -fn 20 /var/log/messages 发现报错: init: prefdm ...
- jdk 设计模式
摘自:http://blog.csdn.net/bakeloar/article/details/6608806