欢迎光临:
  
  非常感谢您光临枕善居。本站是一个免费的基于VB,VB.NET源代码交流的平台,为大家提供优质的专业的源代码,如果您有需要,本站可以帮助在业余时间里给您寻找代码。当然,如果您有好的代码也可以在本站发布,共享给大家。
专业VB和.NET源码、编程开发教程、图标资源、智能网络控制开关....更多东东请进入我的淘宝小店--->
VB及.NET新源码2012(3DVD,控件+资源) 智能网络开关(TCP UDP) 带源码!


10-11
27

用vb.net写的验证码识别代码

 

        一个很简单用vb.net写的验证码识别代码,代码质量不是太高,而且去噪部分算法很不好,但识别现在网站上的图形验证码已经够用了。比起前段时间给一群 人渣做的自动投票系统中用的一个带有相当强大的图形处理类的ocr来识别和去噪相比就差太远了,放代码只是提醒下要注意登陆入口的管理和管理员的密码安全 性,只要我能有一定的几率正确识别图形验证码,就能通过向http包头中添加新的头信息,就能对管理员帐号进行暴力破解:
 

 

折叠展开vb 代码复制内容到剪贴板
  1. Imports System   
  2. Imports System.Text   
  3. Imports System.Data   
  4. Imports System.Data.OleDb   
  5. Imports System.Drawing   
  6. Imports System.Drawing.Graphics   
  7.   
  8. Public Class CrackImage   
  9.   
  10. Private ConnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=Learn.mdb"  
  11. Private resultNumber As String  
  12. Private rsultStudy As Boolean = False  
  13.   
  14. '识别   
  15. Public Sub New(ByVal SrcImage As Bitmap)   
  16. GetImageNumber = GetIamgeResultNumber(GetNewIamge(SrcImage))   
  17. End Sub  
  18.   
  19. '学习   
  20. Public Sub New(ByVal SrcImagePath As StringByVal StudyNumber As String)   
  21. rsultStudy = StudyCode(SrcImagePath, StudyNumber)   
  22. End Sub  
  23.   
  24.   
  25. Public Property GetImageNumber() As String  
  26. Get  
  27. Return resultNumber   
  28. End Get  
  29. Set(ByVal Value As String)   
  30. resultNumber = Value   
  31. End Set  
  32. End Property  
  33.   
  34.   
  35. Public Property GetStudyImageResult() As Boolean  
  36. Get  
  37. Return rsultStudy   
  38. End Get  
  39. Set(ByVal Value As Boolean)   
  40. rsultStudy = Value   
  41. End Set  
  42. End Property  
  43.   
  44. '处理新图片   
  45. Private Function GetNewIamge(ByVal srcBitBmpImage As Bitmap) As Bitmap   
  46. '建立临时表   
  47. Dim myDataTable As New DataTable   
  48. Dim myCol2 As New DataColumn   
  49. myCol2.DataType = System.Type.GetType("System.Int32")   
  50. myCol2.ColumnName = "RgbValue"  
  51. myDataTable.Columns.Add(myCol2)   
  52.   
  53. Dim myCol3 As New DataColumn   
  54. myCol3.DataType = System.Type.GetType("System.Int32")   
  55. myCol3.ColumnName = "RgbCount"  
  56. myDataTable.Columns.Add(myCol3)   
  57.   
  58. '载入图片   
  59. Dim img As Bitmap = srcBitBmpImage   
  60. Dim x, y As Integer  
  61.   
  62. '去除杂点   
  63. '遍历所有点,存储每点的颜色代码,并对各种颜色进行统计 (这些代码可以不要,直接将图转化成黑白只剩下噪点和感染线条)   
  64. For x = 0 To img.Width - 1   
  65. For y = 0 To img.Height - 1   
  66. Dim Found As Boolean = False  
  67. If myDataTable.Rows.Count > 0 Then  
  68. For k As Integer = 0 To myDataTable.Rows.Count - 1   
  69. If myDataTable.Rows(k).Item("RgbValue") = img.GetPixel(x, y).ToArgb Then  
  70. myDataTable.Rows(k).Item("RgbCount") += 1   
  71. Found = True  
  72. Exit For  
  73. End If  
  74. Next  
  75. End If  
  76.   
  77. If Found = False Then  
  78. Dim myRow As DataRow   
  79. myRow = myDataTable.NewRow()   
  80. myRow.Item("RgbValue") = img.GetPixel(x, y).ToArgb   
  81. myRow.Item("RgbCount") = 1   
  82. myDataTable.Rows.Add(myRow)   
  83. End If  
  84. Next  
  85. Next  
  86.   
  87. '获取背景色码   
  88. '象素点出现最多的就视为背景色   
  89. Dim intMaxRgbValue As Integer = 0   
  90. If myDataTable.Rows.Count > 0 Then  
  91. myDataTable.DefaultView.Sort = "RgbCount DESC"  
  92. intMaxRgbValue = myDataTable.DefaultView.Item(0).Item("RgbValue")   
  93. End If  
  94.   
  95. '勾画数字轮廓   
  96. For x = 0 To img.Width - 1   
  97. For y = 0 To img.Height - 1   
  98. Dim x1, y1 As Integer 'x1和y1记录的是相对当前象素的上一个象素的坐标   
  99. If x = 0 Then  
  100. x1 = x   
  101. Else  
  102. x1 = x - 1   
  103. End If  
  104.   
  105. If y = 0 Then  
  106. y1 = y   
  107. Else  
  108. y1 = y - 1   
  109. End If  
  110.   
  111. Dim x2, y2 As Integer 'x2和y2记录的是相对当前象素下一个象素的坐标   
  112. If x = img.Width - 1 Then  
  113. x2 = img.Width - 1   
  114. Else  
  115. x2 = x + 1   
  116. End If  
  117.   
  118. If y = img.Height - 1 Then  
  119. y2 = img.Height - 1   
  120. Else  
  121. y2 = y + 1   
  122. End If  
  123.   
  124. '都是普通的去噪手法,去噪成黑白色,这里是去噪成黑黄 色   
  125. If img.GetPixel(x2, y).ToArgb = intMaxRgbValue Or img.GetPixel(x1, y).ToArgb = intMaxRgbValue Then  
  126. img.SetPixel(x, y, Color.Black)   
  127. ElseIf img.GetPixel(x, y).ToArgb <> intMaxRgbValue Then  
  128. img.SetPixel(x, y, Color.Yellow)   
  129. Else  
  130. img.SetPixel(x, y, Color.Black)   
  131. End If  
  132. Next  
  133. Next  
  134.   
  135. Return img   
  136. End Function  
  137.   
  138. '获取处理后的数字   
  139. Private Function GetIamgeResultNumber(ByVal srcNewImg As Bitmap) As String  
  140. Dim RawData As New StringBuilder   
  141. '设置分割大小   
  142. Dim imgNewWidth As Integer = 16   
  143. Dim imgNewHeight As Integer = 13   
  144.   
  145. Dim imgNew As New Bitmap(srcNewImg)   
  146. Dim x, y As Integer  
  147. Dim result As String = ""  
  148.   
  149. Dim ImageSplitWidth As Integer = imgNew.Width - imgNewWidth   
  150.   
  151. For m As Integer = 0 To ImageSplitWidth Step imgNewWidth   
  152. Dim Rc As New Rectangle(m, 0, imgNewWidth, imgNewHeight)   
  153. Dim B As Bitmap   
  154. B = imgNew.Clone(Rc, imgNew.PixelFormat)   
  155. '对比分割的颜色,黑色取1,其他取0,就此生成特征码   
  156. For x = 0 To imgNewWidth - 1   
  157. For y = 0 To imgNewHeight - 1   
  158. If B.GetPixel(x, y).ToArgb <> Color.Black.ToArgb Then  
  159. RawData.Append("1")   
  160. Else  
  161. RawData.Append("0")   
  162. End If  
  163. Next  
  164. Next  
  165.   
  166. result += GetIamgeRawToNumber(RawData.ToString)   
  167. RawData.Replace("0""").Replace("1""")   
  168. Next  
  169.   
  170. Return result   
  171. End Function  
  172.   
  173. '学习新图片   
  174. Private Function StudyCode(ByVal srcImage As StringByVal objNumber As StringAs Boolean  
  175. If objNumber = "" Or objNumber.Length < 4 Then Exit Function  
  176. Dim RawData As New StringBuilder   
  177. Dim imgNewWidth As Integer = 16   
  178. Dim imgNewHeight As Integer = 13   
  179. Dim p As Integer = 0   
  180. Dim x, y As Integer  
  181.   
  182. Dim srcBitbmp As New Bitmap(srcImage)   
  183. Dim imgNew As Bitmap = GetNewIamge(srcBitbmp)   
  184.   
  185. '分割图片并保存学习代码   
  186. Dim ImageSplitWidth As Integer = imgNew.Width - imgNewWidth   
  187. For m As Integer = 0 To ImageSplitWidth Step imgNewWidth   
  188. Dim CurNumber As String  
  189. CurNumber = objNumber.Substring(p, 1)   
  190. If CurNumber <> "." Then  
  191. Dim Rc As New Rectangle(m, 0, imgNewWidth, imgNewHeight)   
  192. Dim B As Bitmap   
  193. B = imgNew.Clone(Rc, imgNew.PixelFormat)   
  194.   
  195. For x = 0 To imgNewWidth - 1   
  196. For y = 0 To imgNewHeight - 1   
  197. If B.GetPixel(x, y).ToArgb <> Color.Black.ToArgb Then  
  198. RawData.Append("1")   
  199. Else  
  200. RawData.Append("0")   
  201. End If  
  202. Next  
  203. Next  
  204. SaveImageRaw(objNumber.Substring(p, 1), RawData.ToString)   
  205. RawData.Replace("0""").Replace("1""")   
  206. End If  
  207. p += 1   
  208. Next  
  209.   
  210. Return True  
  211. End Function  
  212.   
  213. '获取图片Raw数据   
  214. Private Function GetIamgeRawToNumber(ByVal strRaw As StringAs String  
  215. Dim conn As New OleDbConnection(ConnStr)   
  216. Dim comm As New OleDbCommand   
  217. Dim reader As OleDbDataReader   
  218.   
  219. Dim myDataTable As New DataTable   
  220. Dim myCol1 As New DataColumn   
  221. myCol1.DataType = System.Type.GetType("System.Int32")   
  222. myCol1.ColumnName = "MatchNumber"  
  223. myDataTable.Columns.Add(myCol1)   
  224.   
  225. Dim myCol2 As New DataColumn   
  226. myCol2.DataType = System.Type.GetType("System.Int32")   
  227. myCol2.ColumnName = "MatchCount"  
  228. myDataTable.Columns.Add(myCol2)   
  229.   
  230. comm.CommandText = "select LearnCharacter,Eigenvalue from tbLearn"  
  231. conn.Open()   
  232. comm.Connection = conn   
  233. reader = comm.ExecuteReader   
  234.   
  235. If reader.HasRows Then  
  236. While reader.Read   
  237. Dim myRow As DataRow   
  238. myRow = myDataTable.NewRow()   
  239. myRow.Item("MatchNumber") = reader.Item(0)   
  240. myRow.Item("MatchCount") = CompareRaw(reader.Item(1), strRaw)   
  241. myDataTable.Rows.Add(myRow)   
  242. End While  
  243. End If  
  244. conn.Close()   
  245.   
  246. Dim reuslt As String = ""  
  247. If myDataTable.Rows.Count > 0 Then  
  248. myDataTable.DefaultView.Sort = "MatchCount DESC"  
  249. reuslt = myDataTable.DefaultView.Item(0).Item("MatchNumber")   
  250. End If  
  251.   
  252. Return reuslt   
  253.   
  254. End Function  
  255.   
  256. '比较图片Raw数据   
  257. Private Function CompareRaw(ByVal strDataBaseRaw As StringByVal strObjRaw As StringAs Integer  
  258. Dim intRawLen As Integer = strDataBaseRaw.Length   
  259. Dim MatchCount As Integer = 0   
  260. For i As Integer = 0 To intRawLen - 1   
  261. If strDataBaseRaw.Substring(i, 1) = strObjRaw.Substring(i, 1) Then  
  262. MatchCount += 1   
  263. End If  
  264. Next  
  265. Return MatchCount   
  266. End Function  
  267.   
  268. '保存图片Raw数据   
  269. Private Sub SaveImageRaw(ByVal strNumber As StringByVal strRaw As String)   
  270. Dim conn As New OleDbConnection(ConnStr)   
  271. Dim comm As New OleDbCommand   
  272. comm.CommandText = "insert into tbLearn(LearnCharacter,Eigenvalue) values ('" + strNumber + "','" + strRaw + "')"  
  273. conn.Open()   
  274. comm.Connection = conn   
  275. comm.ExecuteNonQuery()   
  276. conn.Close()   
  277. End Sub  
  278.   
  279. End Class   

 



文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 验证码 识别
评论: 8 | 引用: 0 | 查看次数: 7533

回复回复gqdsc [2011-05-01 16:21:30 | del]
要是有完整的程序就好罗
回复回复zeebit [2011-04-09 21:09:07 | del]
这个好像只能识别数字?
回复回复近猪者痴 [2011-02-24 16:49:02 | del]
先二值化(包括颜色二值化、去噪和去除杂线)、然后图形切割、然后对点阵数组进行遍历对比。
如果是扭曲变形的识别方法就相对比较复杂,需要根据特定的扭曲方式来写算法。
点阵对比不一定都是100%正确,因此可以加上容错率,也就是允许有多少个点以内的误差。
回复回复yhs [2011-02-23 17:05:00 | del]
这个网站我喜欢。
回复回复shaobobo [2011-02-22 10:56:41 | del]
还不知道怎么用法。在使用时是按照什么顺序去调用函数能获取图片对应的字符?
是不是先学习,把所有字符学习的结果存在数据库中,然后再通过比较获得字符?
回复回复xing979020 [2011-02-05 21:20:43 | del]
这个要怎么呀?

怎么没有窗体 的?
回复回复lycwu [2010-12-11 14:37:41 | del]
那时我用着有点小错误,不知道这个有没有,有的话如果能做成代码调试好下载就好了。
回复回复lycwu [2010-12-11 14:31:22 | del]
抄来的吧,貌似之前我找识别程序搜索到过这个代码。
发表评论
您没有权限发表评论!