工业相机常用的工作模式一般为连续采集和外部触发。工作在连续采集模式时,要进行图像处理和显示,一般在多线程中调用grab_image_async函数异步抓取图像,在界面线程中设置定时器读取图像,并用于显示和图像处理。若工作在外部触发模式,采用这种方法则容易出现timeout问题,如何解决呢?
一、注册回调函数SetFramegrabberCallback
这种方法应该是外部触发模式的最佳方法,可以在曝光完成或传输完成后执行回调函数,及时抓取图像并进行后续处理。然而现有采用注册回调函数方法的博文均是采用C#开发的,用到了委托(delegate)机制,而C++不具有这种委托,几乎没有在MFC中开发的。
Halcon中的回调函数的声明如下:
set_framegrabber_callback( : : AcqHandle, CallbackType, CallbackFunction, UserContext : ),推荐的回调类型有exception、exposure_end、exposure_start、transfer_end等几种,具体相机支持的回调类型可通过get_framegrabber_param算子获取。
C#实现注册回调函数可参考:
https://blog.youkuaiyun.com/huan_126/article/details/80253411
在C++中复现这种回调时面临一个问题,即没有delegate,查找资料,有人发布了一个仿C# delegate的开源类,参见:
https://www.codeproject.com/Articles/11464/Yet-Another-C-style-Delegate-Class-in-Standard-C
采用其提供的委托功能,成功实现了C++中的委托,然后相机的回调依然没有实现。
查看Halcon帮助文档,set_framegrabber_callback算子在C++中的声明有三种:
// Signature
void SetFramegrabberCallback(const HTuple& AcqHandle, const HTuple& CallbackType, const HTuple& CallbackFunction,