当前位置: 首页 > 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();}

http://www.xdnf.cn/news/405865.html

相关文章:

  • 【Vue3】使用vite创建Vue3工程、Vue3基本语法讲解
  • Windows 添加 hosts 映射
  • 零碳园区能源系统-多能互补体系
  • 星海智算云平台部署GPT-SoVITS模型教程
  • 傲云源墅:以五傲价值重构北京主城别墅格局
  • Spring MVC 和 Spring Boot 是如何访问静态资源的?
  • MySQL数据库表的约束
  • 反弹shell再入门
  • MySQL查询优化100条军规
  • 深度解析RagFlow:本地大模型驱动的高效知识库应用搭建指南
  • Java MVC
  • nRF5_SDK_17.1.0_ddde560之ble_app_uart_c 出错
  • [Java实战]Spring Boot 整合 Session 共享(十七)
  • LintCode第42题-最大子数组 II
  • 《Vuejs设计与实现》第 5 章(非原始值响应式方案) 中
  • OpenCV 的 CUDA 模块中用于将一个多通道 GpuMat 图像拆分成多个单通道图像的函数split()
  • 【AI News | 20250512】每日AI进展
  • 一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!
  • 【LeetCode】49.字母异位词分组
  • 典籍知识问答重新生成和消息修改Bug修改
  • 从零搭建AI工作站:Gemma3大模型本地部署+WebUI配置全套方案
  • sqlmap使用入门
  • Linux 系统中设置开机启动脚本
  • AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
  • 【JAVA】业务系统订单号,流水号生成规则工具类
  • python练习-20250512
  • C++23 views::slide (P2442R1) 深入解析
  • AnaTraf:深度解析网络性能分析(NPM)
  • C语言:深入理解指针(3)
  • 基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考