当前位置: 首页 > news >正文

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

  • 本案例分3部分
    1. 识别效果,分别显示识别前后识别后;
    2. 代码展示,分别是Halcon源码和Halcon转为C#的代码
    3. 代码解释(解释在源码中)
  • 原图如下:

  • 处理后的图像:

  • Halcon源码:
*读取一张图像
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#源码
/// <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");//}//产生矩形ROIho_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();}

相关文章:

  • 定时器设计
  • python打包成exe
  • 中国古代史4
  • Vue 3 实现转盘抽奖效果
  • 对抗进行性核上性麻痹,健康护理筑牢生活防线
  • 大数据课设——基于电影数据集,分析导演影响力,绘制各种可视化图表
  • python练习-20250512
  • Jupyter-AI Pandas-AI本地使用功能优化
  • 【A2A】根据A2A的协议标准,不同架构的2个大模型agent的交互,是否都需要实现和对接 client和server模块?
  • 8天Python从入门到精通【itheima】-1~5
  • 前端面试每日三题 - Day 31
  • 基于 ABP vNext 框架实现高可用高性能的 Modbus 通信网关
  • Python实例题:pygame开发打飞机游戏
  • 【LeetCode】49.字母异位词分组
  • leetcode 18. 四数之和
  • 【Linux】进程状态、优先级、切换和调度
  • 三、transformers基础组件之Model
  • 判断一个数组有没有重复值
  • PID与模糊PID系统设计——基于模糊PID的水下航行器运动控制研究Simulink仿真(包含设计报告)
  • 基于STM32、HAL库的BMP388 气压传感器 驱动程序设计
  • 习近平同巴西总统卢拉会谈
  • 男子退机票被收90%的手续费,律师:虽然合规,但显失公平
  • 80后莆田市文旅局长马骏登台与杨宗纬合唱,“演唱会秒变旅游推介会”
  • 马上评丨摆摊要交芙蓉王?对吃拿卡要必须零容忍
  • 匈牙利史专家阚思静逝世,享年87岁
  • 央行谈MLF:逐步退出政策利率属性回归流动性投放工具