《我的眼睛–图灵识别》第五章:基础:形状识别

1、图形认识

三角形

三角形是由同一平面内不在同一直线上的三条线段‘首尾’顺次连接所组成的封闭图形。
三角形按边分有不等边三角形、等腰三角和等边三角形;按角分有直角三角形、锐角三角形、钝角三角形等,其中锐角三角形和钝角三角形统称斜三角形。

周长公式:周长 = a + b + c
面积公式:面积 = 底(任意边) * 高(h) / 2


不等边三角形、等腰三角形和等边三角形


锐角三角形、直角三角形和钝角三角形

矩形(四边形)

至少有三个内角都是直角的四边形是矩形,有一个内角是直角的平行四边形是矩形,对角线相等的平行四边形是矩形。矩形是一种特殊的平行四边形,正方形是特殊的矩形。矩形也叫长方形。

周长公式:周长 = 2 * (a + b)
面积公式:面积 = a * b


长方形、正方形和菱形

多边形

由三条或三条以上的线段‘首尾’顺次连接所组成的平面图形叫做多边形。多边形可以分为正多边形和非正多边形、凸多边形及凹多边形。
组成多边形的线段至少有3条,三角形是最简单的多边形。组成多边形的每一条线段叫做多边形的边;相邻的两条线段的公共端点叫做多边形的顶点;连接多边形的两个不相邻顶点的线段叫做多边形的对角线。


正凸多边形和非正凸多边形


正凹多边形和非正凹多边形

圆形(椭圆形)

在一个平面内,一动点以一定点为中心,以一定长度为距离旋转一周所形成的封闭曲线叫做圆,这个定点叫做圆的圆心。
圆是一种几何图形。圆是轴对称、中心对称图形。对称轴是直径所在的直线。同时,圆又是“正无限多边形”,而“无限”只是一个概念。当多边形的边数越多时,其形状、周长、面积就都越接近于圆。所以,世界上没有真正的圆,圆实际上只是概念性的图形。
椭圆形比圆形长,比圆形扁,椭圆形是由圆形变成的长圆形。椭圆是围绕两个焦点的平面中的曲线,使得对于曲线上的每个点,到两个焦点的距离之和是恒定的。因此,它是圆的概括,其是具有两个焦点在相同位置处的特殊类型的椭圆。

圆形周长公式:周长 = 2 * 3.14 * r
圆形面积公式:面积 = (3.14 * r ) ^ 2
椭圆形周长公式:周长 = (r / R) * (r + R)
椭圆形面积公式:面积 = 3.14 * a * b


圆形、椭圆形和同心圆

2、多边形识别

多边形识别(Find Shape)包含三角形、多边形、矩形和圆形的识别。主要识别的核心算法思路是统计形状的顶点数量和线段数量,根据筛选规则识别得到对应的形状图形。
数据统计筛选识别规则分别为三角形:有3个顶点和3条线段组成,多边形:有 4个顶点和至少3条线段以上组成,矩形:有4个顶点和4条线段组成,圆形:有4个顶点和0条线段组成。


(核心算法)多边形

人眼在识别形状的时候速度是非常快的,因为线条简单。但是电脑程序要实现形状识别就需要用到很多的数学几何公式。看似简单做起来却很难,要识别二维物体的形状需要以下的几个步骤:


识别步骤

第1步,获取像素

使用“来源_获取图片像素()”的函数命令(封装了微软提供的LoadImage和GetBitmapBits等API函数)根据图片文件的路径进行图像数据的像素获取。(详情查阅:04基础:图片识别->像素获取)


(预览)图像数据

第2步,滤镜处理

二值化

因为准备的示例图已经是黑白的图像,所以这里暂时不需要进行二值化等图像滤镜的处理。在之后章节的复杂图像识别上会有详细的介绍。(详情查阅:07预处理:图像滤镜->彩色图像滤镜->二值化)

第3步,定位区域

获取顶点

相邻的两条线段的公共端点叫做多边形的顶点。
首先对图形的显示区域进行定位,分别使用从上往下从左往右找出左边的边界、从左往右从下往上找出下边的边界、从下往上从右往左找出右边的边界和从右往左从上往下找出上边的边界,这样就得到的图形的显示区域和对应4个方向的边界值。


显示区域

然后再确定顶点的数量,规则为根据设定2个顶点之间的最小距离大于一定的阈值时则认为是2个顶点(注意看圆形的边界线比较长,这里设定的阈值为15像素距离)。因为图像通过二值化处理后,存在有锯齿或一小段线条的情况会影响顶点数量的计算,此过程主要是去除计算时的干扰。最终才能得到二维图形的有效顶点数量。


圆形的边界线比较长


有效顶点

获取线段

组成多边形的每一条边叫做线段。要确定是否为线段,道理很简单,只需要计算2个顶点之间直线上的白色点数达到一定的数量后(这里设定的阈值为15像素长度),则为判定为有效线段。


(绿色)有效线段

获取2个顶点之间直线上的所有像素点的坐标采用的是,直线的斜截式方程:y=kx+b,其中k是直线的斜率,b是直线在y轴上的截距。该方程叫做直线的斜截式方程,简称斜截式。此斜截式类似于一次函数的表达式。


直线方程式

第4步,进行识别

形状特征统计

接下来,只需要根据前面获得的顶点数量和线段数量,针对不同的形状进行不同的判定条件,即可完成图形的识别。
首先,判断线段数量小于2时则为圆形。
然后,判断顶点数量等于线段数量同时等3时则为三角形,同时等4时则为矩形。

最后,判断顶点数量大于线段数量且都大于4时则为多边形。


三角形


多边形


矩形


圆形

VB6核心代码:

'识别Public Function 形状比对(图像数据() As Byte, 顶点距离 As Long, 线段长度 As Long) As StringDim w As Long, h As Long, 宽 As Long, 高 As LongDim x As Long, y As Long, 顶点() As 坐标结构, i As Long, Point As Long, bo As Boolean宽 = UBound(图像数据, 2)高 = UBound(图像数据, 3)i = 0'按顺序 找出4个边界上的顶点,根据阈值筛选是否为2个点'找出左边所有顶点For w = 0 To 宽Point = 0bo = FalseFor h = 0 To 高If 图像数据(2, w, h) = 255 ThenIf bo = False Then    '找到白色点bo = True    '记录开关ReDim Preserve 顶点(i) As 坐标结构    '第1个点顶点(i).x = w顶点(i).y = hi = i + 1End IfPoint = Point + 1    '记录白色点数ElseIf 图像数据(2, w, h) = 0 And bo = True ThenIf Point > 顶点距离 Then    '筛选是否为第2个点ReDim Preserve 顶点(i) As 坐标结构顶点(i).x = w顶点(i).y = hi = i + 1End IfExit ForEnd IfNextIf bo = True Then Exit ForNextIf i = 0 Then 形状比对 = "":  Exit Function'找出下边所有顶点For h = 高 To 0 Step -1Point = 0bo = FalseFor w = 0 To 宽If 图像数据(2, w, h) = 255 ThenIf bo = False Then    '找到白色点bo = True    '记录开关If 顶点(i - 1).x <> w And 顶点(i - 1).y <> h Then    '排除重叠顶点ReDim Preserve 顶点(i) As 坐标结构    '覆盖前面的点记录顶点(i).x = w顶点(i).y = hi = i + 1End IfEnd IfPoint = Point + 1    '记录白色点数ElseIf 图像数据(2, w, h) = 0 And bo = True ThenIf Point > 顶点距离 Then    '筛选是否为第2个点ReDim Preserve 顶点(i) As 坐标结构顶点(i).x = w顶点(i).y = hi = i + 1End IfExit ForEnd IfNextIf bo = True Then Exit ForNext'找出右边所有顶点For w = 宽 To 0 Step -1Point = 0bo = FalseFor h = 高 To 0 Step -1If 图像数据(2, w, h) = 255 ThenIf bo = False Then    '找到白色点bo = True    '记录开关If 顶点(i - 1).x <> w And 顶点(i - 1).y <> h Then    '排除重叠顶点ReDim Preserve 顶点(i) As 坐标结构    '覆盖前面的点记录顶点(i).x = w顶点(i).y = hi = i + 1End IfEnd IfPoint = Point + 1    '记录白色点数ElseIf 图像数据(2, w, h) = 0 And bo = True ThenIf Point > 顶点距离 Then    '筛选是否为第2个点ReDim Preserve 顶点(i) As 坐标结构顶点(i).x = w顶点(i).y = hi = i + 1End IfExit ForEnd IfNextIf bo = True Then Exit ForNext'找出上边所有顶点For h = 0 To 高Point = 0bo = FalseFor w = 宽 To 0 Step -1If 图像数据(2, w, h) = 255 ThenIf bo = False Then    '找到白色点bo = True    '记录开关If 顶点(i - 1).x <> w And 顶点(i - 1).y <> h Then    '排除重叠顶点ReDim Preserve 顶点(i) As 坐标结构    '覆盖前面的点记录顶点(i).x = w顶点(i).y = hi = i + 1End IfEnd IfPoint = Point + 1    '记录白色点数ElseIf 图像数据(2, w, h) = 0 And bo = True Then'最后的点不为记录,因为返回到了起点Exit ForEnd IfNextIf bo = True Then Exit ForNext'按顺序 计算 当前点和下一个点的 直线上 的点数是否满足一定的阈值,为线段Dim n As Long, m As Long, k As Long, 线段数量 As Long, 顶点数量 As LongDim xx() As Long, yy() As Longn = UBound(顶点)顶点数量 = n + 1线段数量 = 0For i = 0 To nIf i = n ThenCall 取直线上所有坐标(顶点(i).x, 顶点(i).y, 顶点(0).x, 顶点(0).y, xx, yy)ElseCall 取直线上所有坐标(顶点(i).x, 顶点(i).y, 顶点(i + 1).x, 顶点(i + 1).y, xx, yy)End Ifm = UBound(xx)Point = 0For k = 0 To mIf 图像数据(2, xx(k), yy(k)) = 255 ThenPoint = Point + 1End IfNextIf Point > 线段长度 Then线段数量 = 线段数量 + 1End IfNext'判断线段数量 和 顶点数量  最终得到 形状识别If 线段数量 > 2 ThenIf 顶点数量 > 线段数量 Then形状比对 = "多边形"ElseIf 顶点数量 = 线段数量 ThenIf 线段数量 = 3 Then形状比对 = "三角形"ElseIf 线段数量 = 4 Then形状比对 = "矩形(四边形)"Else形状比对 = "多边形"End IfEnd IfEnd IfElse形状比对 = "圆形(椭圆形)"End IfEnd Function

未完待续……

《我的眼睛--图灵识别》第五章:基础:形状识别相关推荐

  1. rgb颜色查询工具_《我的眼睛–图灵识别》第三章:基础:颜色识别

    <我的眼睛–图灵识别>第三章:基础:颜色识别 七色彩虹 漂亮的彩虹是一种光学现象,使用三棱透镜进行折射就能看到七色彩虹.它分别由红.橙.黄.绿.青.蓝.紫7种颜色组成.色彩按字面含义上理解 ...

  2. 《我的眼睛--图灵识别》第十一章:实战演练:图像类识别

    <我的眼睛–图灵识别>第十一章:实战演练:图像类识别 1.与众不同 有些网络游戏非常可爱,不喜欢靠单纯的使用字母和数字这样简单的组合出来的验证图形码,就会搞一些奇奇怪怪的图形图像类的图案选 ...

  3. 《我的眼睛--图灵识别》第一章:起源

    <我的眼睛–图灵识别>第一章:起源 账号登录 相信经常上网的你对上面这张图肯定不会陌生,特别是在注册新账号.账号登录或发表新文章之类的时候,它们都有可能出现要求我们输入.那么肯定会有人提出 ...

  4. 《我的眼睛--图灵识别》第七章:预处理:图像滤镜

    <我的眼睛–图灵识别>第七章:预处理:图像滤镜 什么是滤镜? 滤镜就好比是一种药物,医生会针对不同情况的病人开不一样的药方,这样才能做到对症下药解决问题.一般是指针对数字图像的某种数学处理 ...

  5. 《我的眼睛--图灵识别》第三章:基础:颜色识别

    <我的眼睛–图灵识别>第三章:基础:颜色识别 七色彩虹 漂亮的彩虹是一种光学现象,使用三棱透镜进行折射就能看到七色彩虹.它分别由红.橙.黄.绿.青.蓝.紫7种颜色组成.色彩按字面含义上理解 ...

  6. 第五章 采用SVM和神经网络的车牌识别

    [原文:http://blog.csdn.net/raby_gyl/article/details/11617875] 书名:<Mastering OpenCV with Practical C ...

  7. 实验5-9 使用函数输出水仙花数_正点原子STM32F407探索者开发板资料连载第五十三章 手写识别实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五十三章 手写识别实 ...

  8. 《我的眼睛--图灵识别》彩蛋(一张纸的礼物)

    <我的眼睛–图灵识别>彩蛋(一张纸的礼物) 在图书的最后,给读者留了一份神秘的礼物!!!

  9. 《我的眼睛--图灵识别》第十章:实战演练:文字类识别

    <我的眼睛–图灵识别>第十章:实战演练:文字类识别 1.标准数字 标准数字(Standard Numbers)是指10个数字使用的都是同属一种字体,它们的数字没有发生变形.没有扭曲.没有错 ...

最新文章

  1. 整个领域没了!学术界有史以来最大的丑闻
  2. Android中的Android中的Surface和SurfaceView
  3. Xamarin XAML语言教程模板页面TemplatedPage
  4. 网站后台的lnmp启动与重启
  5. 用jquery + iframe實現iframe子頁面加載完前的緩沖效果
  6. REST HTTP中的POST PUT GET
  7. [ZJOI2019]麻将
  8. mybatis 逆向工程生成的 Example 类的使用
  9. Vue入门 ---- 组件通信
  10. studentdeng的博客
  11. subsample downsample
  12. linux查看schema版本,Schema 日期
  13. 认识网络、几种常用的网络拓扑图
  14. 找出大于200的最小的质数
  15. 一键AI着色,黑白老照片画面瞬间鲜活
  16. 【电力电子技术DC-DC】Boost升压式变换器Simulink仿真
  17. 利用牛顿公式求解方程的根并且实现牛顿下山法
  18. java json转抽象对象_做一次面向对象的体操:将 JSON 字符串转换为嵌套对象的一种方法...
  19. Excel·VBA一键计算每月合计
  20. androidtv gms包_Android之GMS自我总结

热门文章

  1. C# FFmpeg开发说明
  2. CodeForces - 997C Sky Full of Stars
  3. 如何解决FineReader中访问文件被拒绝的问题
  4. 清空stringBuilder
  5. Android 通过sd卡路径获取指定文件夹的所有数据
  6. 对于实现顺序表过程中所遇到的传递指针和传递指针引用的有关思考
  7. java解析excel的js页面,JavaScript_通过Javascript读取本地Excel文件内容的代码示例,读取本地Excel文件内容的Javascri - phpStudy...
  8. java calendar 设置小时_Calendar 日历类的时间操作
  9. 黑客零基础入门教程及方法,从零开始学习黑客技术,看这一篇就够了
  10. 腾讯云COS存储SDK配置