图像识别解决方案(验证码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图像识别解决方案(验证码) 篇一:用于验证码图片识别的类
用于验证码图片识别的类(C#源码)
最近写了几个网站的验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别。但写得多了,也总结出不少相同之处。今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少。好东东不能独享,现放出来供大家共同研究,请网友们妥善用之。
封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,即可简单几句代码就可以实现图片识别了:GrayByPixels(); //灰度处理
GetPicValidByValue(128, 4); //得到有效空间
Bitmap[] pics = GetSplitPics(4, 1); //分割
string code = GetSingleBmpCode(pics[i], 128);//得到代码串
using
System;
using
;
using
using
;
using
;
using
;
using
;
namespace BallotAiying2
{
class
UnCodebase
{
public
Bitmap bmpobj;
public
UnCodebase(Bitmap pic)
{
bmpobj = new Bitmap(pic); //转换为Format32bppRgb
///
/// 根据RGB,计算灰度值
///
/// Color值
/// 灰度值,整型
private int
GetGrayNumColor( posClr)
{
return ( * 19595 + * 38469 + posClr .B * 7472) >> 16;
}
///
/// 灰度转换,逐点方式
///
public void
GrayByPixels()
{
for (int
i = 0; i {
for (int
j = 0; j {
int
tmpValue = GetGrayNumColor((j, i));
(j, i, Color
.FromArgb(tmpValue, tmpValue, tmpValue)); }
}
}
///
/// 去图形边框
///
///
public void ClearPicBorder(int
borderWidth)
{
for (int
i = 0; i {
for (int
j = 0; j {
if (i - 1 - borderWidth
|| i > - 1 - borderWidth)
(j, i, Color
.FromArgb(255, 255, 255));
}
}
}
///
/// 灰度转换,逐行方式
///
public void
GrayByLine()
{
Rectangle rec = new
Rectangle(0, 0, , );
BitmapData bmpData = (rec, , ); // );
// = ;
IntPtr scan0 = ;
int
len = * ;
int[] pixels = new int [len];
(scan0, pixels, 0, len);
//对图片进行处理
int
GrayValue = 0;
for (int
i = 0; i {
GrayValue = GetGrayNumColor(Color
.FromArgb(pixels[i]));
pixels[i] = (byte)((GrayValue, GrayValue, GrayValue)).ToArgb(); //Color转
byte
}
(bmpData);
}
///
/// 得到有效图形并调整为可平均分割的大小
///
/// 灰度背景分界值
/// 有效字符数
///
public void GetPicValidByValue(int dgGrayValue,
int
CharsCount)
{
int posx1 = ; int
posy1 = ;
int posx2 = 0; int
posy2 = 0;
for (int i = 0; i {
for (int
j = 0; j {
int
pixelValue = (j, i).R;
if (pixelValue {
if
(posx1 > j) posx1 = j;
if
(posy1 > i) posy1 = i;
if
(posx2 if
(posy2 };
};