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();
 }
相关推荐
dotent·7 小时前
C#基于WPF UI框架的通用基础上位机测试WPF框架
ui·c#·wpf
合作小小程序员小小店7 小时前
桌面开发,超市管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·sqlserver·c#
合作小小程序员小小店9 小时前
桌面开发,在线%超市销售管理%系统,基于vs2022,c#,winform,sql server数据
开发语言·数据库·microsoft·c#
Dev7z9 小时前
基于Matlab传统图像处理的风景图像多风格转换与优化
图像处理·matlab·风景
p***323510 小时前
如何使用C#与SQL Server数据库进行交互
数据库·c#·交互
2501_9418072612 小时前
Java高性能消息队列与Kafka实战分享:大规模消息处理、异步通信与性能优化经验
c#·linq
周杰伦fans13 小时前
C# 中的**享元工厂**模式
开发语言·数据库·c#
鹿衔`13 小时前
通过Flink 1.19 客户端实现Flink集群连接 Kafka 基础测试报告
c#·linq
玩泥巴的15 小时前
.NET 8+ 飞书API实战:自动化群组管理与消息推送
c#·.net·二次开发·飞书