"启智杯":确定扇环外切矩形的方法
“启智杯”开发类命题-一种模板匹配与识别控件。在该控件的显示功能要求中,需要将训练出来的模型轮廓点显示到加载的图像上。这些模型轮廓点的基准点并非当前绘制图形(扇环、矩形、多边形)的中心点,而是当前绘制的所有图形的外切矩形的左上角坐标点。当图形中只有矩形和多边形时,其外切矩形简单易求。然而,当图形中存在扇环时,其外切矩形较难求得。因此,本文提出了一种可行的方法,用于确定扇环的外切矩形,以供大家参考。语言:C++。应用程序框架:MFC。位图绘制和图形绘制:GDI。

一.确定模型轮廓点的基准点

海康算子库的模型匹配例子中,随便绘制几个图形,点击generate pattern,在确认模型生成成功后点击display pattern会得到如下图所示的模型区域,在红笔圈中的区域中,黑色为mask区域,白色为绘制的ROI图形

4.PNG

在经过几次验证后,模型轮廓点的基准点既不是图像的原点,也不是该外切矩形的中心点,二十该外切矩形的左上角点(屏幕坐标系的原点在左上角)。

二.扇环外切矩形求解

矩形与多边形的外切矩形的求解并不复杂,在此不多赘述。

1.求解原理

扇环有四个角点,如下图所示

5.PNG

当扇环不跨象限时(扇环的起止角度均在同一象限内),扇环的外切矩形显然由这四个点确定。但当扇环跨象限时,四个角点并不能决定外切矩形,需要在四个角点及四个与扇环中心点同x(y)的点中确定外切矩形,如下图所示

6.PNG

2.C++实现

其中若干结构体和函数定义见文章“启智杯”模板匹配控件的扇形掩膜实现方式交流

void getPieBorderPoint(S_PIEINFO* pie, int& minx, int& maxx, int& miny, int& maxy) { //求起始点角度及扇角大小,由于GDI和海康算子定义的起止点刚好相反,所以endAngle才是起始点 CPoint startVector(pie->data->anglePoint[0].x - pie->data->center.x, pie->data->anglePoint[0].y - pie->data->center.y); double startAngle = getAngleToXPositive(startVector) * 180 / PI; CPoint endVector(pie->data->anglePoint[2].x - pie->data->center.x, pie->data->anglePoint[2].y - pie->data->center.y); double endAngle = getAngleToXPositive(endVector) * 180 / PI; double angleRange = 0; if (startAngle < endAngle) { angleRange = 360 - (endAngle - startAngle); } else angleRange = startAngle - endAngle; double tempangle = endAngle + angleRange; //t_0_90_180_270用于存放跨象限时的4个点,初始值均设为大圆起始点的值 CPoint t_0_90_180_270[4] = { 0 }; for (int i = 0; i < 4; i++) { t_0_90_180_270[i].SetPoint(pie->data->anglePoint[0].x, pie->data->anglePoint[0].y); } //判断扇环的扇角跨了多少个象限,endAngle范围[0,360),tempangle范围[360,720) if (0 >= endAngle && 0 < tempangle || 360 >= endAngle && 360 < tempangle) { t_0_90_180_270[0].SetPoint(pie->data->maxRectBoundary.right, pie->data->center.y); } if (90 >= endAngle && 90 < tempangle || 450 >= endAngle && 450 < tempangle) { t_0_90_180_270[1].SetPoint(pie->data->center.x, pie->data->maxRectBoundary.bottom); } if (180 >= endAngle && 180 < tempangle || 540 >= endAngle && 540 < tempangle) { t_0_90_180_270[2].SetPoint(pie->data->maxRectBoundary.left, pie->data->center.y); } if (270 >= endAngle && 270 < tempangle || 630 >= endAngle && 630 < tempangle) { t_0_90_180_270[3].SetPoint(pie->data->center.x, pie->data->maxRectBoundary.top); } //求8个点的最大x,最小x,最大y,最小y int tminx = 9999, tmaxx = -1, tminy = 9999, tmaxy = -1; for (int i = 0; i < 4; i++) { if (pie->data->anglePoint[i].x < tminx) tminx = pie->data->anglePoint[i].x; else if (pie->data->anglePoint[i].x > tmaxx) tmaxx = pie->data->anglePoint[i].x; if (pie->data->anglePoint[i].y < tminy) tminy = pie->data->anglePoint[i].y; else if (pie->data->anglePoint[i].y > tmaxy) tmaxy = pie->data->anglePoint[i].y; if (t_0_90_180_270[i].x < tminx) tminx = t_0_90_180_270[i].x; else if (t_0_90_180_270[i].x > tmaxx) tmaxx = t_0_90_180_270[i].x; if (t_0_90_180_270[i].y < tminy) tminy = t_0_90_180_270[i].y; else if (t_0_90_180_270[i].y > tmaxy) tmaxy = t_0_90_180_270[i].y; } minx = tminx; miny = tminy; maxx = tmaxx; maxy = tmaxy; }

3.验证

8.PNG

11.PNG

12.PNG

模型轮廓点均显示无误,且生成的模型文件能被visionmaster成功匹配

三.结语

感谢您抽出宝贵的时间阅读本篇文章。本文可能存在许多表述不明、表述有误的地方,欢迎大家批评指正。

武汉理工大学,程惟康,2022-03-30;

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

“启智杯”:IMvdImage类型转换为MFC的CBitmap类型

下一篇

“启智杯”设计大赛-一种模板匹配建模与识别控件

评论请先登录 登录
全部评论 0
Lv.0
0
关注
4
粉丝
5
创作
23
获赞
所属专题
  • VM4.2二次开发环境配置方法(入门必看)
  • Visionmaster4.2 + QT5.14.2 + VS2017二次开发保姆级避坑课程
  • 使用VisionMaster4.2SDK联合C#进行二次开发入门
  • VM二次开发视觉框架(C#)
  • 二次开发过程注意的点
  • 开发一个自己的VM模块(三)
  • 开发一个自己的VM模块(二)
  • 开发一个自己的VM模块系列一:模块详解
  • 【VM集成开源AI】深度学习算子模块封装
  • Vm算子CMvdImage图片生成方法,即IntPtr转byte[]和byte[]
  • Sauvola二值化处理在图像处理应用的优势介绍分析
  • “启智杯”设计大赛-一种模板匹配建模与识别控件
  • “启智杯”模板匹配控件的扇形掩膜实现方式交流
  • “启智杯”:IMvdImage类型转换为MFC的CBitmap类型
  • "启智杯":确定扇环外切矩形的方法
  • VM二次开发小技巧-增加十字辅助线
  • VM二次开发小技巧—快速匹配模板切换
相关阅读
  • [共享学习]VM之角度纠正问题
    2024-03-07 浏览 0
  • 机器视觉菜鸟指南
    2024-02-29 浏览 0
  • 基于C++OpenCV实现VisionMaster中的“直线边缘缺陷检测”
    2024-03-04 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器