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();
 }
相关推荐
神仙别闹9 小时前
基于C#+MySQL实现(WinForm)企业设备使用信息管理系统
开发语言·mysql·c#
czhaii9 小时前
PLC脉冲位置 单片机跟踪读取记录显示
开发语言·c#
Ronin-Lotus10 小时前
图像处理篇---MJPEG视频流处理
图像处理·python·opencv
神仙别闹11 小时前
基于C#+SQL Server开发(WinForm)租房管理系统
数据库·oracle·c#
bicijinlian12 小时前
.Net HttpClient 管理客户端(初始化与生命周期管理)
c#·.net·httpclient·.net httpclient·c# http
一个人的博客@你12 小时前
C# 通用OCR识别
图像处理·c#·ocr·图像识别·文字提取
老胖闲聊14 小时前
C# 注册表操作类
开发语言·c#
液态不合群16 小时前
理解 C# 中的各类指针
java·开发语言·c#
可喜~可乐16 小时前
C# SQLite高级功能示例
数据库·sql·sqlite·c#