InGaAs 盖革雪崩焦平面相机采用激光脉冲飞行时间测量( TOF)方式获取目标的三维距离信息,可应用于激光制导、障碍规避、三维地形测绘等领域。它通过 Cameralink连线进行数据输出,控制命令接口是串口 RS-232。通过 DALSA 公司 Camlink 图像采集卡对 InGaAs 盖革雪崩焦平面相机进行数据采集。由于其提供的是基于MFC的是VC++的Demo,无法直接用于QT环境。下面给出基于QT的数据采集的基本实现。
SapAcquisition * CL_Acquisition = NULL;
SapBuffer * CL_Buffers = NULL;
SapTransfer * CL_Transfer = NULL;
SapLocation * pLocLft;
SapAcqToBuf * pTransferLft;
HANDLE hEvent_for_data_process; //用于数据采集事件
//初始化
Init()
{
//"Xcelera-CL_LX1_1"为相机标识。L_No_Name_0_0.ccf是配置文件,可用demo生成
CL_Acquisition = new SapAcquisition(SapLocation("Xcelera-CL_LX1_1", 0), "L_No_Name_0_0.ccf");
CL_Buffers = new SapBuffer(Counter_CacheMini, SIZE_ALL, Size_CacheMini, SapFormatMono16);
//XferCallback 为定义的因调函数
CL_Transfer = new SapAcqToBuf(CL_Acquisition, CL_Buffers, XferCallback, this);
if (!CreateObjects())
{
QMessageBox::information(NULL, "注意!", "无法建立合适的数据采集连接,请检察采集设备是否安装?程序将退出!!!");
exit(0);
}
}
//下面是CreateObjects()函数
CreateObjects()
{
// Create acquisition object
if (CL_Acquisition && !*CL_Acquisition && !CL_Acquisition->Create())
{
DestroyObjects();
return FALSE;
}
CL_Acquisition->SetParameter(CORACQ_PRM_CROP_HEIGHT, Size_CacheMini);
CL_Acquisition->SetParameter(CORACQ_PRM_SCALE_VERT, Size_CacheMini);
// Create buffer object
if (CL_Buffers && !*CL_Buffers && !CL_Buffers->Create())
{
DestroyObjects();
return FALSE;
}
else
CL_Buffers->Clear();
// Create transfer object
if (CL_Transfer && !*CL_Transfer && !CL_Transfer->Create())
{
DestroyObjects();
return FALSE;
}
return TRUE;
}
下面是DestroyObjects()函数
DestroyObjects()
{
// Destroy transfer object
if (CL_Transfer && *CL_Transfer)
CL_Transfer->Destroy();
// Destroy buffer object
if (CL_Buffers && *CL_Buffers)
CL_Buffers->Destroy();
// Destroy acquisition object
if (CL_Acquisition && *CL_Acquisition)
CL_Acquisition->Destroy();
return TRUE;
}
//回调函数
XferCallback(SapXferCallbackInfo *)
{
PulseEvent(hEvent_for_data_process); //触发一次数据处理
}
//图像数据采集及存贮线程,相机数据读入pData_Buffer中
Read_Data_Thread(void * ptr)//数据读取、保存线程
{
while (hEvent_for_data_process != NULL)
{
WaitForSingleObject(hEvent_for_data_process, INFINITE); // 等待处理指令
index_cache = CL_Buffers->GetIndex();
if (!CL_Buffers->GetAddress(index_cache, (void **)&pData_Buffer))
continue;
CL_Buffers->GetTrash();
}
}
ResetEvent(hEvent_for_data_process);
return;
}
首先初始化并获取采集卡操作对像,通过创键SapAcqToBuf对像,关连回调函数,这样一旦有数据就会自动执行回调函数,在回调函数中发出事件信息,使等待该事件的采集线程执行数据采集。执行init后,要通过控制口(即Rs232串口)进行各参数的设置,其操作就是基本的串口通信,比较简单这里就不给出相应代码了。当然采集到数据后还要进行一系列的处理,最后可在屏幕显示相应的距离像或强度像。由于代码较多,这里不再给出。