找回密码
 加入
搜索
查看: 12865|回复: 20

[图形处理] [已解决]这种验证码有办法识别计算吗

 火.. [复制链接]
发表于 2011-11-27 00:04:56 | 显示全部楼层 |阅读模式
本帖最后由 卫和谐 于 2011-11-28 21:58 编辑

像这种验证码怎么识别和计算:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-11-27 00:27:52 | 显示全部楼层
这类应该好办把  字数有限  相对没变形  OCR生成特征库  再转换成数字或符号 计算出结果
发表于 2011-11-27 00:46:43 | 显示全部楼层
楼上正解..
 楼主| 发表于 2011-11-27 07:45:37 | 显示全部楼层
回复 2# komaau3


    这个是倾斜的,不好弄吧!
 楼主| 发表于 2011-11-27 16:23:12 | 显示全部楼层
希望高手帮助一下
发表于 2011-11-27 17:28:46 | 显示全部楼层
本帖最后由 lanfengc 于 2011-11-27 18:11 编辑

啥也不说了。直接上图。


相关贴子链接:http://autoitx.com/thread-15563-1-1.html
请自行解决识别字符不够4个的问题,我想,这不是什么难事吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 2金钱 +30 贡献 +5 收起 理由
afan + 30
lynfr8 + 5

查看全部评分

发表于 2011-11-27 18:14:23 | 显示全部楼层
回复 1# 卫和谐


  关于计算的问题

识别出来之后,计算还难吗? 我看你这验证码是以内的加减乘除运算吧,识别结果出来后,拆分成一个3个元素的数组,以第二个元素做switch语句,很简单了吧。
发表于 2011-11-27 18:15:52 | 显示全部楼层
回复 1# 卫和谐


  关于计算的问题

识别出来之后,计算还难吗? 我看你这验证码是以内的加减乘除运算吧,识别结果出来后,拆分成一个3个元素的数组,以第二个元素做switch语句,很简单了吧。

另外,入库的时候,不要用汉字入库,直接用该字符相应的阿拉伯数字入库,那么识别结果出来后,不用进行汉字转阿拉伯数字的操作,即可直接进行四则运算。
发表于 2011-11-27 21:03:30 | 显示全部楼层
回复 6# lanfengc
图中字符虽然倾斜 但不影响分割
只是没法等宽分割了 中间的‘加’字宽度是20
把1-9取出来再去杂处理就完美了,录入的字库将更准确
发表于 2011-11-27 22:42:57 | 显示全部楼层
学习中。。。
发表于 2011-11-27 22:45:49 | 显示全部楼层
赚点金币,去下源码
发表于 2011-11-27 23:37:47 | 显示全部楼层
这种在验证码识别里算是简单的啊~~~~统一侧斜角度了等于没侧斜一样~~把自做个识别字库就可以了
 楼主| 发表于 2011-11-28 07:06:34 | 显示全部楼层
回复 6# lanfengc


    还真不会解决4个字符的问题,怎么办?
发表于 2011-11-28 08:13:05 | 显示全部楼层
回复 13# 卫和谐


    源代码中有一段这样的代码,你看下

Func LoadPicClick()  ;加载图片
        chushihua()
        $message2 = "选择识别码."
        $Open2 = FileOpenDialog($message2, "", "验证码 (*.gif;*.jpg;*.bmp)", 1 )
        If @error Then
                _GUICtrlListBox_AddString($LogList,"加载图片文件失败,原因:没有选择文件!")
        Else
                $Open2 = StringSplit($Open2, "|", @CRLF)
                If $Open2[0] = 1 Then GUICtrlSetImage ($MainPic,$Open2[1])
                _GUICtrlListBox_AddString($LogList,"加载图片文件:"&$Open2[1])
                ;以数组中的坐标信息为拆分单元,分割图片,并将图片显示到子图片框.
                myReadImageToArray(0,$Open2[1],$ResPicPos[0][0],$ResPicPos[0][1],$ResPicPos[0][2],$ResPicPos[0][3],False)  ;拆分
                ;myReadImageToArray($Num,$ImageFile,$ix0,$iy0,$iX,$iY,$b_Array2d=False)
                GUICtrlSetImage($FirstPic,@ScriptDir&"\0.bmp")
                myReadImageToArray(1,$Open2[1],$ResPicPos[1][0],$ResPicPos[1][1],$ResPicPos[1][2],$ResPicPos[1][3],False)
                GUICtrlSetImage($SecondPic,@ScriptDir&"\1.bmp")
                myReadImageToArray(2,$Open2[1],$ResPicPos[2][0],$ResPicPos[2][1],$ResPicPos[2][2],$ResPicPos[2][3],False)
                GUICtrlSetImage($ThirdPic,@ScriptDir&"\2.bmp")
                myReadImageToArray(3,$Open2[1],$ResPicPos[3][0],$ResPicPos[3][1],$ResPicPos[3][2],$ResPicPos[3][3],False)
                GUICtrlSetImage($FourthPic,@ScriptDir&"\3.bmp")
        EndIf
EndFunc


里面有4个关于
myReadImageToArray($Num,$ImageFile,$ix0,$iy0,$iX,$iY,$b_Array2d=False)
这个函数的调用,查看这个函数的代码如下:

Func myReadImageToArray($Num,$ImageFile,$ix0,$iy0,$iX,$iY,$b_Array2d=False);成功则返回数组.失败返回0.$b_Array2d=True返回二维数组,=False返回一维数组
    Local $hBitmap, $BitmapData, $i_width, $i_height, $Scan0, $pixelData, $s_BMPData, $i_Stride
        Local $hClone, $hImage
        _GDIPlus_Startup()
    $hBitmap = _GDIPlus_BitmapCreateFromFile($ImageFile)
        $i_width = _GDIPlus_ImageGetWidth($hBitmap)
        $i_height = _GDIPlus_ImageGetHeight($hBitmap)
        $Row=$i_width
        $Cro=$i_height
        $hClone = _GDIPlus_BitmapCloneArea($hBitmap, $ix0, $iy0, $iX, $iY)
        _GDIPlus_ImageSaveToFile($hClone, @ScriptDir&"\"&$Num &".bmp")
        If @error Then 
                MsgBox(0,"","wrong")
                _GDIPlus_ShutDown ()
                Return 0;无效的图形文件或未找到该文件
        EndIf
    $BitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $i_width, $i_height, $GDIP_ILMREAD, $GDIP_PXF24RGB)
    $i_Stride = DllStructGetData($BitmapData, "Stride");Stride - Offset, in bytes, between consecutive scan lines of the bitmap. If the stride is positive, the bitmap is top-down. If the stride is negative, the bitmap is bottom-up.
    $Scan0 = DllStructGetData($BitmapData, "Scan0");Scan0 - Pointer to the first (index 0) scan line of the bitmap.
    $pixelData = DllStructCreate("ubyte lData[" & (Abs($i_Stride) * $i_height) & "]", $Scan0)
    $s_BMPData = DllStructGetData($pixelData, "lData")
    $s_BMPData = StringTrimLeft($s_BMPData,2);去掉头部"0x"
    _GDIPlus_BitmapUnlockBits($hBitmap, $BitmapData)
    _GDIPlus_ImageDispose($hBitmap)
        _GDIPlus_ImageDispose($hClone)
        _WinAPI_DeleteObject ($hBitmap)
        _GDIPlus_Shutdown()
       
        If $b_Array2d Then;要求返回二维数组
                Local $a_return[$i_width][$i_height], $x, $y, $s
                For $y=0 To $i_height-1
                $s=StringMid($s_BMPData, $y*($i_Stride*2)+1, $i_width*6)
                ;不要使用一些例子中提出的$s=StringMid($s_BMPData, $y*($i_width*6)+1, $i_width*6),经实际测试,该方式无法正确处理:
                ;GIF冗余,带隐藏内容的图形文件(一种数据加密方式),或者多页图形文件,当然这些情形比较少见,下同
                For $x= 0 To $i_width-1
                $a_return[$x][$y]= Number("0x"&StringMid($s,$x*6+1 ,6))
                Next
                Next
        Else;要求返回一维数组
                Local $a_return[$i_height], $y
                For $y=0 To $i_height-1
                        $a_return[$y]=StringMid($s_BMPData, $y*($i_Stride*2)+1, $i_width*6)
                        ;见上说明
                Next
        EndIf
        Return $a_return
EndFunc  ;==>myReadImageToArray


其实,这个函数就是根据阿福写的那个图片到数组的函数改的,关键是
$hClone = _GDIPlus_BitmapCloneArea($hBitmap, $ix0, $iy0, $iX, $iY)
_GDIPlus_ImageSaveToFile($hClone, @ScriptDir&"\"&$Num &".bmp")
这两句,将图片中由$ix0, $iy0, $iX, $iY控制的区域复制出来,然后存成$Num .bmp文件,然后才处理。  
我这样讲解下,你能明白如何只处理3个字符识别你的图片了吗?

评分

参与人数 1金钱 +30 贡献 +2 收起 理由
afan + 30 + 2

查看全部评分

 楼主| 发表于 2011-11-28 15:35:43 | 显示全部楼层
回复 14# lanfengc

谢谢,有时间研究一下!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-16 11:45 , Processed in 0.099522 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表