Halcon联合C#实时采集图像

文中内容参考的学习课程为超人视频启蒙续集之Halcon联合C#以及手眼标定

实时采集方法一共有四种:循环采集、定时器、多线程、回调函数

本文在上一次的代码上进行完善,于是复制了一份上次的代码,再次打开找不到这个界面:

打开C#设计窗口的方法:

完善过程:

1.halcon部分

halcon中打开采集助手,自动检测接口,连接,实时,插入代码

Halcon部分代码为:

* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', 8, 'rgb', -1, 'false', 'default', '0030532361ef_Basler_acA160020gc', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
    grab_image_async (Image, AcqHandle, -1)
    get_image_size (Image, Width, Height)
    dev_set_part (0, 0, Height, Width)
endwhile
close_framegrabber (AcqHandle)

2.C#部分

配置如上篇文章所示,我是直接用上次代码改的所以没有重新配置。

添加控件timer,属性栏如下。定时器法是不准确的,间隔时间越长越不准。点击闪电标志,Interval更改为40ms,40ms到了之后执行事件。定时器打开之后,不采集了要关闭,否则会出现错误 :HALCON error #2454: HALCON handle was already cleared in operator grab_image_async

接下来就是双击不同的控件,然后在里面将halcon导出的代码复制粘贴到对应位置。

 Halcon导出的C#代码中,只需关注action函数中的代码:

// Local iconic variables 
    HObject ho_Image=null;
    // Local control variables
 HTuple hv_AcqHandle = new HTuple(), hv_Width = new HTuple();
    HTuple hv_Height = new HTuple();
    // Initialize local and output iconic variables 
    HOperatorSet.GenEmptyObj(out ho_Image);
    //Image Acquisition 01: Code generated by Image Acquisition 01
    hv_AcqHandle.Dispose();
    HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive", 
        8, "rgb", -1, "false", "default", "0030532361ef_Basler_acA160020gc", 0, -1, 
        out hv_AcqHandle);
    HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
    while ((int)(1) != 0)
    {
      ho_Image.Dispose();
      HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
      hv_Width.Dispose();hv_Height.Dispose();
      HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
      if (HDevWindowStack.IsOpen())
      {
        HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);
      }
    }
    HOperatorSet.CloseFramegrabber(hv_AcqHandle);
    ho_Image.Dispose();
    hv_AcqHandle.Dispose();
    hv_Width.Dispose();
    hv_Height.Dispose();

打开相机部分的代码:

 #region 打开相机
        private void button3_Click(object sender, EventArgs e)
        {
            //清空、打开、初始化相机
            // Initialize local and output iconic variables 
            HOperatorSet.GenEmptyObj(out ho_Timg);
            //Image Acquisition 01: Code generated by Image Acquisition 01
           hv_AcqHandle.Dispose();
            HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
                8, "rgb", -1, "false", "default", "0030532361ef_Basler_acA160020gc", 0, -1,
                out hv_AcqHandle);
            HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
            textBox1.Text = "相机已打开!";
        }
        #endregion

采集显示部分的代码:

注意:如果显示的图像只是halcon中可以看到的一部分,则说明halcon中没有使用dev_set_part()函数

#region 采集显示
        /// <summary>
        /// 此部分包含定时器的触发
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            //打开窗口显示图片
            HOperatorSet.OpenWindow(0, 0, hWindowControl1.Width, hWindowControl1.Height, hWindowControl1.HalconWindow, "visible", "", out hv_WindowHandle);
            HDevWindowStack.Push(hv_WindowHandle);
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            ho_Timg.Dispose();
            //获取图片
            HOperatorSet.GrabImageAsync(out ho_Timg, hv_AcqHandle, -1);
            //获取图片长宽
            hv_Width.Dispose(); hv_Height.Dispose();
            HOperatorSet.GetImageSize(ho_Timg, out hv_Width, out hv_Height);
            //设置获取的图片在窗口中显示大小(此部分如果没有,则只能显示采集到的一部分图像)
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);
            }
           
            //如果窗口打开,显示图片
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.DispObj(ho_Timg, HDevWindowStack.GetActive());
                textBox1.Text = "实时录像成功!";
            }
        }
        #endregion

关闭相机部分的代码:

 #region 关闭相机
        private void button5_Click(object sender, EventArgs e)
        {
            //关闭定时器这步十分重要,不能少了
            timer1.Enabled = false;
            HOperatorSet.CloseFramegrabber(hv_AcqHandle);
            ho_Timg.Dispose();
            textBox1.Text = "关闭相机成功!";
        }
        #endregion

 

  • 11
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: Halcon是一款工业视觉软件,可用于机器人视觉、自动化和品质控制等领域。而C语言作为一个底层语言,可以提供更高的性能和灵活性。 使用Halcon联合C,能够帮助开发者从底层开始构建自己的计算机视觉应用程序。C语言可以用来编写高效的算法,而Halcon则可以提供可视化编程界面和现成的图像处理函数库。开发者可以使用C语言实现自己的算法,然后将算法进行封装,以便在Halcon中使用。 使用Halcon联合C还有许多其他好处。例如,开发者可以利用C语言进行低级别的图像控制和数据_IO,然后使用Halcon进行高级别的控制(例如表面匹配,物体检测和识别,特征提取等)。 此外,Halcon联合C还可以帮助开发者提高性能并减少内存使用,尤其是在大型图像处理任务中。由于C语言提供更多的内存和速度控制,因此将其与Halcon结合使用可以实现更多的资源优化。 总之,通过将Halcon与C结合使用,开发者可以在计算机视觉应用程序中获得性能和灵活性的最佳平衡。无论是将两者结合来创建底层算法,还是使用Halcon来实现高级别的控制,开发者都可以受益于这种组合。 ### 回答2: Halcon和C一起使用可以实现图像处理算法的高效开发和优化,从而实现高速、准确的图像处理和计算机视觉任务。Halcon作为一款成熟的图像处理软件,具有强大的图像处理算法库和用户界面,可以方便地进行图像采集、预处理、分析和展示。而C语言,则是一种通用、高效的编程语言,可以进行具有复杂性能要求的图像处理算法的优化和实现。Halcon提供了方便的接口,使得用户可以用C语言与Halcon进行交互,实现自定义算法的快速开发和优化。同时,Halcon和C联合使用还可以实现对嵌入式设备或FPGA等硬件平台的支持,从而提高其运算速度和实现更多的计算能力。总而言之,Halcon和C的联合使用可以使得图像处理应用程序的开发更加高效和灵活,为许多领域,如机器视觉、自动化生产线、医疗影像等提供更好的解决方案。 ### 回答3: Halcon是一款强大的计算机视觉软件,具有很高的灵活性和可扩展性。Halcon可以与其他软件和编程语言进行联合使用,其中包括C语言。 Halcon联合C语言的主要优点是,可以利用C语言进行高级算法的开发和优化,同时利用Halcon进行图像处理和计算机视觉应用的实现。这种联合使用可以提高程序的性能和效率,节省开发时间和成本。 Halcon提供了与C语言进行集成的API接口,可以方便地进行数据传输和函数调用。同时,Halcon还支持C语言编写的DLL动态链接库,可以轻松地将Halcon集成到现有的C语言项目中。 除此之外,Halcon还提供了丰富的开发文档和示例程序,帮助开发人员快速掌握联合使用的技巧和方法。 综上所述,Halcon联合C语言可以充分发挥两者的优势,提高开发效率和程序性能,使图像处理和计算机视觉应用开发更加便捷和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值