MIL边缘检查实战1.0 20220303
目录
一、边缘检查常用方法
二、MIL自带Tools Matrox Edge Finder操作
三、程序逻辑
四、程序代码
一、边缘检查常用方法
MgraAllocList | 分配一个图像列表 |
MedgeAlloc | 分配边缘检查器 |
MedgeAllocResult | 分配边缘检测数据 |
MedgeControl | 控制边缘检查设置 |
MedgeCalculate | 执行边缘提取和特征计算 |
MedgeGetResult | 从边缘结果缓冲区获取边的结果 |
MedgeSelect | 选择边进行计算和结果检索 |
二、MIL自带Tools Matrox Edge Finder操作
1)选择Matrox Edge Finder
2)点击File→OPEN(选择图像)
3)点击File→New Edge Finder→Contour Edge Finder
4)点击Calculate计算,显示边缘
5)在Contour Edge Finder中有Feature Selections,其中有相关参数查看,在本次边缘检查中,需要Moment Elongation参数参考
三、程序逻辑
四、程序代码
1)控制台代码
using System;using Matrox.MatroxImagingLibrary;
namespace EdgeFindSeals
{class Program{//private const string CONTOUR_IMAGE = "C:/Program Files (x86)/Matrox Imaging/Images/Seals.mim";private const string CONTOUR_IMAGE = MIL.M_IMAGE_PATH + "Seals.mim";private const int CONTOUR_MAX_RESULTS = 100;private const double CONTOUR_MAXIMUM_ELONGATION = 0.8;private static readonly int CONTOUR_DRAW_COLOR = MIL.M_COLOR_GREEN;private static readonly int CONTOUR_LABEL_COLOR = MIL.M_COLOR_RED;static void Main(string[] args){MIL_ID MilApplication = MIL.M_NULL; //程序标识符MIL_ID MilSystem = MIL.M_NULL; //系统标识符MIL_ID MilDisplay = MIL.M_NULL; //显示标识符MIL_ID MilImage = MIL.M_NULL; //图像缓存区标识符MIL_ID GraphicList = MIL.M_NULL; //图形列表标识符MIL_ID MilEdgeContext = MIL.M_NULL; //上下文标识符MIL_ID MilEdgeResult = MIL.M_NULL; //边缘缓冲区标识符double EdgeDrawColor = CONTOUR_DRAW_COLOR; //边缘颜色标识符double LabelDrawColor = CONTOUR_LABEL_COLOR; //标签颜色标识符MIL_INT NumEdgeFound = 0; //边缘数量标识符MIL_INT NumResults = 0; //边缘最终数量int i = 0; double[] MeanFeretDiameter = new double[CONTOUR_MAX_RESULTS];//平均直径数组//分配默认应用MIL.MappAllocDefault(MIL.M_DEFAULT, ref MilApplication, ref MilSystem, ref MilDisplay, MIL.M_NULL, MIL.M_NULL);//读取本地图像于图像缓存区MIL.MbufRestore(CONTOUR_IMAGE, MilSystem, ref MilImage);//选择图像缓存区放入显示中MIL.MdispSelect(MilDisplay, MilImage);//分配一个图像列表MIL.MgraAllocList(MilSystem, MIL.M_DEFAULT, ref GraphicList);//控制显示设置MIL.MdispControl(MilDisplay, MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, GraphicList);Console.Write("\nEDGE MODULE:\n");Console.Write("------------\n\n");Console.Write("This program determines the outer seal diameters in the displayed image \n");Console.Write("by detecting and analyzing contours with the Edge Finder module.\n");Console.Write("Press <Enter> to continue.\n\n");Console.ReadKey();//分配边缘检查器MIL.MedgeAlloc(MilSystem, MIL.M_CONTOUR, MIL.M_DEFAULT, ref MilEdgeContext);//分配边缘检测数据于MilEdgeResultMIL.MedgeAllocResult(MilSystem, MIL.M_DEFAULT, ref MilEdgeResult);//控制边缘检查的MIL.MedgeControl(MilEdgeContext, MIL.M_MOMENT_ELONGATION, MIL.M_ENABLE);//控制边缘检查出的平均直径MIL.MedgeControl(MilEdgeContext, MIL.M_FERET_MEAN_DIAMETER + MIL.M_SORT1_DOWN, MIL.M_ENABLE);//使用MilEdgeContext及MilImage缓存数据计算结果于MilEdgeResultMIL.MedgeCalculate(MilEdgeContext, MilImage, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MilEdgeResult, MIL.M_DEFAULT);//从MilEdgeResult获得边缘数量并存放于NunEdgeFoundMIL.MedgeGetResult(MilEdgeResult, MIL.M_DEFAULT, MIL.M_NUMBER_OF_CHAINS + MIL.M_TYPE_MIL_INT, ref NumEdgeFound);//设置边缘前景颜色MIL.MgraColor(MIL.M_DEFAULT, EdgeDrawColor);//绘制图形在图像上MIL.MedgeDraw(MIL.M_DEFAULT, MilEdgeResult, GraphicList, MIL.M_DRAW_EDGES, MIL.M_DEFAULT, MIL.M_DEFAULT);Console.Write("{0} edges were found in the image.\n", NumEdgeFound);Console.Write("Press <Enter> to continue.\n\n");Console.ReadKey();//指定残缺边缘将其从缓冲区删除MIL.MedgeSelect(MilEdgeResult, MIL.M_EXCLUDE, MIL.M_MOMENT_ELONGATION, MIL.M_LESS, CONTOUR_MAXIMUM_ELONGATION, MIL.M_NULL);//指定内边缘将其从缓冲区删除MIL.MedgeSelect(MilEdgeResult, MIL.M_EXCLUDE, MIL.M_INCLUDED_EDGES, MIL.M_INSIDE_BOX, MIL.M_NULL, MIL.M_NULL);//将图像缓冲区清除为指定的前景色,或从图形列表中删除图形MIL.MgraClear(MIL.M_DEFAULT, GraphicList);//设置边缘前景颜色MIL.MgraColor(MIL.M_DEFAULT, EdgeDrawColor);//绘制图形在图像上MIL.MedgeDraw(MIL.M_DEFAULT, MilEdgeResult, GraphicList, MIL.M_DRAW_EDGES, MIL.M_DEFAULT, MIL.M_DEFAULT);Console.Write("Elongated edges and inner edges of each seal were removed.\n");Console.Write("Press <Enter> to continue.\n\n");Console.ReadKey();//检索MilEdgeResult边的数量并转化位MIL_INT类型存放于NumResultsMIL.MedgeGetResult(MilEdgeResult, MIL.M_DEFAULT, MIL.M_NUMBER_OF_CHAINS + MIL.M_TYPE_MIL_INT, ref NumResults);//若NumResults大于1且小于等于CONTOUR_MAX_RESULTS,计算出每个边缘的平均直径if ((NumResults >= 1) && (NumResults <= CONTOUR_MAX_RESULTS)){MIL.MgraColor(MIL.M_DEFAULT, LabelDrawColor);MIL.MedgeDraw(MIL.M_DEFAULT, MilEdgeResult, GraphicList, MIL.M_DRAW_INDEX, MIL.M_DEFAULT, MIL.M_DEFAULT);MIL.MedgeGetResult(MilEdgeResult, MIL.M_DEFAULT, MIL.M_FERET_MEAN_DIAMETER, MeanFeretDiameter);Console.Write("Mean diameter of the {0} outer edges are:\n\n", NumResults);Console.Write("Index Mean diameter \n");for (i = 0; i < NumResults; i++){Console.Write("{0,-10}{1,-13:0.00}\n", i, MeanFeretDiameter[i]);}}//反之结束else{Console.Write("Edges have not been found or the number of found edges is greater than\n");Console.Write("the specified maximum number of edges !\n\n");}Console.Write("\nPress <Enter> to end.\n");Console.ReadKey();//释放资源MIL.MgraFree(GraphicList);MIL.MedgeFree(MilEdgeContext);MIL.MedgeFree(MilEdgeResult);MIL.MbufFree(MilImage);MIL.MappFreeDefault(MilApplication, MilSystem, MilDisplay, MIL.M_NULL, MIL.M_NULL);}}
}
2)WinForm代码(待更新)
using System;
using System.Windows.Forms;using Matrox.MatroxImagingLibrary;namespace EdgeFindSealsForm
{public partial class Form1 : Form{private const string CONTOUR_IMAGE = MIL.M_IMAGE_PATH + "Seals.mim";private const int CONTOUR_MAX_RESULTS = 100;private const double CONTOUR_MAXIMUM_ELONGATION = 0.8;private static readonly int CONTOUR_DRAW_COLOR = MIL.M_COLOR_GREEN;private static readonly int CONTOUR_LABEL_COLOR = MIL.M_COLOR_RED;MIL_ID MilApplication = MIL.M_NULL; //程序标识符MIL_ID MilSystem = MIL.M_NULL; //系统标识符MIL_ID MilDisplay = MIL.M_NULL; //显示标识符MIL_ID MilImage = MIL.M_NULL; //图像缓存区标识符MIL_ID GraphicList = MIL.M_NULL; //图形列表标识符MIL_ID MilEdgeContext = MIL.M_NULL; //上下文标识符MIL_ID MilEdgeResult = MIL.M_NULL; //边缘缓冲区标识符double EdgeDrawColor = CONTOUR_DRAW_COLOR; //边缘颜色标识符double LabelDrawColor = CONTOUR_LABEL_COLOR; //标签颜色标识符MIL_INT NumEdgeFound = 0; //边缘数量标识符MIL_INT NumResults = 0; //边缘最终数量int i = 0;int a = 0;double[] MeanFeretDiameter = new double[CONTOUR_MAX_RESULTS];//平均直径数组public Form1(){InitializeComponent();//分配默认应用MIL.MappAllocDefault(MIL.M_DEFAULT, ref MilApplication, ref MilSystem, ref MilDisplay, MIL.M_NULL, MIL.M_NULL);}public void EdgeFind(){//读取本地图像于图像缓存区MIL.MbufRestore(CONTOUR_IMAGE, MilSystem, ref MilImage);//选择图像缓存区放入显示中MIL.MdispSelectWindow(MilDisplay, MilImage, this.panel1.Handle);//图像居中且自适应窗口MIL.MdispControl(MilDisplay, MIL.M_SCALE_DISPLAY, MIL.M_ENABLE);//分配一个图像列表MIL.MgraAllocList(MilSystem, MIL.M_DEFAULT, ref GraphicList);//控制显示设置MIL.MdispControl(MilDisplay, MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, GraphicList);//----------------------------------------------------------------------//分配边缘检查器MIL.MedgeAlloc(MilSystem, MIL.M_CONTOUR, MIL.M_DEFAULT, ref MilEdgeContext);//分配边缘检测数据于MilEdgeResultMIL.MedgeAllocResult(MilSystem, MIL.M_DEFAULT, ref MilEdgeResult);//控制边缘检查的MIL.MedgeControl(MilEdgeContext, MIL.M_MOMENT_ELONGATION, MIL.M_ENABLE);//控制边缘检查出的平均直径MIL.MedgeControl(MilEdgeContext, MIL.M_FERET_MEAN_DIAMETER + MIL.M_SORT1_DOWN, MIL.M_ENABLE);//使用MilEdgeContext及MilImage缓存数据计算结果于MilEdgeResultMIL.MedgeCalculate(MilEdgeContext, MilImage, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MilEdgeResult, MIL.M_DEFAULT);//从MilEdgeResult获得边缘数量并存放于NunEdgeFoundMIL.MedgeGetResult(MilEdgeResult, MIL.M_DEFAULT, MIL.M_NUMBER_OF_CHAINS + MIL.M_TYPE_MIL_INT, ref NumEdgeFound);//设置边缘前景颜色MIL.MgraColor(MIL.M_DEFAULT, EdgeDrawColor);//绘制图形在图像上MIL.MedgeDraw(MIL.M_DEFAULT, MilEdgeResult, GraphicList, MIL.M_DRAW_EDGES, MIL.M_DEFAULT, MIL.M_DEFAULT);//----------------------------------------------------------------------//指定残缺边缘将其从缓冲区删除MIL.MedgeSelect(MilEdgeResult, MIL.M_EXCLUDE, MIL.M_MOMENT_ELONGATION, MIL.M_LESS, CONTOUR_MAXIMUM_ELONGATION, MIL.M_NULL);//指定内边缘将其从缓冲区删除MIL.MedgeSelect(MilEdgeResult, MIL.M_EXCLUDE, MIL.M_INCLUDED_EDGES, MIL.M_INSIDE_BOX, MIL.M_NULL, MIL.M_NULL);//将图像缓冲区清除为指定的前景色,或从图形列表中删除图形MIL.MgraClear(MIL.M_DEFAULT, GraphicList);//设置边缘前景颜色MIL.MgraColor(MIL.M_DEFAULT, EdgeDrawColor);//绘制图形在图像上MIL.MedgeDraw(MIL.M_DEFAULT, MilEdgeResult, GraphicList, MIL.M_DRAW_EDGES, MIL.M_DEFAULT, MIL.M_DEFAULT);//----------------------------------------------------------------------//检索MilEdgeResult边的数量并转化位MIL_INT类型存放于NumResultsMIL.MedgeGetResult(MilEdgeResult, MIL.M_DEFAULT, MIL.M_NUMBER_OF_CHAINS + MIL.M_TYPE_MIL_INT, ref NumResults);//若NumResults大于1且小于等于CONTOUR_MAX_RESULTS,计算出每个边缘的平均直径if ((NumResults >= 1) && (NumResults <= CONTOUR_MAX_RESULTS)){MIL.MgraColor(MIL.M_DEFAULT, LabelDrawColor);MIL.MedgeDraw(MIL.M_DEFAULT, MilEdgeResult, GraphicList, MIL.M_DRAW_INDEX, MIL.M_DEFAULT, MIL.M_DEFAULT);MIL.MedgeGetResult(MilEdgeResult, MIL.M_DEFAULT, MIL.M_FERET_MEAN_DIAMETER, MeanFeretDiameter);textBox1.AppendText("Mean diameter of the" + NumResults + "outer edges are:\r\n");//Console.Write("Mean diameter of the {0} outer edges are:\n\n", NumResults);textBox1.AppendText("Index Mean diameter \r\n");//Console.Write("Index Mean diameter \n");for (i = 0; i < NumResults; i++){double TwoDecimal = double.Parse(MeanFeretDiameter[i].ToString("0.00"));textBox1.AppendText(i + " " + TwoDecimal + "\r\n");}}//反之结束else{Console.Write("Edges have not been found or the number of found edges is greater than\n");Console.Write("the specified maximum number of edges !\n\n");}}public void ClearBuffer(){//释放资源MIL.MgraFree(GraphicList);MIL.MedgeFree(MilEdgeContext);MIL.MedgeFree(MilEdgeResult);MIL.MbufFree(MilImage);MIL.MappFreeDefault(MilApplication, MilSystem, MilDisplay, MIL.M_NULL, MIL.M_NULL);}private void From_Close(object sender, EventArgs e){ClearBuffer();}private void button1_Click(object sender, EventArgs e){EdgeFind();button1.Enabled = false;}}
}
参考MIL Help
MIL边缘检查实战1.0 20220303相关推荐
- MIL边缘检查实战2.0 20220307
目录 一.前言 二.识别圆,并进行圆拟合的方法 三.程序代码 四.结果显示 一.前言 在边缘检查1.0中使用了MIL中自动边缘检查,将没有形成闭环和圆环内的边缘剔除,只剩下圆环外完整的边缘. 二.识别 ...
- python实战1.0——爬取知乎某问题下的回复
python实战1.0--爬取知乎某问题下的回复 确定问题 爬取 进行简单筛选 保存数据 # 获取问题下的回复总数 def get_number():url = 'https://www.zhihu. ...
- R语言ggplot2可视化左对齐两个可视化图像的画图区域(边缘)实战
R语言ggplot2可视化左对齐两个可视化图像的画图区域(边缘)实战 目录 R语言ggplot2可视化左对齐两个可视化图像的画图区域(边缘)实战
- VTK:颜色边缘用法实战
VTK:颜色边缘用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkCamera.h> #include <vtkDataSetAttribute ...
- Meteor项目实战 -- Next 0.0.2
接上一篇:Meteor项目实战 -- Next 0.0.1 Get things done , and do Next Next 0.0.2版的目标是账户系统,并把任务与用户关联起来. 首先增加登录所 ...
- 大数据内功修炼到企业实战2.0
<大数据内功修炼到企业实战2.0>全新完整版!!! 无加密,免费送!!! 还有送:项目实战视频.机器学习等持续更新课程 牢记接头暗号: 大数据培训哪家强?老司机推荐十八掌! ...
- 《大数据内功修炼到企业实战2.0》全新完整版!!! 无加密,免费送!!!
<大数据内功修炼到企业实战2.0>全新完整版!!! 无加密,免费送!!! 还有送:项目实战视频.机器学习等持续更新课程 牢记接头暗号: 大数据培训哪家强?老司机推荐十八掌! 神回复:老子 ...
- 《IT十八掌大数据内功修炼到企业实战2.0》全套视频2
<IT十八掌大数据内功修炼到企业实战2.0课程>免费自学马拉松计划 1.关于十八掌 学了大数据,还是不敢找工作? 内功不够!跟随十八掌掌门徐培成炼内功! 十八掌教育努力打造一套地表最 ...
- UFIDA KSOA实施检查工具V1.0
平时维护KSOA时需要频繁进行后台打开各种方案,才能得到设置的SQL语句,操作很是繁琐,故尝试做了这么一个工具. 说明: 1.第一次运行请对KSOA库执行一下sp_helptext2中的SQL存储过程 ...
最新文章
- Testin云测试:QQ(4.2.0)安卓版客户端可用性优秀
- 平安科技:传入一个只包含1-9的数字字符串,输出的是包含所有数字的最小整数
- 【Nginx】Nginx概述
- 开源CMS webEdition 6发布
- jboss使用_使用JBoss Cool Store的终极云零售指南
- 【华为推荐论文】如何学习未知样本?基于反事实学习的推荐系统技术研究(附论文下载链接)...
- 提高jQuery的性能
- Exchange+SP2的安装
- python traceback报错_怎么屏蔽Python Traceback错误信息
- cad插件_抖音最火CAD插件教程汇总
- Matlab之深度学习工作流程
- smb协议只能在同一网段吗_基于SMB协议的共享文件读写 博客分类: Java
- linux云计算工程师百度百科,广州学习linux云计算工程师
- 计算机原理课堂,计算机原理课堂测验题集.ppt
- 放大电路中的反馈-反馈的基本概念及判断方法
- 思维导图怎么画?简单易学的思维导图绘制教程
- python绘制的Svg图打开一片空白
- 80x86 汇编语言,大写变小写,小写变大写,数字原样输出
- 5G时代即将来临,VR虚拟现实技术会得到更大发展,WebVR将逐渐走入大众视野!
- hdmi接口有什么用_路由器USB接口有什么用 路由器USB接口作用介绍【详解】
热门文章
- 创造与魔法怎么去最新服务器,创造与魔法怎么转服务器 | 手游网游页游攻略大全...
- LQ0123 小朋友崇拜圈【DFS】
- 招远西苑学校计算机老师,招远市西苑学校 王铭宇
- 官网MySQL下载速度慢的解决方法
- AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一)
- ThinkPadE431开启独立显卡功能
- Google Play商店上传检查项
- ANN之KD-Tree
- MSYS2:windows下获取ip地址对应的网卡名
- spyder python教程_【python spyder怎么用】spyder python使用教程