- 版主
- 23805
- 4121
- 37
- 514 朵
- 2040 个
- 1206 个
- 138500
- 2004-08-11
|
1#
t
T
发表于 2016-04-24 22:33
|
|只看楼主
【图灵识别系列】图片知识『Fish ISR虹鱼图灵识别』-免费识别插件下载【图灵识别系列】颜色知识-根据颜色进行识别 http://bbs.anjian.com/showtopic-606571-1.aspx【图灵识别系列】识别基础-识别有史以来最简单的验证码 http://bbs.anjian.com/showtopic-606271-1.aspx【学习咨询:加群314452472/866837563】 根据图片进行识别- 您所在的用户组无法下载或查看附件
在学习图片识别之前,首先需要对图片有一点的基础了解,这样才能更好的理解识别图片的原理。 1、图片基础知识1.1、什么是像素是由按一定间隔排列的亮度不同的像点构成的,形成像点的单位称“像素”,也就是说,组成图像的最小单位是像素,像素是图像的最小因素。 我们在电脑屏幕上看到的图片,放大8倍就可以看到,其实它是一个一个颜色像素点组合起来的(如图)。 - 您所在的用户组无法下载或查看附件
- 您所在的用户组无法下载或查看附件
就如,一台手机拍照的最高分辨率为3264×2448,意味着它拥有的影像感应器会有7990272个像素点(俗称800万像素相机)。 1.2、像素的获取要处理一个图像,首先要获得该图像的像素数据。我们后面要说的图像处理部分将会用到这里得到的像素数据。所以,这只是一个开始,我真正要讲的东西还在后面呢。 方法一:获取屏幕像素获取屏幕指定区域范围内图像的所有像素。VB代码如下: 新建一个标准EXE工程,放一个图像控件名称为“显示”,再放一个按钮控件名称为“屏幕”: - Private Sub 屏幕_Click()
- Dim 像素三维数组() As Byte, x As Long, y As Long
- x = 61
- y = 51
- Call 获取屏幕像素(x, y, x + 300, y + 120, 像素三维数组)
- Call 显示图像(像素三维数组, 显示)
- End Sub
复制代码封装函数: - Public Sub 获取屏幕像素(左 As Long, 上 As Long, 右 As Long, 下 As Long, 返回三维图像数组() As Byte) '返回[三维图像数组]
- Dim 三维图像数组() As Byte, bi24BitInfo As BITMAPINFO
- Dim 宽 As Long, 高 As Long
- 宽 = 右 - 左 '图像宽度
- 高 = 下 - 上 '图像高度
- ReDim 三维图像数组(3, 宽 - 1, 高 - 1) As Byte
- With bi24BitInfo.bmiHeader
- .biBitCount = Bits
- .biCompression = 0&
- .biPlanes = 1
- .biSize = Len(bi24BitInfo.bmiHeader)
- .biWidth = 宽
- .biHeight = -高 '控制图像显示效果
- End With
- Dim hWndDesk As Long, IdSource As Long, iDC As Long, iBitmap As Long
- hWndDesk = GetDesktopWindow()
- IdSource = GetDC(hWndDesk)
- iDC = CreateCompatibleDC(IdSource) '创建兼容场景
- iBitmap = CreateDIBSection(iDC, bi24BitInfo, 0, 0, 0, 0) '创建DIB场景
- Call SelectObject(iDC, iBitmap) '复原兼容DC数据
- Call BitBlt(iDC, 0, 0, 宽, 高, IdSource, 左, 上, vbSrcCopy) '拷贝图像(半透明:&H40CC0020)
- Call GetDIBits(iDC, iBitmap, 0, 高, 三维图像数组(0, 0, 0), bi24BitInfo, 0) '获得图像数据
- Call DeleteDC(iDC) '删除句柄
- Call DeleteObject(iBitmap) '删除对象
- Call ReleaseDC(hWndDesk, IdSource)
- 返回三维图像数组 = 三维图像数组
- End Sub
复制代码 特别提示: BitBlt函数有时会出现获取不到屏幕上的窗体图像,那是因为此窗体做了特殊处理导致的,可以在它最后一个参数的取色方式上修改为“&H40CC0020”即可。
| 方法二:获取图片像素获取指定路径下图片文件的所有像素,要求图片必须是BMP格式的24位位图。VB代码如下 新建一个标准EXE工程,放一个图像控件名称为“显示”,再放一个按钮控件名称为“图片”: - Private Sub 图片_Click()
- Dim 像素三维数组() As Byte
- Call 获取图片像素(App.Path & "\验证码.bmp", 像素三维数组)
- Call 显示图像(像素三维数组, 显示)
- End Sub
复制代码封装函数: - Public Function 获取图片像素(文件路径 As String, 返回三维图像数组() As Byte) '返回[三维图像数组]
- Dim hBitmap As Long, totbyte As Long, BMP As BITMAP, byteAry() As Byte
- Dim 三维图像数组() As Byte, 宽 As Long, 高 As Long, w As Long, h As Long, i As Long
- hBitmap = LoadImage(0&, CStr(文件路径), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE) '屏幕质量必须32位色深
- Call GetObject(hBitmap, Len(BMP), BMP) '取得BitMap的结构
- totbyte = BMP.bmWidthBytes * BMP.bmHeight '总共要多少个Byte来存图
- ReDim byteAry(totbyte - 1)
- Call GetBitmapBits(hBitmap, totbyte, byteAry(0)) '将该图全放进ByteAry中
- 宽 = CLng(BMP.bmWidth) - 1
- 高 = CLng(BMP.bmHeight) - 1
- ReDim 三维图像数组(3, 宽, 高) As Byte
- i = 0
- For h = 0 To 高
- For w = 0 To 宽
- 三维图像数组(0, w, h) = byteAry(i)
- 三维图像数组(1, w, h) = byteAry(i + 1)
- 三维图像数组(2, w, h) = byteAry(i + 2)
- i = i + 4
- Next
- Next
- 返回三维图像数组 = 三维图像数组
- End Function
复制代码 1.3、像素的显示根据前面的像素获取,我们并不能很好的所见即所得的看到获取的图像是否正确?要看获取到的像素数据时,就需要用到像素的图像显示, VB代码如下: 封装函数: - Public Sub 显示图像(三维图像数组() As Byte, 图像显示控件 As PictureBox)
- Dim bi24BitInfo As BITMAPINFO
- Dim 宽 As Long, 高 As Long
- 宽 = UBound(三维图像数组, 2)
- 高 = UBound(三维图像数组, 3)
- With bi24BitInfo.bmiHeader
- .biBitCount = Bits
- .biCompression = 0&
- .biPlanes = 1
- .biSize = Len(bi24BitInfo.bmiHeader)
- .biWidth = 宽 + 1
- .biHeight = -高 '颠倒图像显示
- End With
- '设置控件显示图像的大小
- '图像控件大小包含边框(15为控件缇数与屏幕像素之间的单位比例,60为控件的边框)
- 图像显示控件.ScaleMode = 3
- 图像显示控件.Width = 宽 * 15 + 60
- 图像显示控件.Height = 高 * 15 + 60
- 图像显示控件.Cls
- Call SetDIBitsToDevice(图像显示控件.hdc, 0, 0, 宽, 高, 0, 0, 0, 高, 三维图像数组(0, 0, 0), bi24BitInfo, 0)
- End Sub
复制代码 2、根据图片进行识别什么是图片?它是从一点一点的颜色拼成方形矩阵的,然后就成为了一张图片。常见的图片格式有.bmp、.gif、.jpg、.png、.tif等等。 我们每天都能看到满大街的人来人往、车来车往,当我们站在公交车站台上时,此时要做的事情就是等车。我们就拿识别公交车作为讲解,那要怎么判断过来的车是不是公交车?(如图) - 您所在的用户组无法下载或查看附件
- 您所在的用户组无法下载或查看附件
公交车有以下两个特征:1、车头印有公交集团字样 - 您所在的用户组无法下载或查看附件
2、车头和车尾都标有线路 - 您所在的用户组无法下载或查看附件
那么,我们就可以根据以上任意特征,来查找确认要乘坐的公交车啦。 但是,很多新手在初学找图识别时,总认为图截的越大越好、越完整越好,殊不知其实这是种并不值得提倡的做法,找图识别建议只截取图片上的一小部分,这个部分能有这个图片独一无二不变化的的特征就行了。 举个例子:查找电脑桌面上的“我的文档”图标(如图)。 - 您所在的用户组无法下载或查看附件
我们要怎么做这个利用找图的方式进行识别呢? 首先,截取找图所需的图片。打开鱼鱼抓色工具找到“画图”功能(如图): - 您所在的用户组无法下载或查看附件
接着,按下【截图】按钮,会把当前屏幕上的桌面图像截取下来(如图): - 您所在的用户组无法下载或查看附件
然后,选择“裁剪”工具,在需要查找的部分图像上按下鼠标拖动框选出选区后弹起鼠标(如图) - 您所在的用户组无法下载或查看附件
在选区中间双击鼠标完成裁剪(如图) - 您所在的用户组无法下载或查看附件
最后,选择“保存”按钮(如图) - 您所在的用户组无法下载或查看附件
把它保存为24位位图BMP格式的文件,取名为“未命名.bmp”,存放在C盘根目录下即可(如图) - 您所在的用户组无法下载或查看附件
最后,就可以利用这张图片在屏幕上进行查找,完整代码如下: 【按键精灵脚本】:- Dim FoundX, FoundY
- Call FindPic(0, 0, 1024, 768, "C:\未命名.bmp", 0.9, FoundX, FoundY)
- If FoundX > 0 And FoundY > 0 Then
- MessageBox "找到了“我的文件夹”图标"
- End If
复制代码 【VB代码】:新建一个标准EXE工程,放一个图像控件名称为“显示”,再放一个按钮控件名称为“找图”: - Dim FoundX As Long, FoundY As Long
- Call 屏幕区域找图(0, 0, 1024, 768, "C:\未命名.bmp", 0.9, FoundX, FoundY)
- If FoundX > 0 And FoundY > 0 Then
- MsgBox "找到了“我的文件夹”图标"
- End If
复制代码【图灵识别系列】颜色知识-根据颜色进行识别 http://bbs.anjian.com/showtopic-606571-1.aspx【图灵识别系列】识别基础-识别有史以来最简单的验证码 http://bbs.anjian.com/showtopic-606271-1.aspx
投票:【图灵识别系列】图片知识-根据图片进行识别
- 截止时间:2016-05-31
1. 好评
|
|
4票 / 100.00%
|
2. 差评
|
|
0票 / 0.00%
|
抱歉,您所在的用户组没有参与投票的权限,请注册或登录!
|
|