VisionPro相机硬件触发初始化 - C#

发布时间 2023-11-26 01:47:46作者: 楠哥x

private void InitAcqFifo()
{
CogFrameGrabbers FrameGrabber = new CogFrameGrabbers();//识别已安装的帧抓取器的类//帧抓取器:相机
if (FrameGrabber.Count > 0)//如果相机个数大于1
{
for (int i = 0; i < FrameGrabber.Count; i++)
{
//在此帧抓取器上创建新的采集fifo。AutoPrepare的值将用作autopreparenabled属性的初始设置。如果该值为真,则在创建fifo后将准备fifo。
FIFO[i] = FrameGrabber[i].CreateAcqFifo(FrameGrabber[i].AvailableVideoFormats[1], CogAcqFifoPixelFormatConstants.Format8Grey, 0, true);
if (FIFO == null)
{
throw new CogAcqCannotCreateFifoException("无法创建采集FIFO.");
}
CameraName = FIFO[i].FrameGrabber.Name;
Trigger[i] = FIFO[i].OwnedTriggerParams;
Trigger[i].TriggerModel = CogAcqTriggerModelConstants.Auto;//获取由外部触发器启动。调用startackire是个错误
Trigger[i].TriggerEnabled = true;
if (Trigger == null)
{
throw new CogAcqNoFrameGrabberException("这种板型 " + FIFO[i].FrameGrabber.Name + "不支持触发模式.");
}
//FIFO[i].StartAcquire();
AcqExposure = FIFO[i].OwnedExposureParams;
AcqExposure.Exposure = 0.45;
//AcqBrightness = FIFO[i].OwnedBrightnessParams;
//AcqBrightness.Brightness = 0.9;
//FIFO[i].Complete += new CogCompleteEventHandler(FIFO0_Complete);
switch (i)
{
case 0: FIFO[0].Complete += new CogCompleteEventHandler(FIFO0_Complete); break;
case 1: FIFO[1].Complete += new CogCompleteEventHandler(FIFO1_Complete); break;
case 2: FIFO[2].Complete += new CogCompleteEventHandler(FIFO2_Complete); break;
}
}
}
else
{
throw new CogAcqNoFrameGrabberException("电路板可能丢失或工作不正常.");
}
}


public int numReadyVal0, numPendingVal0, myTicket0, currentTrigNum0;
public int numReadyVal1, numPendingVal1, myTicket1, currentTrigNum1;
public int numReadyVal2, numPendingVal2, myTicket2, currentTrigNum2;
public bool busyVal0 = false;
public bool busyVal1 = false;
public bool busyVal2 = false;
int TriggerCount0 = 0;
int TriggerCount1 = 0;
int TriggerCount2 = 0;
ICogImage[] Image = new ICogImage[5];/
bool CamFlag1 = false, CamFlag2 = false, CamFlag3 = false;
void FIFO0_Complete(object sender, CogCompleteEventArgs e)
{
try
{
FIFO[0].GetFifoState(out numPendingVal0, out numReadyVal0, out busyVal0);

if (numReadyVal0 > 0)
{
TriggerCount0++;
numReadyVal0 = 0;
Image[0] = FIFO[0].CompleteAcquire(-1, out myTicket0, out currentTrigNum0);
//cogRecordDisplay1.Image = FIFO[0].CompleteAcquire(-1, out myTicket0, out currentTrigNum0);
CamFlag1 = true;

if (TriggerCount0 == 4)
{
TriggerCount0 = 0;
GC.Collect();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void FIFO1_Complete(object sender, CogCompleteEventArgs e)
{
try
{
FIFO[1].GetFifoState(out numPendingVal1, out numReadyVal1, out busyVal1);

if (numReadyVal1 > 0)
{
TriggerCount1++;
numReadyVal1 = 0;
Image[1] = FIFO[1].CompleteAcquire(-1, out myTicket1, out currentTrigNum1);
//cogRecordDisplay2.Image = FIFO[1].CompleteAcquire(-1, out myTicket1, out currentTrigNum1);
CamFlag2 = true;

if (TriggerCount1 == 4)
{
TriggerCount1 = 0;
GC.Collect();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void FIFO2_Complete(object sender, CogCompleteEventArgs e)
{
try
{
FIFO[2].GetFifoState(out numPendingVal2, out numReadyVal2, out busyVal2);

if (numReadyVal2 > 0)
{
TriggerCount2++;
numReadyVal2 = 0;
Image[2] = FIFO[2].CompleteAcquire(-1, out myTicket2, out currentTrigNum2) ;
//cogRecordDisplay3.Image = FIFO[2].CompleteAcquire(-1, out myTicket2, out currentTrigNum2);
CamFlag3 = true;
if (TriggerCount2 == 4)
{
TriggerCount2 = 0;
GC.Collect();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}