(一)整体工作流程

(二)相机控制流程

(三)相机采集流程
当前
GalaxySDK
支持三种采集方式:
GetImage
、回调采集、
DQBuf
;
1. GetImage
:通过深拷贝方式获取一副图像,获取完成后,采集
buffer
会归还给采集系统继续循环获取图像;
2.
回调采集:通过注册采集回调函数的方式进行图像获取处理,回调函数执行流程中,会持续持有当前的采集的buffer
,从而可以实现零拷贝使用;
回调函数执行过程中,是无法进入下一次回调的,也就是无法获取到下一帧图像进行处理。所以在对帧率有要求的使
用场景中,并不适合在回调函数中完成太复杂的任务。一般就是进行简单的处理,或者将图像
buffer
拷贝到其他位置进行
后续处理;
3.DQBuf
:类似
GetImage
使用,并且是零拷贝的一种采集方式,可以直接获取和使用采集buffer中的图像数据,不进行任何拷贝;通过
DQBuf
获取采集
buffer
,使用完成后通过
QBuf
将该采集buffer
归还给采集系统继续循环获取图像;
注
:
1.DQBuf 采集流程(零拷贝)
1)采集流程图
2)代码示例
C语言
//-------------------------------
//GXDQBuf 接口一次获取一帧图像,本样例代码演示的就是如何用此接口获取一帧图像
//-------------------------------
#include "GxIAPI.h"
int main(int argc, char* argv[])
{
GX_STATUS emStatus = GX_STATUS_SUCCESS;
GX_DEV_HANDLE hDevice = NULL;
uint32_t ui32DeviceNum = 0;
//初始化库
emStatus = GXInitLib();
if (emStatus != GX_STATUS_SUCCESS)
{
return 0;
}
//枚举设备列表
emStatus = GXUpdateAllDeviceList(&ui32DeviceNum, 1000);
if ((emStatus != GX_STATUS_SUCCESS) || (ui32DeviceNum <= 0))
{
return 0;
}
//打开设备
GX_OPEN_PARAM stOpenParam;
stOpenParam.accessMode = GX_ACCESS_EXCLUSIVE;
stOpenParam.openMode = GX_OPEN_INDEX;
stOpenParam.pszContent = "1";
emStatus = GXOpenDevice(&stOpenParam, &hDevice);
if (emStatus == GX_STATUS_SUCCESS)
{
//定义 GXDQBuf 的传入参数
GX_FRAME_BUFFER pFrameBuffer;
//开采
#ifdef __linux__
emStatus = GXStreamOn(hDevice);
#else
emStatus = GXSetCommandValue(hDevice, "AcquisitionStart");
#endif
if (emStatus == GX_STATUS_SUCCESS)
{
//调用 GXDQBuf 取一帧图像
emStatus = GXDQBuf(hDevice, &pFrameBuffer, 1000);
if (emStatus == GX_STATUS_SUCCESS)
{
if (pFrameBuffer-> nStatus == GX_FRAME_STATUS_SUCCESS)
{
//图像获取成功
//对图像进行处理
//调用 GXQBuf 将图像 buf 放回库中继续采图
emStatus = GXQBuf(hDevice, pFrameBuffer);
}
}
//停采
#ifdef __linux__
emStatus = GXStreamOff(hDevice);
#else
emStatus = GXSetCommandValue(hDevice, "AcquisitionStop");
#endif
}
emStatus = GXCloseDevice(hDevice);
emStatus = GXCloseLib();
return 0;
}
c++
#include <iostream>
#include "stdafx.h"
#include "GalaxyIncludes.h"
using namespace std;
struct THREAD_PARAM
{
bool bRun;
CGXStreamPointer pStream;
};
// 线程函数
DWORD WINAPI GrabImgThread(LPVOID lpParam)
{
THREAD_PARAM* pThreadParam = (THREAD_PARAM*)lpParam;
if (NULL == pThreadParam)
{
cout << "lpParam is NULL!" << endl;
return 0;
}
while (pThreadParam->bRun)
{
try
{
//零拷贝采集一帧图像
CImageDataPointer pImgData = pThreadParam->pStream->DQBuf(1000);
if (GX_FRAME_STATUS_SUCCESS == pImgData->GetStatus())
{
cout << "<Successful acquisition: Width: " << pImgData->GetWidth() <<
" Height: " << pImgData->GetHeight() << " FrameID: "<< pImgData->GetFrameID() <<
">" << endl;
}
else
{
cout << "<Abnormal Acquisition: Exception code: " << pImgData->GetStatus() << ">" << endl;
}
//将采集图像buffer还回到采集系统
pThreadParam->pStream->QBuf(pImgData);
}
catch (CGalaxyException &e)
{
cout << "<" << e.GetErrorCode() << ">" << "<" << e.what() << ">" << endl;
}
catch (std::exception &e)
{
cout << "<" << e.what() << ">" << endl;
}
}
cout << "<Acquisition thread Exit!>" << endl;
return 0;
}
int main(int argc, char* argv[])
{
try
{
//初始化设备库
IGXFactory::GetInstance().Init();
//枚举相机设备
GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;
IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
//判断当前设备连接个数
if (vectorDeviceInfo.size() <= 0)
{
cout << "No device!" << endl;
return 0;
}
//通过SN打开相机设备
CGXDevicePointer pDevice = IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(), GX_ACCESS_EXCLUSIVE);
//获取相机属性控制对象
CGXFeatureControlPointer pRemoteControl = pDevice->GetRemoteFeatureControl();
//流层对象
CGXStreamPointer pStream;
if (pDevice->GetStreamCount() > 0)
{
pStream = pDevice->OpenStream(0);
}
else
{
cout << "Not find stream!";
return 0;
}
//选择默认参数组
pRemoteControl->GetEnumFeature("UserSetSelector")->SetValue("Default");
//加载参数组
pRemoteControl->GetCommandFeature("UserSetLoad")->Execute();
cout << "***********************************************" << endl;
cout << "<Vendor Name: " << pDevice->GetDeviceInfo().GetVendorName() << ">" << endl;
cout << "<Model Name: " << pDevice->GetDeviceInfo().GetModelName() << ">" << endl;
cout << "<Serial Number: " << pDevice->GetDeviceInfo().GetSN() << ">" << endl;
cout << "***********************************************" << endl << endl;
cout << "Press [a] or [A] and then press [Enter] to start acquisition" << endl;
cout << "

最低0.47元/天 解锁文章
2832

被折叠的 条评论
为什么被折叠?



