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

Halcon案例(三):C#联合Halcon识别排线

  • 本案例分3部分
    1. 识别效果,分别显示识别前后识别后;
    2. 代码展示,分别是Halcon源码和Halcon转为C#的代码
    3. 代码解释(解释在源码中);
  • 原图如下:
  • 识别后图像如下:
  • Halcon代码:
  • 
    *关闭已经打开的窗口
    dev_close_window ()*打开新窗口
    dev_open_window (0, 0, 640, 480, 'black', WindowHandle)for i := 1 to 2 by 1*打开一张图像     read_image (Image, 'cable' + i)*获取一个三通道图像里的每个通道的图像数据decompose3 (Image, Red, Green, Blue)*将RGB三通道数据转化为HSV色彩空间的三通道图像数据trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv')*对HSV图像中的饱和度通道进行阈值操作threshold (Saturation, HighSaturation, 100, 255)*获取上述阈值操作后区域中的色调通道图像数据reduce_domain (Hue, HighSaturation, HueHighSaturation)*对上述色调通道图像数据进行阈值处理threshold (HueHighSaturation, Yellow, 20, 50)*获取区域里连接的组件connection (Yellow, ConnectedRegions)*保留ConnectedRegions里的最大的区域select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)*对SelectedRegions进行闭运算操作closing_circle (SelectedRegions, Yellow, 3.5)*将Yellow区域里的图像剪切出来reduce_domain (Image, Yellow, ImageReduced)*显示图像dev_clear_window()dev_set_color ('white')dev_set_draw ('margin')*显示黄色的电线dev_display (Image)dev_display (Yellow)stop ()
    endfor

  • C#代码 :
  • #region 识别排线中的黄色的线束
    public void RecognizeLine(HTuple winId, string imagePath)
    {// Local iconic variables HObject ho_Image = null, ho_Red = null, ho_Green = null;HObject ho_Blue = null, ho_Hue = null, ho_Saturation = null, ho_Intensity = null;HObject ho_HighSaturation = null, ho_HueHighSaturation = null;HObject ho_Yellow = null, ho_ConnectedRegions = null, ho_SelectedRegions = null;HObject ho_ImageReduced = null;// Local control variables HTuple hv_WindowHandle = new HTuple(), hv_i = new HTuple();// Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Image);HOperatorSet.GenEmptyObj(out ho_Red);HOperatorSet.GenEmptyObj(out ho_Green);HOperatorSet.GenEmptyObj(out ho_Blue);HOperatorSet.GenEmptyObj(out ho_Hue);HOperatorSet.GenEmptyObj(out ho_Saturation);HOperatorSet.GenEmptyObj(out ho_Intensity);HOperatorSet.GenEmptyObj(out ho_HighSaturation);HOperatorSet.GenEmptyObj(out ho_HueHighSaturation);HOperatorSet.GenEmptyObj(out ho_Yellow);HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);HOperatorSet.GenEmptyObj(out ho_SelectedRegions);HOperatorSet.GenEmptyObj(out ho_ImageReduced);//关闭已经打开的窗口//if (HDevWindowStack.IsOpen())//{//    HOperatorSet.CloseWindow(HDevWindowStack.Pop());//}//打开新窗口//HOperatorSet.SetWindowAttr("background_color", "black");//HOperatorSet.OpenWindow(0, 0, 640, 480, 0, "visible", "", out hv_WindowHandle);//HDevWindowStack.Push(hv_WindowHandle);//for (hv_i = 1; (int)hv_i <= 2; hv_i = (int)hv_i + 1){//打开一张图像//using (HDevDisposeHelper dh = new HDevDisposeHelper())//{//    ho_Image.Dispose();//    HOperatorSet.ReadImage(out ho_Image, "cable" + hv_i);//}HOperatorSet.ReadImage(out ho_Image, imagePath);//获取一个三通道图像里的每个通道的图像数据ho_Red.Dispose(); ho_Green.Dispose(); ho_Blue.Dispose();HOperatorSet.Decompose3(ho_Image, out ho_Red, out ho_Green, out ho_Blue);//将RGB三通道数据转化为HSV色彩空间的三通道图像数据ho_Hue.Dispose(); ho_Saturation.Dispose(); ho_Intensity.Dispose();HOperatorSet.TransFromRgb(ho_Red, ho_Green, ho_Blue, out ho_Hue, out ho_Saturation,out ho_Intensity, "hsv");//对HSV图像中的饱和度通道进行阈值操作ho_HighSaturation.Dispose();HOperatorSet.Threshold(ho_Saturation, out ho_HighSaturation, 100, 255);//获取上述阈值操作后区域中的色调通道图像数据ho_HueHighSaturation.Dispose();HOperatorSet.ReduceDomain(ho_Hue, ho_HighSaturation, out ho_HueHighSaturation);//对上述色调通道图像数据进行阈值处理ho_Yellow.Dispose();HOperatorSet.Threshold(ho_HueHighSaturation, out ho_Yellow, 20, 50);//获取区域里连接的组件ho_ConnectedRegions.Dispose();HOperatorSet.Connection(ho_Yellow, out ho_ConnectedRegions);//保留ConnectedRegions里的最大的区域ho_SelectedRegions.Dispose();HOperatorSet.SelectShapeStd(ho_ConnectedRegions, out ho_SelectedRegions, "max_area",0);//对SelectedRegions进行闭运算操作ho_Yellow.Dispose();HOperatorSet.ClosingCircle(ho_SelectedRegions, out ho_Yellow, 3.5);//将Yellow区域里的图像剪切出来ho_ImageReduced.Dispose();HOperatorSet.ReduceDomain(ho_Image, ho_Yellow, out ho_ImageReduced);//显示图像//if (HDevWindowStack.IsOpen()){HOperatorSet.ClearWindow(winId);}//if (HDevWindowStack.IsOpen()){HOperatorSet.SetColor(winId, "white");}//if (HDevWindowStack.IsOpen()){HOperatorSet.SetDraw(winId, "margin");}//显示黄色的电线//if (HDevWindowStack.IsOpen()){HOperatorSet.DispObj(ho_Image, winId);}//if (HDevWindowStack.IsOpen()){HOperatorSet.DispObj(ho_Yellow, winId);}// stop(...); only in hdevelop}ho_Image.Dispose();ho_Red.Dispose();ho_Green.Dispose();ho_Blue.Dispose();ho_Hue.Dispose();ho_Saturation.Dispose();ho_Intensity.Dispose();ho_HighSaturation.Dispose();ho_HueHighSaturation.Dispose();ho_Yellow.Dispose();ho_ConnectedRegions.Dispose();ho_SelectedRegions.Dispose();ho_ImageReduced.Dispose();hv_WindowHandle.Dispose();hv_i.Dispose();}
    #endregion

 

相关文章:

  • 【RAG召回】bge实现向量相似度索引
  • 四.抽象工厂模式
  • 如何在Spring Boot中使用注解动态切换实现
  • Kubernetes 节点资源驱逐策略详解:evictionHard 与 evictionSoft
  • remote display server is not supported (e.g. Wayland)
  • Vue中虚拟DOM的原理与作用
  • 【RTP】Intra-Refresh模式下的 H.264 输出,RTP打包的方式和普通 H.264 流并没有本质区别
  • python批量将文件夹下的excel转word文件
  • 海思Hi3798MV310_V39_HMS DDR3_安卓9.0_外贸盒update升级包
  • 深入了解NIO的优化实现原理
  • Linux运维新人自用笔记(乌班图apt命令和dpkg命令、两系统指令区别,rpm解决路径依赖、免安装配置java环境)
  • 发送文件脚本源码版本
  • 【Go语言基础【17】】切片:一种动态数组
  • 漏洞检测方案如何选工具?开源与商业工具适用环境大不同
  • Ubuntu系统用户基本管理
  • 栈和队列的奇妙冒险:用栈实现队列
  • (每日一道算法题)验证二叉搜索树
  • Jinja2深度解析与应用指南
  • ALOHA ACT算法与源码笔记
  • 【学习笔记】0-RTT
  • 企业网站建设应该注意什么事项问题/品牌宣传策略
  • 内网 做 网站/百度关键词怎么排名
  • 邯郸建移动网站费用/乐事薯片软文推广
  • 网站建设与维护 前台/全网营销推广靠谱吗
  • 江门网站制作培训/2023推广平台
  • 武汉网站建设工作室/宁波网络推广产品服务