QQ登录

只需一步,快速开始

halcon set_framegrabber_callback函数的使用

[ 复制链接 ]
set_framegrabber_callback函数要求传递一个回调函数地址。
第一次使用,真不知道如何传递。
这里分享给大家方法。代码来自网络的C#版本。

创建c#窗口工程,并进行halcon相关的配制。之后是创建一个回调函数,获取此回调函数地址,并传递给set_framegrabber_callback使用。
public  int MyCallbackFunction(IntPtr handle, IntPtr context, IntPtr user_context)

关键代码为
HalconDotNet.HalconAPI.HFramegrabberCallback delegateCallback;//定义一个halcon 的回调函数变量并赋值
delegateCallback= MyCallbackFunction;

此回调函数变量地址通过下面获取
IntPtr ptr = Marshal.GetFunctionPointerForDelegate(delegateCallback);//取回调函数的地址
ptr变量就是我们想要的回调函数地址了,可以进行传递使用。
HOperatorSet.SetFramegrabberCallback(hv_AcqHandle,"LineStatus", ptr, ptr1);

ptr1为传递的另一个参数,查看下面源代码。
注意
using HalconDotNet;
using System.Runtime.InteropServices;
两名的引用

下面是源代码,可参考用于自己项目中
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using HalconDotNet;
  11. using System.Runtime.InteropServices;
  12. namespace WindowsFormsApplication4
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.         }
  20.         public HTuple hv_AcqHandle = null;//定义相机句柄
  21.         public   HObject img = null;//定义图像变量
  22.         HalconDotNet.HalconAPI.HFramegrabberCallback delegateCallback;//定义一个委托
  23.      
  24.         private void Form1_Load(object sender, EventArgs e)//窗体加载的时候委托绑定及开启相机等操作
  25.         {
  26.             //给委托绑定
  27.             delegateCallback = MyCallbackFunction;
  28.             //开启相机
  29.             HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
  30.       -1, "default", -1, "false", "default", "38af2918ce35_DahuaTechnology2EDa_A7A20MG9jsn63S",
  31.       0, -1, out hv_AcqHandle);
  32.             //下面开启硬触发
  33.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerMode", "On");
  34.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerSource", "Line1");
  35.             //下面设置连续采集,上升沿触发,曝光模式等
  36.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "AcquisitionMode", "Continuous");
  37.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerSelector", "FrameStart");
  38.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerActivation", "RisingEdge");
  39.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "ExposureMode", "Timed");
  40.             //设置曝光时间
  41.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "ExposureTime", 80000.0);
  42.             //下面为设置用不超时
  43.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "grab_timeout", -1);
  44.         }
  45.         private int test = 1;//随便定义的一个变量,后面会取其地址带入回调函数的user_context
  46.       
  47.         public  int MyCallbackFunction(IntPtr handle, IntPtr context, IntPtr user_context)//回调函数
  48.         {
  49.             try
  50.             {
  51.                 HOperatorSet.GrabImage(out img, hv_AcqHandle);
  52.                 if (this.hWindowControl1.InvokeRequired)//线程亲和性判定
  53.                 {
  54.                     this.Invoke(new MethodInvoker(() => { HOperatorSet.DispObj(img, this.hWindowControl1.HalconWindow); img.Dispose(); }));//把图像显示出来(这里是委托方式显示)
  55.                 }
  56.                 else
  57.                 {
  58.                     HOperatorSet.DispObj(img, this.hWindowControl1.HalconWindow);//把图像显示出来
  59.                     img.Dispose();
  60.                 }
  61.                 return 0;
  62.             }
  63.             catch (Exception ex)
  64.             {
  65.              //  MessageBox.Show(ex.Message);//显示错误
  66.                 return -1;
  67.             }
  68.          
  69.         }

  70.         private void btnReg_Click(object sender, EventArgs e)//这里注册回调
  71.         {
  72.             IntPtr ptr = Marshal.GetFunctionPointerForDelegate(delegateCallback);//取回调函数的地址
  73.             IntPtr ptr1 = GCHandle.Alloc(test, GCHandleType.Pinned).AddrOfPinnedObject();//取test变量的地址

  74.             //因为大华的相机不支持"transfer_end"等模式,只能用 "LineStatus"作演示
  75.             HOperatorSet.SetFramegrabberCallback(hv_AcqHandle, "LineStatus", ptr, ptr1);//注册回调函数
  76.         }

  77.         private void btnGetPara_Click(object sender, EventArgs e)//返回支持available_callback_types的列表参数
  78.         {
  79.             HTuple Value=null;
  80.             //下面返回支持回调的列表
  81.             HOperatorSet.GetFramegrabberParam(hv_AcqHandle,"available_callback_types",out Value);
  82.             int l = Value.Length;
  83.             for(long i=0;i<l;i++)
  84.             {
  85.                 this.listBox1.Items.Add(Value[i].S);
  86.             }
  87.          }

  88.         private void btnCloseCamera_Click(object sender, EventArgs e)//关闭相机
  89.         {
  90.             if (hv_AcqHandle == null) return;
  91.             HOperatorSet.CloseFramegrabber(hv_AcqHandle);
  92.         }

  93.         //-------以下是循环方式采集图像--------------------------------------
  94.         private bool exitloop = false;//推出循环命令
  95.         private void btnLoop_Click(object sender, EventArgs e)//采用循环的方式去取图
  96.         {
  97.             exitloop = false;
  98.             btnExitLoop.Focus();
  99.             System.Threading.Thread.Sleep(100);
  100.             while(exitloop==false)
  101.             {
  102.                 Application.DoEvents();
  103.                 try
  104.                 {
  105.                       HOperatorSet.GrabImage(out img, hv_AcqHandle);
  106.                       HOperatorSet.DispObj(img, this.hWindowControl1.HalconWindow);
  107.                       Application.DoEvents();
  108.                 }
  109.                 catch (Exception)
  110.                 {
  111.                     Application.DoEvents();
  112.                     continue;
  113.                     //throw;
  114.                 }
  115.             }
  116.         }

  117.         private void btnExitLoop_Click(object sender, EventArgs e)//退出循环
  118.         {
  119.             exitloop = true;
  120.         }
  121.     }
  122. }
复制代码



回复

使用道具 举报

快速回复 返回列表 客服中心 搜索