不知道大家有没有遇到过这样的情况,使用VisionPro多相机采集图像时,明明没有采集图像的相机会触发采集完成事件,为了避免这样的问题发生,请阅读下面官方文档中的解释。
在某些情况下,当没有可用的已完成采集时,VisionPro采集系统可能会触发一个完整事件。如果在这种情况下调用CompleteAcquire
,则会收到超时错误,或者可能是其他错误。
此问题主要发生在应用程序使用多个采集FIFO时,其中触发器(软件和硬件)正在发生,事件正在触发,以及禁用触发器时。请注意,正如这些发行说明中的其他地方所述,每当您禁用FIFO的触发器时,也应该刷新它。如果采集在刷新FIFO的过程中准备完成,则运行时环境将排队并稍后触发完整事件,即使采集已被刷新。
解决方法:
通过在调用之前验证是否有可用的获取,可以防止整个事件处理程序遇到这些错误,如以下代码所示:
Private Sub Operator_Complete(ByVal sender As Object, ByVal e As CogCompleteEventArgs) Dim numReadyVal, numPendingVal, myTicket, currentTrigNum As Integer Dim CurrentImage As CogImage8Grey Try MyFifo.GetFifoState(numPendingVal, numReadyVal, busyVal) If numReadyVal > 0 Then CurrentImage = _ CType(MyFifo.CompleteAcquire(-1, myTicket, currentTrigNum), CogImage8Grey) Else Throw New CogAcqAbnormalException("Ready count is not greater than 0.") End If Catch ce As CogException MessageBox.Show("The following error has occurred:" & vbCrLf & ce.Message) End Try End Sub
为了方便大家阅读,狗哥将其翻译为C#代码如下:
private void Operator_Complete(object sender,CogCompleteEventArgs e){ int numReadyVal, numPendingVal, myTicket, currentTrigNum; CogImage8Grey CurrentImage;try{ MyFifo.GetFifoState(numPendingVal, numReadyVal, busyVal); if(numReadyVal > 0){CurrentImage = _ CType(MyFifo.CompleteAcquire(-1, myTicket, currentTrigNum), CogImage8Grey)}else{Throw New CogAcqAbnormalException("Ready count is not greater than 0.");}}catch(CogException ce){MessageBox.Show("The following error has occurred:" & vbCrLf & ce.Message)}}
纯手打,没经过IDE验证,仅供参考有问题别找我。
这些代码其实是有点小问题的,比如_ CType
这个东西是什么,康耐视的文档中并没有写,真是让人难以捉摸。
简单解释下代码的意思,首先定义了3个整型变量和一个图像变量。然后尝试通过GetFifoState
方法取得采集工具的当前状态,该方法提供三个输出,分别是处于挂起状态的处理数,准备完成的采集请求数量,繁忙状态。这里只用前两个。然后通过CompleteAcquire
方法触发一次采集,注意:此方法触发的采集与StartAcquire
方法一样不会阻塞。CompleteAcquire
方法总共有三个参数,第一个是未完成的采集数,一般由StartAcquire
方法提供,自动触发取像必须为-1。第二个参数是完成的采集数量,当不是自动触发采集时应与第一个参数一致。第三个参数是完成采集的触发序列号,通过Acquire
方法取得已采集数量与之对比即可发现是否有丢失。
翻译得不是很流畅,有兴趣的可以看看文档。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/241991.html