热点推荐

查看: 787|回复: 9
收起左侧

[待解决] C#如何注册相机回调函数

[复制链接]
  • TA的每日心情
    窃喜
    2019-2-25 13:08
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    5

    主题

    59

    帖子

    125

    积分

    Rank: 1

    积分
    125

    热心会员

    发表于 2018-12-25 13:17:45 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    最近在做一个外部硬件触发的项目,用的相机是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函数里面的,不知道是哪个地方组偶哦了,有谁做过能给点参考吗?感谢!!!!

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    开心
    昨天 09:19
  • 签到天数: 393 天

    连续签到: 12 天

    [LV.9]以坛为家II

    102

    主题

    470

    帖子

    2540

    积分

    Rank: 9

    积分
    2540

    热心会员突出贡献切换助手验证会员最佳新人

    发表于 2018-12-26 09:10:25 | 显示全部楼层
    硬件触发需要外部支持,楼主硬件能够在basler自带软件里面硬触发模式下触发吗?同时可以测试下用halcon实现软触发看看可不可以,然后再用你的C#代码采用回调测试,要进回调必须触发硬件传感器的。

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    窃喜
    2019-2-25 13:08
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    5

    主题

    59

    帖子

    125

    积分

    Rank: 1

    积分
    125

    热心会员

     楼主| 发表于 2018-12-26 09:20:18 | 显示全部楼层
    绝地武士 发表于 2018-12-26 09:10
    硬件触发需要外部支持,楼主硬件能够在basler自带软件里面硬触发模式下触发吗?同时可以测试下用halcon实现 ...

    有触发的,可以触发拍照,但是就是没法进入到回调函数里面

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    开心
    昨天 09:19
  • 签到天数: 393 天

    连续签到: 12 天

    [LV.9]以坛为家II

    102

    主题

    470

    帖子

    2540

    积分

    Rank: 9

    积分
    2540

    热心会员突出贡献切换助手验证会员最佳新人

    发表于 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 而且用异步获取图像!

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    窃喜
    2019-2-25 13:08
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    5

    主题

    59

    帖子

    125

    积分

    Rank: 1

    积分
    125

    热心会员

     楼主| 发表于 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
    标准的回调函数类型没有呢,不知道下面该怎么操作了

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    开心
    2019-2-19 11:22
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    0

    主题

    4

    帖子

    41

    积分

    Rank: 1

    积分
    41
    发表于 2018-12-27 15:46:02 | 显示全部楼层
    你的回调函数是MyCallbacK(...),但从你的代码看,你根本没有注册它。

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    振奋
    昨天 11:31
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    1

    主题

    22

    帖子

    460

    积分

    Rank: 2Rank: 2

    积分
    460
    发表于 2018-12-28 14:13:37 | 显示全部楼层
    Basler的回调支持有限,把value.SArr[len-4]改成"LineStatus"应该能触发

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    窃喜
    2019-2-25 13:08
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    5

    主题

    59

    帖子

    125

    积分

    Rank: 1

    积分
    125

    热心会员

     楼主| 发表于 2018-12-30 21:26:47 | 显示全部楼层
    完美世界 发表于 2018-12-26 15:12
    您好,对的,我使用的就是GrabImageAsync,我查询了一下,这个balser相机可用的回调函数类型只有以下几种 ...

    呀,一语点醒梦中人,我发现我委托没有协商,写成FrameCallback+=FrameCallback了,我元旦过后去公司看看,真晕!非常感谢

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    窃喜
    2019-2-25 13:08
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    5

    主题

    59

    帖子

    125

    积分

    Rank: 1

    积分
    125

    热心会员

     楼主| 发表于 2018-12-30 21:28:10 | 显示全部楼层
    NewVisionUser 发表于 2018-12-27 15:46
    你的回调函数是MyCallbacK(...),但从你的代码看,你根本没有注册它。

    谢谢,刚才 NewVisionUser给了我一个提醒,由于自己的错误,回调函数根本就没有注册上,感谢您的回复,我周二回公司一起测试一下,看看

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

  • TA的每日心情
    窃喜
    2019-2-25 13:08
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    5

    主题

    59

    帖子

    125

    积分

    Rank: 1

    积分
    125

    热心会员

     楼主| 发表于 2019-1-7 09:24:53 | 显示全部楼层
    感谢大家的帮助,我试了一下,用 ExposureEnd 这种回调类型可以进入到回调函数里面

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    经营性网站备案信息 经营性网站
    备案信息

    中国互联网举报中心 中国互联网
    举报中心

    中国文明网传播文明 中国文明网
    传播文明

    诚信网站

    深圳市市场监督管理局企业主体身份公示 工商网监
    电子标识