高难度问题--识别"验证码",怎样获取验证码图片,并且将图片转换成数字
我想做一个小程序,自动登陆移动网上营业厅.但是登陆时必须输入验证码,这也是这个程序比较难的部分了
首先,我感觉这张图片没有一个地址可以下载,程序不知该如何下手.怎样得到这张图片
然后,怎样分析这张图片,图片倒是比较简单,纯数字,而且字体很规范,并且没有额外噪点.
大家有兴趣并且愿意帮助我的,请到四川移动网上营业厅去看看:http://www.sc.chinamobile.com/service/
高分相赠
------解决方案--------------------帮顶一下吧
------解决方案--------------------验证码应该将随机字符画在图片中,最后将图片保存在流中,应该不容易吧
要是那么容易获取的话,很容易暴力破解了。
看看有高手回答没,顶下
------解决方案--------------------要用到图片的识别技术,现在的验证码的机制一直在变,一种就要调整很多次才能识别出来.
如果是随即散点的,就更难识别点了.
非常麻烦的,如果想登录,还是想注入方面的可能性.
------解决方案--------------------可以考虑验证码本身就是个一页面,在这个页面放一个有背景的图片,
然后随机生成一个字符串透明的覆盖在图片上,我试过,效果看起来也不错~~
------解决方案--------------------参考一下
http://bbs.zdnet.com.cn/thread-211944-1-1.html
这个验证码还是比较简单的
------解决方案--------------------http://blog.csdn.net/Qqwwee_Com/category/146600.aspx
------解决方案--------------------使用图像识别技术,或者数字识别(这个要简单点),可以通过神经网络来学习识别验证码,你可以在codeproject上面找找关于神经网络的文章,我记得有一篇专门讲的这个。。。
看这个网站的验证码很规则,而且没有干扰,应该有更简单的方法,你可以尝试一下:
1、为每个字母建立特征值库
2、获取图片流(必须在同一次请求中),将图片还原,分割出来单个的字母图片
3、从分割出来的图片中获得特征点的特征码
4、比较还原的图片和特征库中的特征码相同的则认为是对应的数字
上面的方法只适用于规则的验证码,不规则的验证码需要大量的特征信息,做起来很复杂。
------解决方案--------------------不懂帮顶
------解决方案--------------------http://www.sc.chinamobile.com/service/image.jsp
图片生成的地址~
------解决方案--------------------使用图像识别技术,或者数字识别(这个要简单点),可以通过神经网络来学习识别验证码,你可以在codeproject上面找找关于神经网络的文章,我记得有一篇专门讲的这个。。。
看这个网站的验证码很规则,而且没有干扰,应该有更简单的方法,你可以尝试一下:
1、为每个字母建立特征值库
2、获取图片流(必须在同一次请求中),将图片还原,分割出来单个的字母图片
3、从分割出来的图片中获得特征点的特征码
4、比较还原的图片和特征库中的特征码相同的则认为是对应的数字
上面的方法只适用于规则的验证码,不规则的验证码需要大量的特征信息,做起来很复杂。
————————————————————————
支持cuike519 的观点。
机器学习,神经网络的话,它是为了适应整个的rot 反破解那的确有难度。
没有杂点,且是纯数字的,字体大小固定,颜色单一,而且机器绘图我有画布的固定位置,这样做图相识别时难度代一点。
再者你对症下药,你就只分割图片-逐个匹配;
------解决方案--------------------呵呵,有个小构件可以帮你, AspriseOCR.dll,下面是一个示例程序,自己写程序把那个图片下载下来,(这不用我帮你吧),存成jpg图片,为了识别,得把图片反色一下(黑变白,白变黑,这应该也不用我帮你),很简单就可以识别了,识别率还蛮高的,想下载这个构件的话,google一下,满大街都是
[DllImport("AspriseOCR.dll", EntryPoint = "OCR")]
public static extern IntPtr OCR(string file, int type);
[DllImport("AspriseOCR.dll", EntryPoint = "OCRpart")]
static extern IntPtr OCRpart(string file, int type, int startX, int startY, int width, int height);
[DllImport("AspriseOCR.dll", EntryPoint = "OCRBarCodes")]
static extern IntPtr OCRBarCodes(string file, int type);
[DllImport("AspriseOCR.dll", EntryPoint = "OCRpartBarCodes")]
static extern IntPtr OCRpartBarCodes(string file, int type, int startX, int startY, int width, int height);
private string m_strResult="";
public Form1()
{
InitializeComponent();
}
private void btnGetText_Click(object sender, EventArgs e)
{
if (OFD.ShowDialog() == DialogResult.OK)
{
m_strResult = Marshal.PtrToStringAnsi(OCR(OFD.FileName, -1));
txtResult.Text = m_strResult;