Halcon案例(一):C#联合Halcon识别路由器上的散热孔

  • 本案例分3部分
    1. 识别效果,分别显示识别前后识别后;
    2. 代码展示,分别是Halcon源码和Halcon转为C#的代码
    3. 代码解释(解释在源码中)
  • 原图如下:
  • 处理后的图像:
  • Halcon源码:
cs 复制代码
*读取一张图像
read_image (Image, 'progres')

*获取图像大小
get_image_size (Image, Width, Height)

*关闭窗口
dev_close_window ()

*打开窗口
dev_open_window (0, 0, Width, Height, 'black', WindowID)

*显示图像
dev_display (Image)

*设置输出对象的颜色,对象是指区域,XLD,其它几何对象
dev_set_color ('red')

*设置区域填充方式
dev_set_draw ('margin')

*产生矩形ROI
gen_rectangle1 (Rectangle, 260, 90, 360, 350)

*减少图像区域
reduce_domain (Image, Rectangle, ImageReduced)

*固定阈值
threshold (ImageReduced, Dark, 0, 150)

*计算区域里的连通域
connection (Dark, ConnectedRegions)

*根据面积大小来过滤区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 100)

*获取区域等效椭圆的参数
elliptic_axis (SelectedRegions, Ra, Rb, Phi)

*获取区域的面积和中心坐标
area_center (SelectedRegions, Area, Row, Column)


*显示图像
dev_display (Image)

*设置输出对象的颜色
dev_set_color ('green')

*显示区域
dev_display (SelectedRegions)

*计算区域平均半径
MeanRadius := sum(Ra) / |Ra|

*计算半径的方差,方差描述随机变量对于数学期望的偏离程度.
VarianceRadius := sum((Ra - MeanRadius)*(Ra - MeanRadius)) / (|Ra|)
  • C#源码
cs 复制代码
/// <summary>
/// 识别图像中散热孔
/// </summary>
/// <param name="winId">窗体的句柄(HSmartWindowControlWPF的HalconWindow属性)</param>
/// <param name="imagePath">图像路径</param> 
public static void RecognizeHoleOfBox(HTuple winId, string imagePath)
 {
     // Local iconic variables 

     HObject ho_Image, ho_Rectangle, ho_ImageReduced;
     HObject ho_Dark, ho_ConnectedRegions, ho_SelectedRegions;

     // Local control variables 

     HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
     HTuple  hv_Ra = new HTuple();
     HTuple hv_Rb = new HTuple(), hv_Phi = new HTuple(), hv_Area = new HTuple();
     HTuple hv_Row = new HTuple(), hv_Column = new HTuple();
     HTuple hv_MeanRadius = new HTuple(), hv_VarianceRadius = new HTuple();
     // Initialize local and output iconic variables 
     HOperatorSet.GenEmptyObj(out ho_Image);
     HOperatorSet.GenEmptyObj(out ho_Rectangle);
     HOperatorSet.GenEmptyObj(out ho_ImageReduced);
     HOperatorSet.GenEmptyObj(out ho_Dark);
     HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);
     HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
     //读取一张图像
     ho_Image.Dispose();
     HOperatorSet.ReadImage(out ho_Image, imagePath);

     //获取图像大小
     hv_Width.Dispose();
     hv_Height.Dispose();
     HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);

     //关闭窗口
     //if (HDevWindowStack.IsOpen())
     //{
     //    HOperatorSet.CloseWindow(HDevWindowStack.Pop());
     //}

     //打开窗口
     //HOperatorSet.SetWindowAttr("background_color", "black");
     //HOperatorSet.OpenWindow(0, 0, hv_Width, hv_Height, 0, "visible", "", out hv_WindowID);
     //HDevWindowStack.Push(hv_WindowID);

     //显示图像
     //if (HDevWindowStack.IsOpen())
     //{
     //    HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
     //}

     //设置输出对象的颜色,对象是指区域,XLD,其它几何对象
     //if (HDevWindowStack.IsOpen())
     //{
     //    HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");
     //}

     //设置区域填充方式
     //if (HDevWindowStack.IsOpen())
     //{
     //    HOperatorSet.SetDraw(HDevWindowStack.GetActive(), "margin");
     //}

     //产生矩形ROI
     ho_Rectangle.Dispose();
     HOperatorSet.GenRectangle1(out ho_Rectangle, 260, 90, 360, 350);

     //减少图像区域
     ho_ImageReduced.Dispose();
     HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced);

     //固定阈值
     ho_Dark.Dispose();
     HOperatorSet.Threshold(ho_ImageReduced, out ho_Dark, 0, 150);

     //计算区域里的连通域
     ho_ConnectedRegions.Dispose();
     HOperatorSet.Connection(ho_Dark, out ho_ConnectedRegions);

     //根据面积大小来过滤区域
     ho_SelectedRegions.Dispose();
     HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area",
         "and", 10, 100);

     //获取区域等效椭圆的参数
     hv_Ra.Dispose(); hv_Rb.Dispose(); hv_Phi.Dispose();
     HOperatorSet.EllipticAxis(ho_SelectedRegions, out hv_Ra, out hv_Rb, out hv_Phi);

     //获取区域的面积和中心坐标
     hv_Area.Dispose(); hv_Row.Dispose(); hv_Column.Dispose();
     HOperatorSet.AreaCenter(ho_SelectedRegions, out hv_Area, out hv_Row, out hv_Column);


     //显示图像
     //if (HDevWindowStack.IsOpen())
     {
         HOperatorSet.DispObj(ho_Image, winId);
     }

     //设置输出对象的颜色
     //if (HDevWindowStack.IsOpen())
     {
         HOperatorSet.SetColor(winId, "green");
     }

     //显示区域
     //if (HDevWindowStack.IsOpen())
     {
         HOperatorSet.DispObj(ho_SelectedRegions, winId);
     }

     //计算区域平均半径
     hv_MeanRadius.Dispose();
     using (HDevDisposeHelper dh = new HDevDisposeHelper())
     {
         hv_MeanRadius = (hv_Ra.TupleSum()
             ) / (new HTuple(hv_Ra.TupleLength()));
     }

     //计算半径的方差,方差描述随机变量对于数学期望的偏离程度.
     hv_VarianceRadius.Dispose();
     using (HDevDisposeHelper dh = new HDevDisposeHelper())
     {
         hv_VarianceRadius = ((((hv_Ra - hv_MeanRadius) * (hv_Ra - hv_MeanRadius))).TupleSum()
             ) / (new HTuple(hv_Ra.TupleLength()));
     }

     ho_Image.Dispose();
     ho_Rectangle.Dispose();
     ho_ImageReduced.Dispose();
     ho_Dark.Dispose();
     ho_ConnectedRegions.Dispose();
     ho_SelectedRegions.Dispose();

     hv_Width.Dispose();
     hv_Height.Dispose();
     //hv_WindowID.Dispose();
     hv_Ra.Dispose();
     hv_Rb.Dispose();
     hv_Phi.Dispose();
     hv_Area.Dispose();
     hv_Row.Dispose();
     hv_Column.Dispose();
     hv_MeanRadius.Dispose();
     hv_VarianceRadius.Dispose();
 }
相关推荐
暖馒4 小时前
Modbus应用层协议的深度剖析
网络·网络协议·c#·wpf·智能硬件
刘欣的博客8 小时前
C# CS架构程序发版升级的走数据库方案
c#·单文件升级自己的方式
Yorlen_Zhang9 小时前
Python Tkinter Text 控件完全指南:从基础编辑器到富文本应用
开发语言·python·c#
不绝1919 小时前
C#进阶:预处理指令/反射,Gettype,Typeof/关键类
开发语言·c#
大鹏说大话10 小时前
告别 MSBuild 脚本混乱:用 C# 和 Nuke 构建清晰、可维护的现代化构建系统
开发语言·c#
czhc114007566311 小时前
通信 28
c#
Dfreedom.13 小时前
图像直方图完全解析:从原理到实战应用
图像处理·python·opencv·直方图·直方图均衡化
Dfreedom.15 小时前
图像处理中的对比度增强与锐化
图像处理·人工智能·opencv·锐化·对比度增强
bugcome_com15 小时前
C# 程序结构详解:从 Hello World 开始
c#
唐梓航-求职中15 小时前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#