• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

返回列表 12345678» / 15
发新话题 回复该主题

【图灵识别系列】图片知识-根据图片进行识别 [复制链接]

1#
【图灵识别系列】图片知识

『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工程,放一个图像控件名称为“显示”,再放一个按钮控件名称为“屏幕”:
  1. Private Sub 屏幕_Click()
  2. Dim 像素三维数组() As Byte, x As Long, y As Long
  3. x = 61
  4. y = 51
  5. Call 获取屏幕像素(x, y, x + 300, y + 120, 像素三维数组)
  6. Call 显示图像(像素三维数组, 显示)
  7. End Sub
复制代码

封装函数:
  1. Public Sub 获取屏幕像素(左 As Long, 上 As Long, 右 As Long, 下 As Long, 返回三维图像数组() As Byte) '返回[三维图像数组]
  2. Dim 三维图像数组() As Byte, bi24BitInfo As BITMAPINFO
  3. Dim 宽 As Long, 高 As Long
  4. 宽 = 右 - 左 '图像宽度
  5. 高 = 下 - 上 '图像高度
  6. ReDim 三维图像数组(3, 宽 - 1, 高 - 1) As Byte
  7. With bi24BitInfo.bmiHeader
  8. .biBitCount = Bits
  9. .biCompression = 0&
  10. .biPlanes = 1
  11. .biSize = Len(bi24BitInfo.bmiHeader)
  12. .biWidth = 宽
  13. .biHeight = -高 '控制图像显示效果
  14. End With
  15. Dim hWndDesk As Long, IdSource As Long, iDC As Long, iBitmap As Long
  16. hWndDesk = GetDesktopWindow()
  17. IdSource = GetDC(hWndDesk)
  18. iDC = CreateCompatibleDC(IdSource) '创建兼容场景
  19. iBitmap = CreateDIBSection(iDC, bi24BitInfo, 0, 0, 0, 0) '创建DIB场景
  20. Call SelectObject(iDC, iBitmap) '复原兼容DC数据
  21. Call BitBlt(iDC, 0, 0, 宽, 高, IdSource, 左, 上, vbSrcCopy) '拷贝图像(半透明:&H40CC0020)
  22. Call GetDIBits(iDC, iBitmap, 0, 高, 三维图像数组(0, 0, 0), bi24BitInfo, 0) '获得图像数据
  23. Call DeleteDC(iDC) '删除句柄
  24. Call DeleteObject(iBitmap) '删除对象
  25. Call ReleaseDC(hWndDesk, IdSource)
  26. 返回三维图像数组 = 三维图像数组
  27. End Sub
复制代码


特别提示:
BitBlt函数有时会出现获取不到屏幕上的窗体图像,那是因为此窗体做了特殊处理导致的,可以在它最后一个参数的取色方式上修改为“&H40CC0020”即可。

方法二:获取图片像素
获取指定路径下图片文件的所有像素,要求图片必须是BMP格式的24位位图。VB代码如下
新建一个标准EXE工程,放一个图像控件名称为“显示”,再放一个按钮控件名称为“图片”:
  1. Private Sub 图片_Click()
  2. Dim 像素三维数组() As Byte
  3. Call 获取图片像素(App.Path & "\验证码.bmp", 像素三维数组)
  4. Call 显示图像(像素三维数组, 显示)
  5. End Sub
复制代码

封装函数:
  1. Public Function 获取图片像素(文件路径 As String, 返回三维图像数组() As Byte) '返回[三维图像数组]
  2. Dim hBitmap As Long, totbyte As Long, BMP As BITMAP, byteAry() As Byte
  3. Dim 三维图像数组() As Byte, 宽 As Long, 高 As Long, w As Long, h As Long, i As Long
  4. hBitmap = LoadImage(0&, CStr(文件路径), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE) '屏幕质量必须32位色深
  5. Call GetObject(hBitmap, Len(BMP), BMP) '取得BitMap的结构
  6. totbyte = BMP.bmWidthBytes * BMP.bmHeight '总共要多少个Byte来存图
  7. ReDim byteAry(totbyte - 1)
  8. Call GetBitmapBits(hBitmap, totbyte, byteAry(0)) '将该图全放进ByteAry中
  9. 宽 = CLng(BMP.bmWidth) - 1
  10. 高 = CLng(BMP.bmHeight) - 1
  11. ReDim 三维图像数组(3, 宽, 高) As Byte
  12. i = 0
  13. For h = 0 To 高
  14. For w = 0 To 宽
  15. 三维图像数组(0, w, h) = byteAry(i)
  16. 三维图像数组(1, w, h) = byteAry(i + 1)
  17. 三维图像数组(2, w, h) = byteAry(i + 2)
  18. i = i + 4
  19. Next
  20. Next
  21. 返回三维图像数组 = 三维图像数组
  22. End Function
复制代码


1.3、像素的显示
根据前面的像素获取,我们并不能很好的所见即所得的看到获取的图像是否正确?要看获取到的像素数据时,就需要用到像素的图像显示,
VB代码如下:

封装函数:
  1. Public Sub 显示图像(三维图像数组() As Byte, 图像显示控件 As PictureBox)
  2. Dim bi24BitInfo As BITMAPINFO
  3. Dim 宽 As Long, 高 As Long
  4. 宽 = UBound(三维图像数组, 2)
  5. 高 = UBound(三维图像数组, 3)
  6. With bi24BitInfo.bmiHeader
  7. .biBitCount = Bits
  8. .biCompression = 0&
  9. .biPlanes = 1
  10. .biSize = Len(bi24BitInfo.bmiHeader)
  11. .biWidth = 宽 + 1
  12. .biHeight = -高 '颠倒图像显示
  13. End With
  14. '设置控件显示图像的大小
  15. '图像控件大小包含边框(15为控件缇数与屏幕像素之间的单位比例,60为控件的边框)
  16. 图像显示控件.ScaleMode = 3
  17. 图像显示控件.Width = 宽 * 15 + 60
  18. 图像显示控件.Height = 高 * 15 + 60
  19. 图像显示控件.Cls
  20. Call SetDIBitsToDevice(图像显示控件.hdc, 0, 0, 宽, 高, 0, 0, 0, 高, 三维图像数组(0, 0, 0), bi24BitInfo, 0)
  21. End Sub
复制代码





2、根据图片进行识别
什么是图片?它是从一点一点的颜色拼成方形矩阵的,然后就成为了一张图片。常见的图片格式有.bmp、.gif、.jpg、.png、.tif等等。
我们每天都能看到满大街的人来人往、车来车往,当我们站在公交车站台上时,此时要做的事情就是等车。我们就拿识别公交车作为讲解,那要怎么判断过来的车是不是公交车?(如图)
您所在的用户组无法下载或查看附件


您所在的用户组无法下载或查看附件


公交车有以下两个特征:
1、车头印有公交集团字样
您所在的用户组无法下载或查看附件


2、车头和车尾都标有线路
您所在的用户组无法下载或查看附件


那么,我们就可以根据以上任意特征,来查找确认要乘坐的公交车啦。

但是,很多新手在初学找图识别时,总认为图截的越大越好、越完整越好,殊不知其实这是种并不值得提倡的做法,找图识别建议只截取图片上的一小部分,这个部分能有这个图片独一无二不变化的的特征就行了。

举个例子:
查找电脑桌面上的“我的文档”图标(如图)。

您所在的用户组无法下载或查看附件


我们要怎么做这个利用找图的方式进行识别呢?
首先,截取找图所需的图片。打开鱼鱼抓色工具找到“画图”功能(如图):
您所在的用户组无法下载或查看附件


接着,按下【截图】按钮,会把当前屏幕上的桌面图像截取下来(如图):
您所在的用户组无法下载或查看附件


然后,选择“裁剪”工具,在需要查找的部分图像上按下鼠标拖动框选出选区后弹起鼠标(如图)
您所在的用户组无法下载或查看附件


在选区中间双击鼠标完成裁剪(如图)
您所在的用户组无法下载或查看附件


最后,选择“保存”按钮(如图)
您所在的用户组无法下载或查看附件


把它保存为24位位图BMP格式的文件,取名为“未命名.bmp”,存放在C盘根目录下即可(如图)
您所在的用户组无法下载或查看附件


最后,就可以利用这张图片在屏幕上进行查找,完整代码如下:

【按键精灵脚本】:
  1. Dim FoundX, FoundY
  2. Call FindPic(0, 0, 1024, 768, "C:\未命名.bmp", 0.9, FoundX, FoundY)
  3. If FoundX > 0 And FoundY > 0 Then
  4. MessageBox "找到了“我的文件夹”图标"
  5. End If
复制代码
【VB代码】:
新建一个标准EXE工程,放一个图像控件名称为“显示”,再放一个按钮控件名称为“找图”:
  1. Dim FoundX As Long, FoundY As Long
  2. Call 屏幕区域找图(0, 0, 1024, 768, "C:\未命名.bmp", 0.9, FoundX, FoundY)
  3. If FoundX > 0 And FoundY > 0 Then
  4. MsgBox "找到了“我的文件夹”图标"
  5. End If
复制代码
【图灵识别系列】颜色知识-根据颜色进行识别
http://bbs.anjian.com/showtopic-606571-1.aspx

【图灵识别系列】识别基础-识别有史以来最简单的验证码
http://bbs.anjian.com/showtopic-606271-1.aspx

    已有1评分我要评分查看所有评分

    投票:【图灵识别系列】图片知识-根据图片进行识别 - 截止时间:2016-05-31

    1. 好评
    4票 / 100.00%
    2. 差评
    0票 / 0.00%
    抱歉,您所在的用户组没有参与投票的权限,请注册或登录!
    最后编辑一只鱼 最后编辑于 2019-06-24 17:24:37
    本主题由 超级版主 瑞祥幽冥狼 于 2023/10/5 18:35:20 执行 审核帖子 操作
    2#

    算法沙发上发生的

    脚本定制,请联系老冷QQ:1920712147
    3#


    4#

    2222222222222222

    5#

    我又来学学习了

    6#

    长篇连载,不回复不行

    7#

    看了下发帖时间,鱼头这是从出江湖的节奏

    点评

    兄弟工程师01  金盆洗脚,重出江湖……  发表于 2016/6/12 10:00:13

    <font color="Red"><strong>接各种单QQ:1018304599</strong></font>
    8#

    楼主威武~

    9#

    学习一下。

    10#

    不能很好的

    11#

    666666666666

    12#

    好吧

    13#

    xuexixuexi

    14#

    看看

    15#

    看样子有点难啊

    点评

    兄弟工程师01  大叔,哪里部分比较难可以指出,还可以进行文章修改的。  发表于 2016/6/12 9:59:41

    16#

    自动识别

    17#

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    18#

    学习中ing

    19#

    学习一下~~~

    20#

    看看阿卡纳那俺

    QQ:1839877445
    发新话题 回复该主题