C# HalconDotNet 工业视觉处理

在C#中使用Halcon开发视觉检测程序 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的人能快速转入Halcon平台下,通过文中的示例开发者能快速了解一个Halcon项目开发的基本步骤,让开发者能把精力完全集中到算法的开发上面。首先,你需要安装,的安装包会放在文章末尾。安装包分两个版本,版本一般用于生产环境。注:开发版本自带运行时可替代运行时版本,但安装的东西会比较多。然后,你需要。文中的示例是我第一次接触Halcon时的学习测试用例,在电脑里面躺了一年,最近才有时间整理一下发出来,希望能对你有所帮助。 阅读详情

1.引入Halcon组件

2.项目配置文件

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="halcondotnet" publicKeyToken="4973BED59DDBF2B8"/>
        <bindingRedirect oldVersion="12.0.0.0-12.0.65535.65535" newVersion="12.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="halcondotnetxl" publicKeyToken="4973BED59DDBF2B8"/>
        <bindingRedirect oldVersion="12.0.0.0-12.0.65535.65535" newVersion="12.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="hdevenginedotnet" publicKeyToken="4973BED59DDBF2B8"/>
        <bindingRedirect oldVersion="12.0.0.0-12.0.65535.65535" newVersion="12.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="hdevenginedotnetxl" publicKeyToken="4973BED59DDBF2B8"/>
        <bindingRedirect oldVersion="12.0.0.0-12.0.65535.65535" newVersion="12.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

 

3.页面配置

4.halcon接口调用

    public partial class HDevelopExport
    {
        public int ResultN;
        public double usedTime;
        public double[] Px;
        public double[] Py;
        public double Fx, Fy;
        public double Cr = 9;
        public double Cx, Cy;
        public bool IsStart = false;

        HTuple hv_R;
        List<HTuple> Aa = new List<HTuple>();
        HTuple hv_Angle, hv_Score, hv_Runtime;
        HTuple hv_ModelID, hv_Row, hv_Column;

        HObject ho_Mask;
        HTuple hv_S1, hv_S2;
        HObject ho_Image, ho_Rectangle, ho_ImageReduced;
        public HTuple hv_ExpDefaultWinHandle;
        HWindowControl HWindowControl;

        /// <summary>
        /// 打开相机
        /// </summary>
        public void OpenCamera()
        {
            //hv_ExpDefaultWinHandle = Window;
            HOperatorSet.GenEmptyObj(out ho_Image); // 生ho_Image数据区
            // Grabbing images from a Daheng USB 2.0 camera
            HOperatorSet.CloseAllFramegrabbers();
            HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
                -1, "false", "default", "[0] Integrated Camera", 0, -1, out hv_Angle);
            HOperatorSet.SetFramegrabberParam(hv_Angle, "tilt", -3);
            HOperatorSet.GrabImageStart(hv_Angle, -1);
            //open camera with default settings
        }

        /// <summary>
        /// 关闭相机
        /// </summary>
        public void CloseCamera()
        {
            HOperatorSet.CloseAllFramegrabbers();
        }

        /// <summary>
        /// 实时播放
        /// </summary>
        public void RealTimePlayback()
        {
            IsStart = true;
            //HObject ho_Image = null;

            //HTuple hv_AcqHandle = new HTuple();
            //// Initialize local and output iconic variables 
            //HOperatorSet.GenEmptyObj(out ho_Image);
            ////Image Acquisition 01: Code generated by Image Acquisition 01
            //HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
            //    -1, "false", "default", "[0] Integrated Camera", 0, -1, out hv_AcqHandle);
            //HOperatorSet.GrabImageStart(hv_AcqHandle, -1);

            Task task = new Task(() =>
            {
                while (IsStart)
                {
                    ho_Image.Dispose();
                    
                    HOperatorSet.GrabImageAsync(out ho_Image, hv_Angle, -1);
                    HTuple hv_Width, hv_Height;
                    HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); // 获取图片的尺寸

                    double ratioWidth = (1.0) * hv_Width[0].I / HWindowControl.Width;
                    double ratioHeight = (1.0) * hv_Height[0].I / HWindowControl.Height;
                    HTuple row1, column1, row2, column2;
                    if (ratioWidth >= ratioHeight)
                    {
                        row1 = -(1.0) * ((HWindowControl.Height * ratioWidth) - hv_Height) / 2;
                        column1 = 0;
                        row2 = row1 + HWindowControl.Height * ratioWidth;
                        column2 = column1 + HWindowControl.Width * ratioWidth;
                        HOperatorSet.SetPart(hv_ExpDefaultWinHandle, row1, column1, row2, column2);
                        HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
                    }
                }
            });
            task.Start();
        }

        /// <summary>
        /// 拍照
        /// </summary>
        public void Photograph()
        {
            IsStart = true;
            

            HTuple hv_Width, hv_Height;
            ho_Image.Dispose(); // 清除ho_Image中的数据
            HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle); // 采集图像
            HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); // 获取图片的尺寸

            double ratioWidth = (1.0) * hv_Width[0].I / HWindowControl.Width;
            double ratioHeight = (1.0) * hv_Height[0].I / HWindowControl.Height;
            HTuple row1, column1, row2, column2;
            if (ratioWidth >= ratioHeight)
            {
                row1 = -(1.0) * ((HWindowControl.Height * ratioWidth) - hv_Height) / 2;
                column1 = 0;
                row2 = row1 + HWindowControl.Height * ratioWidth;
                column2 = column1 + HWindowControl.Width * ratioWidth;


                HOperatorSet.SetPart(hv_ExpDefaultWinHandle, row1, column1, row2, column2);
                HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);

                // 显示ho_Image中的图片
                HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "margin"); // 填充模式为只画框
                HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red"); // 画线颜色红
                HOperatorSet.DispRectangle1(hv_ExpDefaultWinHandle, row1, column1, row2, column2);
            }
        }

        /// <summary>
        /// 初始化相机
        /// </summary>
        public void InitHalcon()
        {
            // Default settings used in HDevelop 
            HOperatorSet.SetSystem("width", 512);
            HOperatorSet.SetSystem("height", 512);
        }

        /// <summary>
        /// 初始化Halcon
        /// </summary>
        /// <param name="Window"></param>
        public void RunHalcon(HWindowControl Window)
        {
            HWindowControl = Window;
            hv_ExpDefaultWinHandle = Window.HalconWindow;
        }

        /// <summary>
        /// 设置模板
        /// </summary>
        public void SetTemplate()
        {
            HTuple hv_Row1, hv_Column1, hv_Row2, hv_Column2;

            MessageBox.Show("在红框中按下鼠标左键画方框选模板,按右键结束");
            HOperatorSet.DrawRectangle1(hv_ExpDefaultWinHandle,
            out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2);
            HOperatorSet.GenRectangle1(out ho_Rectangle, hv_Row1, hv_Column1, hv_Row2, hv_Column2);
            HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced);
            HOperatorSet.WriteImage(ho_ImageReduced, "png", 0, "E:/test.png");
            MessageBox.Show("模板已保存");
        }


        /// <summary>
        /// 从文件中读取模板
        /// </summary>
        public void ReadTemplate()
        {
            HOperatorSet.GenEmptyObj(out ho_ImageReduced);
            ho_ImageReduced.Dispose();
            HOperatorSet.ReadImage(out ho_ImageReduced, "E:/test.png");
        }

        /// <summary>
        /// 模板匹配
        /// </summary>
        public void MatchTemplate()
        {
            int i, j;
            double temp;

            HOperatorSet.GenRectangle1(out ho_Rectangle, 320, 250, 630, 750);
            HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_Mask);

            //Reduce image range
            HOperatorSet.CreateShapeModel(ho_ImageReduced, "auto", (new HTuple(-45)).TupleRad(), (new HTuple(90)).TupleRad(), "auto", "auto", "use_polarity", "auto", "auto", out hv_ModelID);
            HOperatorSet.CountSeconds(out hv_S1); // Match start
            HOperatorSet.FindShapeModel(ho_Mask, hv_ModelID, (new HTuple(-45)).TupleRad(), (new HTuple(90)).TupleRad(), 0.5, 3, 0.0, "least_squares", 0, 0.5, out hv_Row, out hv_Column, out hv_Angle, out hv_Score);

            HOperatorSet.CountSeconds(out hv_S2); // Match stop
            hv_Runtime = (hv_S2 - hv_S1) * 1000;
            usedTime = hv_Runtime;
            ResultN = new HTuple(hv_Row.TupleLength());

            

            // 获取匹配结果个数
            if (ResultN > 0)
            {
                Px = new double[ResultN];
                Py = new double[ResultN];
                hv_R = new HTuple(); //HTuple变量初始化
                for (i = 0; i < ResultN; i++)
                {
                    Py[i] = hv_Row[i]; // 将搜索结果的中心坐标读出
                    Px[i] = hv_Column[i];
                    Aa.Add(hv_Angle[i]);
                    hv_R[i] = 8; //设置圆半径
                }

                for (i = 0; i < ResultN; i++) // 从大到小排序
                {
                    for (j = i + 1; j < ResultN; j++)
                    {
                        if (Px[i] < Px[j])
                        {
                            temp = Px[i];
                            Px[i] = Px[j];
                            Px[j] = temp;
                            temp = Py[i];
                            Py[i] = Py[j];
                            Py[j] = temp;
                            temp = Aa[i];
                            Aa[i] = Aa[j];
                            Aa[j] = temp;
                        }
                    }
                }

                HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red"); // 显示匹配结果位置
                HOperatorSet.DispCircle(hv_ExpDefaultWinHandle, hv_Row, hv_Column, hv_R);
                HOperatorSet.ClearShapeModel(hv_ModelID);
                Cy = Py[0] + 10; // offset的初始值
                Cx = Px[0] + 60;
            }
            else
            {
                MessageBox.Show("匹配失败!?");
            }
        }

        /// <summary>
        /// 显示偏移点位置
        /// </summary>
        public void DisplayOffset()
        {
            HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");
            HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
            HOperatorSet.DispCircle(hv_ExpDefaultWinHandle, hv_Row, hv_Column, hv_R);
            HOperatorSet.DispLine(hv_ExpDefaultWinHandle, hv_Row[0], hv_Column[0], hv_Row[1], hv_Column[1]);
            HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "yellow");
            HOperatorSet.DispCircle(hv_ExpDefaultWinHandle, Cy, Cx, Cr);
        }

        /// <summary>
        /// /显示计算角度,划线
        /// </summary>
        public void DisplayLine()
        {
            HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "yellow");
            HOperatorSet.DispLine(hv_ExpDefaultWinHandle, Cy, Cx, Fy, Fx);
        }
    }

 

5.form1cs页面

        public Form1()
        {
            InitializeComponent();

            timer1.Tick += Timer1_Tick;
            timer1.Interval = 5000;
            this.Controls.Add(hWindowControl1);
            hWindowControl1.Location = new System.Drawing.Point(20, 20);
            hWindowControl1.Width = 500;
            hWindowControl1.Height = 500;
            hd.InitHalcon();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            hd.RunHalcon(hWindowControl1); // 摄像头初始化
        }
        /// <summary>
        /// 打开相机
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpenCamera_Click(object sender, EventArgs e)
        {
            hd.OpenCamera();
            textBox1.Text = "";
            textBox1.Refresh();
        }
        /// <summary>
        ///关闭相机
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCloseCamera_Click(object sender, EventArgs e)
        {
            hd.CloseCamera();
        }
        /// <summary>
        /// 匹配
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMatch_Click(object sender, EventArgs e)
        {
            int j, m;
            double d;
            double[] x;
            double[] y;

            hd.MatchTemplate(); // 图像匹配
            m = hd.ResultN;
            x = new double[m];
            y = new double[m];
            for (j = 0; j < m; j++) // 获取匹配坐标
            {
                x[j] = hd.Px[j];
                y[j] = hd.Py[j];
            }
            textBox1.Text = "匹配时间:" + hd.usedTime.ToString("#####.##") + " ms" + "\r\n" + "\r\n";
            for (j = 0; j < m; j++)
            {
                if (j < m - 1) // 计算2点距离
                {
                    d = (y[j + 1] - y[j]) * (y[j + 1] - y[j]) + (x[j + 1] - x[j]) * (x[j + 1] - x[j]);
                    d = Math.Sqrt(d);
                    d = 0.0485 * d;
                    textBox1.Text = textBox1.Text + "d(" + Convert.ToString(j + 1) + ") = " + d.ToString("#####.##")+ "mm" + "\r\n";
                }
                textBox1.Text = textBox1.Text + "x(" + Convert.ToString(j + 1) + ") = " + Convert.ToString(x[j]) + " y(" + Convert.ToString(j + 1) + ") = " + Convert.ToString(y[j]) + "\r\n" + "\r\n";
            }
        }
        /// <summary>
        /// 设置模板
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnTemplate_Click(object sender, EventArgs e)
        {
            hd.SetTemplate();
        }

        /// <summary>
        /// 加载模板
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLoadTemplate_Click(object sender, EventArgs e)
        {
            hd.ReadTemplate();
        }
        /// <summary>
        /// 实时播放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPlayback_Click(object sender, EventArgs e)
        {
            hd.RealTimePlayback();
        }

        /// <summary>
        /// 显示结果
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDisplayResults_Click(object sender, EventArgs e)
        {
            double a, b, c, d, m, n;
            double alpha, beta;
            a = hd.Px[0];
            b = hd.Py[0];
            c = hd.Px[0];
            d = hd.Py[0];
            alpha = Math.Atan((d - b) / (c - a));
            beta = theta + alpha;
            m = a + Lam * Math.Cos(beta);
            n = b + Lam * Math.Sin(beta);
            textBox1.Text = textBox1.Text + " m = " + Convert.ToString(m) + "\r\n" + "n = " + Convert.ToString(n) + "\r\n" + "alpha = " + Convert.ToString(alpha) + "\r\n" + " theta = " + Convert.ToString(theta) + "\r\n" + " beta = " + Convert.ToString(beta);

            hd.Cx = m;
            hd.Cy = n;
            hd.Fx = m - 600 * Math.Cos(alpha); // 计算夹角斜线的终点坐标
            hd.Fy = n - 600 * Math.Sin(alpha);
            hd.DisplayOffset(); // 显示插针位置
            hd.DisplayLine(); // 显示工件夹角
        }
        /// <summary>
        /// 拍照
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPhotograph_Click(object sender, EventArgs e)
        {
            hd.Photograph();
        }

 

 

Halcon与C#联合编程实战:解决‘halcondotnet.dll‘异常的3种方法(附完整代码) 本文针对Halcon与C#联合编程中常见的'halcondotnet.dll'异常问题,提供了三种系统性的解决方法。从环境配置与依赖检查、防御性代码编写与资源管理,到高级调试技巧,文章深入剖析了异常本质,并附有完整的实战代码示例,帮助开发者构建健壮的机器视觉应用。 阅读详情

相关推荐

基于Halcon深度学习分类与C#客户端集成的工业视觉检测实战

本文详细介绍了如何利用Halcon深度学习分类技术,并结合C#客户端开发,构建一套完整的工业视觉检测系统。内容涵盖从数据标注、模型训练与调参,到最终将训练好的模型集成到C#桌面应用中的全流程实战,为工业质检的快速落地提供了清晰的路径和关键技巧。

weixin_29100399的博客 282

用OpenCV写的HalconDotNet

使用OpenCV写的HalconDotNet与Halcon使用方式一样,需要用VS2019编译,还需要下载NuGet库才可以运行

Halcon二值化参数调优实战:在C#里用TrackBar动态调整阈值,实时观察效果

本文详细介绍了如何在C#中结合Halcon实现图像二值化的动态参数调优,通过TrackBar控件实时调整阈值并观察效果,提升工业视觉开发效率。文章涵盖环境搭建、动态阈值调节、连通区域筛选及性能优化等核心内容,为开发者提供了一套完整的交互式调试方案。

weixin_30553777的博客 449

Halcon .Net 参考文档 ReferenceDotNet

Halcon .Net 参考文档 ReferenceDotNet

Halcon与C#联合编程实战:硬币识别项目全流程解析

机器视觉中,图像处理算法与业务逻辑的分离是工程落地的关键。Halcon作为专业视觉算法库,负责图像预处理、阈值分割、轮廓拟合等核心步骤;C#则承担界面交互与流程控制,两者通过联合编程实现高效协作。在工业质检、尺寸测量、缺陷检测等场景,这种混合编程模式能兼顾算法迭代速度与系统稳定性。本文以硬币识别为切入点,完整演示了从图像滤波、动态阈值分割、连通域筛选到圆拟合的Halcon侧算法链路,以及C#中dll引用、代码导出和封装调用的集成方案,并总结了反光、粘连、参数漂移等实战坑点,帮助读者快速掌握视觉项目的最小可行

weixin_28691741的博客 300

Halcon与C#联合开发工业视觉检测系统实战

机器视觉是工业自动化领域的核心技术,通过图像处理算法实现产品质量检测与过程控制。Halcon作为专业视觉开发库,提供丰富的图像处理算子与深度学习支持,结合C#的高效开发能力,可快速构建稳定可靠的视觉检测系统。在电子装配、汽车制造等场景中,这种技术组合能显著提升检测效率,如螺丝装配检测准确率可达99.7%以上。典型实现包括图像采集、预处理、特征提取等环节,通过HalconDotNet接口与C#无缝集成,相比传统OpenCV方案可减少60%编码量。关键技术涉及模板匹配、多线程优化等,适用于需要快速原型开发的中小

weixin_29094301的博客 302

HALCON学习之旅(七)

HALCON学习之旅(七)

qq_48034474的博客 4342

HALCON 20.11深度学习异常检测实战:从良品训练到C#部署

机器视觉中,异常检测是工业质检的核心难点。传统算法依赖手工特征与规则,面对复杂缺陷时泛化能力有限。深度学习技术通过自编码器学习正常样本分布,推理时利用重建误差定位异常区域,无需逐缺陷标注。HALCON 20.11提供完整的异常检测工具链,仅需良品图像即可完成模型训练,显著降低落地门槛。本文结合工程实践,详细讲解从数据集构建、图像预处理、模型训练、阈值调整到C#部署的完整流程,并分享数据增强、显存优化、误检排查等实用技巧,为机器视觉工程师提供一套可快速验证的深度学习异常检测方案。

weixin_29045585的博客 277

C# Halcon OCR训练与识别实战

Halcon作为工业视觉领域的强大工具,其OCR(光学字符识别)功能在自动化检测、物流分拣等领域广泛应用。结合C#开发界面程序,可实现高效灵活的视觉工作流。本章将聚焦OCR训练与识别的完整流程,涵盖字符分割、模型训练、实时识别等关键环节。Halcon的OCR流程通常分为训练和识别两阶段。训练阶段需准备字符样本并生成分类器文件(.omc);识别阶段加载模型并处理新图像。字符分割是OCR的关键步骤,需根据实际场景调整参数。

vPw_86vg的博客 285

Halcon+C#工业视觉检测工具开发实战

计算机视觉在工业检测中扮演着关键角色,其中边缘检测和特征提取是核心技术。通过亚像素级算法处理,可以实现微米级精度的尺寸测量。Halcon作为工业视觉领域的标杆工具,其丰富的算子库和GPU加速能力,显著提升了复杂场景下的检测效率。结合C#的WPF框架开发可视化界面,能够快速构建包含实时图像处理、参数调节和结果输出的完整解决方案。这种技术组合在PCB板定位、轴承测量等场景中表现优异,检测效率可达传统方案的3倍以上。特别是其内置的60多种边缘提取算子(如sobel、canny等)和Hough变换圆检测算法,为工业

weixin_30325971的博客 500

『Halcon与C#混合编程』001_环境搭建

5、拖动一个HWindowControl窗体放入到Form1中。如果启动后不报bug就说明在C#中一个基本的环境就配置好了。将上述两个文件复制到刚刚创建的窗体应用的文件夹中debug目录下。(我的是20220816_1\bin\Debug)这样在工具箱中就会显示Halcon的控件。6、在HALCON窗体加载时显示一张图像。4、添加HALCON的窗体工具箱—1、首先新建一个C#窗体应用程序。............

Halcon机器视觉 2415

C#与Halcon融合的工业视觉检测系统开发实践

工业视觉检测系统通过计算机视觉技术实现自动化质量检测,其核心在于图像处理算法与上位机控制的协同工作。Halcon作为机器视觉领域的标杆工具库,提供了丰富的图像处理算子,而C#则是工业上位机开发的常用语言。将两者深度融合可以构建高性能的视觉检测系统,典型应用包括PCB板缺陷检测、电子元件定位等场景。本文详解的植板控制系统V2.1采用拖拽式编程框架,通过HalconDotNet实现算法调用,并优化了参数错误处理和内存管理等关键技术点。系统特别针对halcon缺陷检测和c#上位机示波器等高频需求场景进行了性能优化

weixin_33226548的博客 299

C#版Halcon:HalconDotNet最详细最全面教程(万字详细总结)

Halcon是由德国MVTec Software GmbH公司开发的一款强大的机器视觉软件。自1996年发布以来,Halcon已经成为工业视觉领域的领导者,广泛应用于自动化检测、质量控制、机器人视觉、医学影像分析等多个领域。Halcon提供了丰富的图像处理和分析工具,支持多种编程语言接口,包括C#、C++、Python等,使得开发者可以轻松地将视觉功能集成到各种应用中。

仰望星空的博客 2万+

C#与Halcon静态调用在工业视觉检测中的实践

机器视觉作为工业自动化的关键技术,通过图像处理算法实现产品质量检测、尺寸测量等核心功能。Halcon作为行业领先的视觉算法库,其丰富的算子库和高效计算能力为工业应用提供了强大支持。C#语言凭借其出色的界面开发能力和.NET生态优势,成为工业上位机开发的主流选择。通过静态调用方式将两者结合,既能保证类型安全又提升执行效率,特别适合对实时性要求高的产线检测场景。本文以实际项目为例,详细解析环境配置、API封装、多线程优化等关键技术要点,并分享内存管理、异常处理等工程实践经验,为开发者提供从入门到进阶的全方位指导

weixin_31856057的博客 214

HalconDotNet的图像模式识别详解

在HalconDotNet中,图像模式识别是图像处理中的重要部分,用于识别和分类图像中的特定模式。以下是五种常见的图像模式识别方法及其详细说明和C#示例代码。

仰望星空的博客 1638

C#联合Halcon与海康相机:工业视觉上位机开发实战

工业视觉上位机开发中,C#与Halcon及海康威视SDK的集成是实现图像采集、处理与显示的关键技术。其原理是通过C#调用HalconDotNet进行图像处理,利用海康SDK取流,并统一坐标系实现缩放平移与模板匹配。技术价值在于提升开发效率与系统稳定性,广泛应用于3C检测、定位等场景。本文分享从环境搭建到模板匹配的完整落地路径,解决坐标漂移、内存泄漏等常见问题。

weixin_33462167的博客 28

工业视觉检测系统:VB+Halcon实现金属件缺陷检测

工业视觉检测系统是智能制造中的关键技术,通过图像处理算法实现产品质量自动检测。其核心原理是利用计算机视觉技术对采集到的图像进行分析,识别产品表面的缺陷或异常。在工业自动化领域,这类系统需要满足实时性、鲁棒性和可维护性三大要求。典型应用包括金属零件检测、电子元件质检等场景。以VB+Halcon技术栈为例,通过中值滤波、阈值分割等传统算法,配合工业相机和专用光源,可以构建稳定的检测系统。现代工业视觉正逐步引入深度学习和3D视觉技术,但理解基础图像处理原理仍是优化检测算法的关键。

weixin_29172201的博客 274

halcon深度学习落地指南:从标注训练到C#部署

在工业视觉场景中,深度学习模型的落地往往需要打通数据标注、训练、评估与上位机部署多个环节,传统组合Python训练栈与C#对接时常面临格式转换和接口适配的困扰。halcon提供了一体化方案,基于DLDataset统一数据格式,将标注、预处理、训练和推理封装为收口算子,配合HalconDotNet可无缝集成C#工程。这种模式尤其适合物体识别与图像分割等固定场景的快速交付,能显著降低工程复杂度。本文从halcon深度学习模块的能力边界出发,详解数据集预处理、模型创建、超参设置、验证评估以及C#推理服务封装的关键

weixin_32495691的博客 230
上一篇: C# Socket 读取可变长度数据
下一篇: C# 控制TSC打印机功能
code_long
博客等级 码龄16年 35粉丝 19原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值