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

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

 

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

相关文章:

  • 【整数逐位除法求余补〇完整版】2022-4-11
  • 1 Studying《Linux Media Documentation》
  • 深度学习模块缝合
  • 【redis】线程IO模型
  • 第16届蓝桥杯青少Stema11月 Scratch编程——初/中级组真题——行走的图形
  • GD图像处理与SESSiON
  • MySQL(63)如何进行数据库读写分离?
  • 进程与线程的区别
  • SQL Server从入门到项目实践(超值版)读书笔记 16
  • Linux多线程-进阶
  • 设计模式学习
  • AtCoder Beginner Contest 409
  • Continue 开源 AI 编程助手框架深度分析
  • C++17 和 C++20 中的新容器与工具:std::optional、std::variant 和 std::span
  • 学习python做表格6月8日补录
  • B站_Miachael_ee_通过GDB和OpenOCD对ESP32 进行JTAG Debug_笔记1
  • Python Day46
  • 【AI论文】MiMo-VL技术报告
  • 整数的字典序怎么算
  • 【FPGA开发】DDS信号发生器设计
  • 【题解-Acwing】1097. 池塘计数
  • OCCT基础类库介绍: Foundation Classes - Basics
  • 动手学深度学习pytorch(第一版)学习笔记汇总
  • 从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
  • 利用Pandas AI完成Excel大模型的结合实现自然语言问数
  • 第二十九章 数组
  • iptables实验
  • 2025年中国建银投资笔试测评春招校招社招笔试入职测评行测题型解读揭秘
  • 小番茄C盘清理:专业高效的电脑磁盘清理工具
  • FBRT-YOLO:面向实时航拍图像检测的轻量高效目标检测框架