分享

使用halcon解决工业相机外部触发模式下的超时问题

 行走在理想边缘 2016-08-17

很多情况下,我们在使用工业相机时,不能使用相机自带的SDK(或者是我们太懒了,不希望写SDK这么麻烦),所以很多人会选择halcon的Image Acquisition助手,简单,通用,速度快,简直是神器.

但是在实际的应用中,会发现一个严重的问题,如果需要使用相机的外部触发,那么会出现什么情况呢?

\

\

,毫无疑问,会超时.

分析一下,默认的grab_timeout值为5000,那么如果设置了外部触发,当grab_image_async (Image, AcqHandle, -1)在5s内没有采集到图像的话,就会抛出异常,显而易见,这是不应该发生的.


那么如何处理这个问题呢?直接先上代码和结果

\

\

(由于测试的时候用的是线阵相机,所有是这样的效果,但是结果ok)

附上关键代码

while (true)
try
grab_image_async (Image, AcqHandle, -1)
* Image Acquisition 01: Do something
catch(exception)
continue
endtry
endwhile

这里最好再设置一下超时的值,最好设置小一点,这样触发后采集的精度高一些.设想如果超时5s,那么有可能刚循环开始采集时,触发了外部信号,那么必须要等到异常(5s后)才执行采集,显然是不合理了.

在C#中,为了防止主程序假死,最好开个线程执行循环.



//获取相机句柄
HOperatorSet.OpenFramegrabber('GigEVision', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1,'false', 'default', '00111cf59efc_TeledyneDALSA_SpyderGigEColourCame', 0, -1,out AcqHandle);
//帧触发模式(获取开始采集的时间)
HOperatorSet.SetFramegrabberParam(AcqHandle,'FrameStartTriggerMode','On');
HOperatorSet.SetFramegrabberParam(AcqHandle,'grab_timeout',100);
HOperatorSet.SetFramegrabberParam(AcqHandle,'LineSelector','Line1');
HOperatorSet.SetFramegrabberParam(AcqHandle,'LineFormat','TTL');


HOperatorSet.GrabImageStart(AcqHandle, -1);
//开一个线程等待采集
Thread thre = new Thread(loopGrab);
thre.Start();
}

}


//等待采集线程
private void loopGrab()
{
while (true)
{
try
{
HOperatorSet.GrabImageAsync(out img, AcqHandle, -1);
//如果采集到图像,执行以下
HOperatorSet.DispObj(img, mainWindow);
halconExecute(true);
}
catch (Exception ex)
{
continue;
}


}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多