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();
 }
相关推荐
almighty274 小时前
C# WinForm分页控件实现与使用详解
c#·winform·分页控件·c#分页·winform分页
almighty275 小时前
C#实现导入CSV数据到List<T>的完整教程
c#·csv·格式转换·c#导入数据·csv数据导入
程序猿多布6 小时前
Lua和C#比较
c#·lua
csdn_aspnet14 小时前
使用 MongoDB.Driver 在 C# .NETCore 中实现 Mongo DB 过滤器
mongodb·c#·.netcore
weixin_4684668515 小时前
电磁波成像(X射线、CT成像)原理简介
图像处理·相机·ct·视觉·pet·x射线·成像原理
csdn_aspnet19 小时前
使用 C# .NETCore 实现MongoDB
mongodb·c#·.netcore
AndrewHZ19 小时前
【图像处理基石】图像预处理方面有哪些经典的算法?
图像处理·python·opencv·算法·计算机视觉·cv·图像预处理
上位机付工20 小时前
上位机通信速度有多快?
开发语言·c#·上位机·plc
FuckPatience1 天前
C# 修改基类List中某一元素的子类类型
c#·list