设置首页收藏本站
开启左侧

C#如何注册相机回调函数

[复制链接]
完美世界 发表于 2018-12-25 13:17:45 | 显示全部楼层 |阅读模式
最近在做一个外部硬件触发的项目,用的相机是basler的3800-10gm 相机。编程语言是C#我先上代码:(因为是测试项目,所以代码写的很丑陋,仅作实验目使用)

第一步:初始化相机
  1. private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             
  4.             HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "progressive",
  5.                 -1, "default", -1, "false", "default", "Cam_Up", 0, -1, out hv_AcqHandle);
  6.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerSelector", "FrameStart");
  7.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "grab_timeout", 10000);
  8.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerMode", "On");
  9.             HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerSource", "Line1");
  10.             FrameCallback += FrameCallback;
  11.             //HOperatorSet.get
  12.         }
复制代码
第二步:注册回调函数,并且查看是否进入回调函数
  1. public static int MyCallback(IntPtr AcqHandle, IntPtr Context, IntPtr UserContext)
  2.         {
  3.             int Content = UserContext.ToInt32();
  4.             Console.WriteLine("--------进入回调函数--------");
  5.             return 0;
  6.         }

  7.         private void Btn_Grab_Click(object sender, EventArgs e)
  8.         {
  9.             try
  10.             {
  11.                 int myContent = 2;
  12.                 HOperatorSet.GetFramegrabberParam(hv_AcqHandle, "available_callback_types", out HTuple value);
  13.                 foreach (var it in value.SArr)
  14.                     Console.WriteLine(it);
  15.                 int len = value.SArr.Length;
  16.                 IntPtr Ptr = Marshal.GetFunctionPointerForDelegate(FrameCallback);
  17.                 HOperatorSet.SetFramegrabberCallback(hv_AcqHandle, value.SArr[len-4], Ptr, myContent);
  18.                 HOperatorSet.GetFramegrabberCallback(hv_AcqHandle, value.SArr[len - 4], out HTuple callFunc, out HTuple content);
  19.                 HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
  20.                 HOperatorSet.GrabImageAsync(out HObject image, hv_AcqHandle, -1);
  21.                
  22.             }
  23.             catch(Exception ex)
  24.             {

  25.             }
  26.         }
复制代码
奇怪的是我把basler支持的所有回调函数类型都试了一个遍,没有发现一个可以进入到MyCallback函数里面的,不知道是哪个地方组偶哦了,有谁做过能给点参考吗?感谢!!!!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
绝地武士 发表于 2018-12-26 09:10:25 | 显示全部楼层
硬件触发需要外部支持,楼主硬件能够在basler自带软件里面硬触发模式下触发吗?同时可以测试下用halcon实现软触发看看可不可以,然后再用你的C#代码采用回调测试,要进回调必须触发硬件传感器的。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 完美世界 发表于 2018-12-26 09:20:18 | 显示全部楼层
绝地武士 发表于 2018-12-26 09:10
硬件触发需要外部支持,楼主硬件能够在basler自带软件里面硬触发模式下触发吗?同时可以测试下用halcon实现 ...

有触发的,可以触发拍照,但是就是没法进入到回调函数里面
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
绝地武士 发表于 2018-12-26 09:58:03 | 显示全部楼层
完美世界 发表于 2018-12-26 09:20
有触发的,可以触发拍照,但是就是没法进入到回调函数里面

设置回调的C#原型代码:
  1. static void HOperatorSet.SetFramegrabberCallback(HTuple acqHandle, HTuple callbackType, HTuple callbackFunction, HTuple userContext)
  2. void HFramegrabber.SetFramegrabberCallback(string callbackType, IntPtr callbackFunction, IntPtr userContext)
复制代码


其中callback类型
  1. 'exception':
  2. The image acquisition has raised an exception.

  3. 'exposure_end':
  4. The exposure of the next image has been finished.

  5. 'exposure_start':
  6. The exposure of the next image has been started.

  7. 'transfer_end':
  8. A new image is ready to be fetched by GrabImageAsync.
复制代码

你应该是用第四个类型transfer_end 而且用异步获取图像!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 完美世界 发表于 2018-12-26 15:12:34 | 显示全部楼层
本帖最后由 完美世界 于 2018-12-26 15:13 编辑
绝地武士 发表于 2018-12-26 09:58
设置回调的C#原型代码:

您好,对的,我使用的就是GrabImageAsync,我查询了一下,这个balser相机可用的回调函数类型只有以下几种:
AcquisitionStart
AcquisitionStartOvertrigger
EventOverrun
ExposureEnd
FrameStart
FrameStartOvertrigger
标准的回调函数类型没有呢,不知道下面该怎么操作了
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
NewVisionUser 发表于 2018-12-27 15:46:02 | 显示全部楼层
你的回调函数是MyCallbacK(...),但从你的代码看,你根本没有注册它。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
tystq 发表于 2018-12-28 14:13:37 | 显示全部楼层
Basler的回调支持有限,把value.SArr[len-4]改成"LineStatus"应该能触发
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 完美世界 发表于 2018-12-30 21:26:47 | 显示全部楼层
完美世界 发表于 2018-12-26 15:12
您好,对的,我使用的就是GrabImageAsync,我查询了一下,这个balser相机可用的回调函数类型只有以下几种 ...

呀,一语点醒梦中人,我发现我委托没有协商,写成FrameCallback+=FrameCallback了,我元旦过后去公司看看,真晕!非常感谢
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 完美世界 发表于 2018-12-30 21:28:10 | 显示全部楼层
NewVisionUser 发表于 2018-12-27 15:46
你的回调函数是MyCallbacK(...),但从你的代码看,你根本没有注册它。

谢谢,刚才 NewVisionUser给了我一个提醒,由于自己的错误,回调函数根本就没有注册上,感谢您的回复,我周二回公司一起测试一下,看看
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 完美世界 发表于 2019-1-7 09:24:53 | 显示全部楼层
感谢大家的帮助,我试了一下,用 ExposureEnd 这种回调类型可以进入到回调函数里面
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表