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();
 }
相关推荐
iCxhust2 小时前
c# U盘映像生成工具
开发语言·单片机·c#
emplace_back4 小时前
C# 集合表达式和展开运算符 (..) 详解
开发语言·windows·c#
阿蒙Amon5 小时前
为什么 12 版仍封神?《C# 高级编程》:从.NET 5 到实战架构,进阶者绕不开的必修课
开发语言·c#
深海潜水员5 小时前
【Behavior Tree】-- 行为树AI逻辑实现- Unity 游戏引擎实现
游戏·unity·c#
开开心心_Every6 小时前
便捷的Office批量转PDF工具
开发语言·人工智能·r语言·pdf·c#·音视频·symfony
小码编匠7 小时前
C# 上位机开发怎么学?给自动化工程师的建议
后端·c#·.net
钢铁男儿8 小时前
C# 接口(什么是接口)
java·数据库·c#
小老鼠爱大米12 小时前
C# WPF - Prism 学习篇:搭建项目(一)
c#·wpf·prism