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

  • 本案例分3部分
    1. 识别效果,分别显示识别前后识别后;
    2. 代码展示,分别是Halcon源码和Halcon转为C#的代码
    3. 代码解释(解释在源码中);
  • 原图如下:
  • 识别后图像如下:
  • Halcon代码:
cs 复制代码
*关闭已经打开的窗口
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#代码 :
cs 复制代码
#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
相关推荐
CoderIsArt4 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
hahaha60168 小时前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
qq_252941316812 小时前
航拍羊群目标检测数据集 | 航拍羊群 智慧畜牧业 动物检测 无人机巡检5010期
人工智能·yolo·目标检测·计算机视觉·无人机·羊群识别·羊群
音视频牛哥15 小时前
拆解人形机器人:从关节、灵巧手到VLA与媒体神经系统
机器学习·计算机视觉·机器人
爱吃火鸡面呀15 小时前
OpenCV 实战:文档扫描与神经风格迁移完整指南
人工智能·opencv·计算机视觉
java1234_小锋15 小时前
YOLO26 计算机视觉 - 训练自己的 YOLO26 模型
人工智能·yolo·机器学习·计算机视觉·yolo26
Hello-FPGA17 小时前
量子计算滨松c15550-22up单光子相机与PCIe1004采集卡
人工智能·计算机视觉·fpga开发
梦想的颜色17 小时前
【AI科普】什么是计算机视觉:硬核科普,它和大 AI 大模型到底是什么关系
人工智能·深度学习·计算机视觉·多模态·aiagent·#vlm·ai工程实战
呆呆敲代码的小Y17 小时前
【游戏开发】Lua 与 C# 交互原理解析
c#·lua·交互·热更新·lua与c#交互·游戏热更新
hahaha601618 小时前
HLS高层次综合设计技巧--循环merge和循环split
人工智能·算法·计算机视觉