目录

一、边缘检查常用方法

二、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相关推荐

  1. MIL边缘检查实战2.0 20220307

    目录 一.前言 二.识别圆,并进行圆拟合的方法 三.程序代码 四.结果显示 一.前言 在边缘检查1.0中使用了MIL中自动边缘检查,将没有形成闭环和圆环内的边缘剔除,只剩下圆环外完整的边缘. 二.识别 ...

  2. python实战1.0——爬取知乎某问题下的回复

    python实战1.0--爬取知乎某问题下的回复 确定问题 爬取 进行简单筛选 保存数据 # 获取问题下的回复总数 def get_number():url = 'https://www.zhihu. ...

  3. R语言ggplot2可视化左对齐两个可视化图像的画图区域(边缘)实战

    R语言ggplot2可视化左对齐两个可视化图像的画图区域(边缘)实战 目录 R语言ggplot2可视化左对齐两个可视化图像的画图区域(边缘)实战

  4. VTK:颜色边缘用法实战

    VTK:颜色边缘用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkCamera.h> #include <vtkDataSetAttribute ...

  5. Meteor项目实战 -- Next 0.0.2

    接上一篇:Meteor项目实战 -- Next 0.0.1 Get things done , and do Next Next 0.0.2版的目标是账户系统,并把任务与用户关联起来. 首先增加登录所 ...

  6. 大数据内功修炼到企业实战2.0

    <大数据内功修炼到企业实战2.0>全新完整版!!!  无加密,免费送!!!   还有送:项目实战视频.机器学习等持续更新课程 牢记接头暗号:     大数据培训哪家强?老司机推荐十八掌! ...

  7. 《大数据内功修炼到企业实战2.0》全新完整版!!! 无加密,免费送!!!

    <大数据内功修炼到企业实战2.0>全新完整版!!!  无加密,免费送!!! 还有送:项目实战视频.机器学习等持续更新课程 牢记接头暗号: 大数据培训哪家强?老司机推荐十八掌! 神回复:老子 ...

  8. 《IT十八掌大数据内功修炼到企业实战2.0》全套视频2

    <IT十八掌大数据内功修炼到企业实战2.0课程>免费自学马拉松计划   1.关于十八掌 学了大数据,还是不敢找工作?  内功不够!跟随十八掌掌门徐培成炼内功! 十八掌教育努力打造一套地表最 ...

  9. UFIDA KSOA实施检查工具V1.0

    平时维护KSOA时需要频繁进行后台打开各种方案,才能得到设置的SQL语句,操作很是繁琐,故尝试做了这么一个工具. 说明: 1.第一次运行请对KSOA库执行一下sp_helptext2中的SQL存储过程 ...

最新文章

  1. Testin云测试:QQ(4.2.0)安卓版客户端可用性优秀
  2. 平安科技:传入一个只包含1-9的数字字符串,输出的是包含所有数字的最小整数
  3. 【Nginx】Nginx概述
  4. 开源CMS webEdition 6发布
  5. jboss使用_使用JBoss Cool Store的终极云零售指南
  6. 【华为推荐论文】如何学习未知样本?基于反事实学习的推荐系统技术研究(附论文下载链接)...
  7. 提高jQuery的性能
  8. Exchange+SP2的安装
  9. python traceback报错_怎么屏蔽Python Traceback错误信息
  10. cad插件_抖音最火CAD插件教程汇总
  11. Matlab之深度学习工作流程
  12. smb协议只能在同一网段吗_基于SMB协议的共享文件读写 博客分类: Java
  13. linux云计算工程师百度百科,广州学习linux云计算工程师
  14. 计算机原理课堂,计算机原理课堂测验题集.ppt
  15. 放大电路中的反馈-反馈的基本概念及判断方法
  16. 思维导图怎么画?简单易学的思维导图绘制教程
  17. python绘制的Svg图打开一片空白
  18. 80x86 汇编语言,大写变小写,小写变大写,数字原样输出
  19. 5G时代即将来临,VR虚拟现实技术会得到更大发展,WebVR将逐渐走入大众视野!
  20. hdmi接口有什么用_路由器USB接口有什么用 路由器USB接口作用介绍【详解】

热门文章

  1. 创造与魔法怎么去最新服务器,创造与魔法怎么转服务器 | 手游网游页游攻略大全...
  2. LQ0123 小朋友崇拜圈【DFS】
  3. 招远西苑学校计算机老师,招远市西苑学校 王铭宇
  4. 官网MySQL下载速度慢的解决方法
  5. AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一)
  6. ThinkPadE431开启独立显卡功能
  7. Google Play商店上传检查项
  8. ANN之KD-Tree
  9. MSYS2:windows下获取ip地址对应的网卡名
  10. spyder python教程_【python spyder怎么用】spyder python使用教程